Skip to content
Snippets Groups Projects
Unverified Commit 485da61d authored by Ishima's avatar Ishima Committed by GitHub
Browse files

Check support for demand load control in SmartThings AC (#139616)


* Check support for demand load control in SmartThings AC

* Fix

---------

Co-authored-by: default avatarJoostlek <joostlek@outlook.com>
parent 5d7b60e4
No related branches found
No related tags found
No related merge requests found
...@@ -451,12 +451,15 @@ class SmartThingsAirConditioner(SmartThingsEntity, ClimateEntity): ...@@ -451,12 +451,15 @@ class SmartThingsAirConditioner(SmartThingsEntity, ClimateEntity):
) )
@property @property
def extra_state_attributes(self) -> dict[str, Any]: def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return device specific state attributes. """Return device specific state attributes.
Include attributes from the Demand Response Load Control (drlc) Include attributes from the Demand Response Load Control (drlc)
and Power Consumption capabilities. and Power Consumption capabilities.
""" """
if not self.supports_capability(Capability.DEMAND_RESPONSE_LOAD_CONTROL):
return None
drlc_status = self.get_attribute_value( drlc_status = self.get_attribute_value(
Capability.DEMAND_RESPONSE_LOAD_CONTROL, Capability.DEMAND_RESPONSE_LOAD_CONTROL,
Attribute.DEMAND_RESPONSE_LOAD_CONTROL_STATUS, Attribute.DEMAND_RESPONSE_LOAD_CONTROL_STATUS,
......
...@@ -88,6 +88,7 @@ def mock_smartthings() -> Generator[AsyncMock]: ...@@ -88,6 +88,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
@pytest.fixture( @pytest.fixture(
params=[ params=[
"da_ac_rac_000001", "da_ac_rac_000001",
"da_ac_rac_100001",
"da_ac_rac_01001", "da_ac_rac_01001",
"multipurpose_sensor", "multipurpose_sensor",
"contact_sensor", "contact_sensor",
......
{
"components": {
"main": {
"refresh": {},
"custom.thermostatSetpointControl": {
"minimumSetpoint": {
"value": 16,
"timestamp": "2024-11-25T22:17:38.251Z"
},
"maximumSetpoint": {
"value": 30,
"timestamp": "2024-11-25T22:17:38.251Z"
}
},
"airConditionerMode": {
"availableAcModes": {
"value": null
},
"supportedAcModes": {
"value": ["cool", "dry", "wind", "auto"],
"timestamp": "2025-03-02T10:16:19.519Z"
},
"airConditionerMode": {
"value": "cool",
"timestamp": "2025-03-02T10:16:19.519Z"
}
},
"execute": {
"data": {
"value": null
}
},
"airQualitySensor": {
"airQuality": {
"value": null
}
},
"switch": {
"switch": {
"value": "off",
"timestamp": "2025-03-02T06:54:52.852Z"
}
},
"ocf": {
"st": {
"value": null
},
"mndt": {
"value": null
},
"mnfv": {
"value": null
},
"mnhw": {
"value": null
},
"di": {
"value": "F8042E25-0E53-0000-0000-000000000000",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"mnsl": {
"value": null
},
"dmv": {
"value": "res.1.1.0,sh.1.1.0",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"n": {
"value": "Room A/C",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"mnmo": {
"value": "TP6X_RAC_15K",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"vid": {
"value": "DA-AC-RAC-100001",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"mnmn": {
"value": "Samsung Electronics",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"mnml": {
"value": null
},
"mnpv": {
"value": null
},
"mnos": {
"value": null
},
"pi": {
"value": "shp",
"timestamp": "2025-02-28T21:15:28.920Z"
},
"icv": {
"value": "core.1.1.0",
"timestamp": "2025-02-28T21:15:28.920Z"
}
},
"odorSensor": {
"odorLevel": {
"value": null
}
},
"airConditionerFanMode": {
"fanMode": {
"value": "auto",
"timestamp": "2025-02-28T21:15:28.941Z"
},
"supportedAcFanModes": {
"value": ["auto", "low", "medium", "high", "turbo"],
"timestamp": "2025-02-28T21:15:28.941Z"
},
"availableAcFanModes": {
"value": null
}
},
"samsungce.driverState": {
"driverState": {
"value": null
}
},
"custom.disabledCapabilities": {
"disabledCapabilities": {
"value": ["odorSensor"],
"timestamp": "2024-11-25T22:17:38.251Z"
}
},
"samsungce.driverVersion": {
"versionNumber": {
"value": 22090101,
"timestamp": "2024-11-25T22:17:38.251Z"
}
},
"temperatureMeasurement": {
"temperatureRange": {
"value": null
},
"temperature": {
"value": 27,
"unit": "C",
"timestamp": "2025-03-02T08:28:39.409Z"
}
},
"dustSensor": {
"dustLevel": {
"value": null
},
"fineDustLevel": {
"value": null
}
},
"thermostatCoolingSetpoint": {
"coolingSetpointRange": {
"value": null
},
"coolingSetpoint": {
"value": 18,
"unit": "C",
"timestamp": "2025-03-02T06:54:23.887Z"
}
}
}
}
}
{
"items": [
{
"deviceId": "F8042E25-0E53-0000-0000-000000000000",
"name": "Room A/C",
"label": "Corridor A/C",
"manufacturerName": "Samsung Electronics",
"presentationId": "DA-AC-RAC-100001",
"deviceManufacturerCode": "Samsung Electronics",
"locationId": "5df0730b-38ed-43e4-b291-ec14feb3224c",
"ownerId": "63b9c79b-90fe-5262-9a6a-5e24db90915e",
"roomId": "7715151d-0314-457a-a82c-5ce48900e065",
"deviceTypeName": "Samsung OCF Air Conditioner",
"components": [
{
"id": "main",
"label": "main",
"capabilities": [
{
"id": "ocf",
"version": 1
},
{
"id": "switch",
"version": 1
},
{
"id": "airConditionerMode",
"version": 1
},
{
"id": "airConditionerFanMode",
"version": 1
},
{
"id": "temperatureMeasurement",
"version": 1
},
{
"id": "thermostatCoolingSetpoint",
"version": 1
},
{
"id": "airQualitySensor",
"version": 1
},
{
"id": "dustSensor",
"version": 1
},
{
"id": "odorSensor",
"version": 1
},
{
"id": "refresh",
"version": 1
},
{
"id": "execute",
"version": 1
},
{
"id": "samsungce.driverVersion",
"version": 1
},
{
"id": "samsungce.driverState",
"version": 1
},
{
"id": "custom.thermostatSetpointControl",
"version": 1
},
{
"id": "custom.disabledCapabilities",
"version": 1
}
],
"categories": [
{
"name": "AirConditioner",
"categoryType": "manufacturer"
}
]
}
],
"createTime": "2024-11-25T22:17:38.129Z",
"profile": {
"id": "9e3e03b1-7f8c-3ea2-8568-6902b79b99dd"
},
"ocf": {
"ocfDeviceType": "oic.d.airconditioner",
"name": "Room A/C",
"specVersion": "core.1.1.0",
"verticalDomainSpecVersion": "res.1.1.0,sh.1.1.0",
"manufacturerName": "Samsung Electronics",
"modelNumber": "TP6X_RAC_15K",
"vendorId": "DA-AC-RAC-100001",
"lastSignupTime": "2024-11-25T22:17:37.928118320Z",
"transferCandidate": false,
"additionalAuthCodeRequired": false
},
"type": "OCF",
"restrictionTier": 0,
"allowed": [],
"executionContext": "CLOUD",
"relationships": []
}
],
"_links": {}
}
...@@ -209,6 +209,90 @@ ...@@ -209,6 +209,90 @@
'state': 'off', 'state': 'off',
}) })
# --- # ---
# name: test_all_entities[da_ac_rac_100001][climate.corridor_a_c-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'fan_modes': list([
'auto',
'low',
'medium',
'high',
'turbo',
]),
'hvac_modes': list([
<HVACMode.OFF: 'off'>,
<HVACMode.COOL: 'cool'>,
<HVACMode.DRY: 'dry'>,
<HVACMode.FAN_ONLY: 'fan_only'>,
<HVACMode.HEAT_COOL: 'heat_cool'>,
]),
'max_temp': 35,
'min_temp': 7,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'climate',
'entity_category': None,
'entity_id': 'climate.corridor_a_c',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': None,
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': <ClimateEntityFeature: 393>,
'translation_key': None,
'unique_id': 'F8042E25-0E53-0000-0000-000000000000',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_ac_rac_100001][climate.corridor_a_c-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'current_temperature': 27,
'fan_mode': 'auto',
'fan_modes': list([
'auto',
'low',
'medium',
'high',
'turbo',
]),
'friendly_name': 'Corridor A/C',
'hvac_modes': list([
<HVACMode.OFF: 'off'>,
<HVACMode.COOL: 'cool'>,
<HVACMode.DRY: 'dry'>,
<HVACMode.FAN_ONLY: 'fan_only'>,
<HVACMode.HEAT_COOL: 'heat_cool'>,
]),
'max_temp': 35,
'min_temp': 7,
'supported_features': <ClimateEntityFeature: 393>,
'temperature': 18,
}),
'context': <ANY>,
'entity_id': 'climate.corridor_a_c',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_all_entities[ecobee_thermostat][climate.main_floor-entry] # name: test_all_entities[ecobee_thermostat][climate.main_floor-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
......
...@@ -263,6 +263,39 @@ ...@@ -263,6 +263,39 @@
'via_device_id': None, 'via_device_id': None,
}) })
# --- # ---
# name: test_devices[da_ac_rac_100001]
DeviceRegistryEntrySnapshot({
'area_id': 'theater',
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': 'https://account.smartthings.com',
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'smartthings',
'F8042E25-0E53-0000-0000-000000000000',
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Samsung Electronics',
'model': 'TP6X_RAC_15K',
'model_id': None,
'name': 'Corridor A/C',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'suggested_area': 'Theater',
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_devices[da_ks_microwave_0101x] # name: test_devices[da_ks_microwave_0101x]
DeviceRegistryEntrySnapshot({ DeviceRegistryEntrySnapshot({
'area_id': 'theater', 'area_id': 'theater',
......
...@@ -1379,6 +1379,213 @@ ...@@ -1379,6 +1379,213 @@
'state': '0', 'state': '0',
}) })
# --- # ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_air_quality-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.corridor_a_c_air_quality',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Air quality',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'air_quality',
'unique_id': 'F8042E25-0E53-0000-0000-000000000000.airQuality',
'unit_of_measurement': 'CAQI',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_air_quality-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Corridor A/C Air quality',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'CAQI',
}),
'context': <ANY>,
'entity_id': 'sensor.corridor_a_c_air_quality',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_pm10-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.corridor_a_c_pm10',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.PM10: 'pm10'>,
'original_icon': None,
'original_name': 'PM10',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'F8042E25-0E53-0000-0000-000000000000.dustLevel',
'unit_of_measurement': 'µg/m³',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_pm10-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'pm10',
'friendly_name': 'Corridor A/C PM10',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'µg/m³',
}),
'context': <ANY>,
'entity_id': 'sensor.corridor_a_c_pm10',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_pm2_5-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.corridor_a_c_pm2_5',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.PM25: 'pm25'>,
'original_icon': None,
'original_name': 'PM2.5',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'F8042E25-0E53-0000-0000-000000000000.fineDustLevel',
'unit_of_measurement': 'µg/m³',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_pm2_5-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'pm25',
'friendly_name': 'Corridor A/C PM2.5',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'µg/m³',
}),
'context': <ANY>,
'entity_id': 'sensor.corridor_a_c_pm2_5',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.corridor_a_c_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Temperature',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'F8042E25-0E53-0000-0000-000000000000.temperature',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_all_entities[da_ac_rac_100001][sensor.corridor_a_c_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Corridor A/C Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.corridor_a_c_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '27',
})
# ---
# name: test_all_entities[da_ks_microwave_0101x][sensor.microwave_completion_time-entry] # name: test_all_entities[da_ks_microwave_0101x][sensor.microwave_completion_time-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment