Fix SmartThings thermostat climate check (#140046)

* Fix SmartThings thermostat climate check

* Add tests
This commit is contained in:
Joost Lekkerkerker 2025-03-07 14:56:31 +01:00 committed by GitHub
parent eadff2938f
commit 62e45e393d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 394 additions and 3 deletions

View File

@ -164,9 +164,7 @@ class SmartThingsThermostat(SmartThingsEntity, ClimateEntity):
| ClimateEntityFeature.TURN_OFF
| ClimateEntityFeature.TURN_ON
)
if self.get_attribute_value(
Capability.THERMOSTAT_FAN_MODE, Attribute.THERMOSTAT_FAN_MODE
):
if self.supports_capability(Capability.THERMOSTAT_FAN_MODE):
flags |= ClimateEntityFeature.FAN_MODE
return flags

View File

@ -121,6 +121,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
"ecobee_thermostat",
"fake_fan",
"generic_fan_3_speed",
"heatit_ztrm3_thermostat",
]
)
def device_fixture(

View File

@ -0,0 +1,60 @@
{
"components": {
"main": {
"powerMeter": {
"power": {
"value": 368.17,
"unit": "W",
"timestamp": "2025-03-07T12:52:08.997Z"
}
},
"thermostatOperatingState": {
"thermostatOperatingState": {
"value": "heating",
"timestamp": "2025-03-07T12:49:53.638Z"
}
},
"energyMeter": {
"energy": {
"value": 2339.5,
"unit": "kWh",
"timestamp": "2025-03-07T12:26:37.133Z"
}
},
"temperatureMeasurement": {
"temperatureRange": {
"value": null
},
"temperature": {
"value": 19.0,
"unit": "C",
"timestamp": "2025-03-07T12:52:39.210Z"
}
},
"thermostatHeatingSetpoint": {
"heatingSetpoint": {
"value": 19.0,
"unit": "C",
"timestamp": "2025-03-06T21:38:22.856Z"
},
"heatingSetpointRange": {
"value": null
}
},
"refresh": {},
"thermostatMode": {
"thermostatMode": {
"value": "heat",
"data": {
"supportedThermostatModes": ["off", "heat"]
},
"timestamp": "2025-03-06T21:38:23.046Z"
},
"supportedThermostatModes": {
"value": ["off", "heat"],
"timestamp": "2023-09-22T15:41:01.268Z"
}
}
}
}
}

View File

@ -0,0 +1,79 @@
{
"items": [
{
"deviceId": "69a271f6-6537-4982-8cd9-979866872692",
"name": "heatit-ztrm3-thermostat",
"label": "Hall thermostat",
"manufacturerName": "SmartThingsCommunity",
"presentationId": "8c5c0adc-73d6-33db-a1bd-67d746ab0e00",
"deviceManufacturerCode": "019B-0003-0203",
"locationId": "6cf6637b-9bc5-4e52-bc99-7497e322fb0d",
"ownerId": "7b68139b-d068-45d8-bf27-961320350024",
"roomId": "746b4d54-8026-44f1-b50f-8833dafdeea3",
"components": [
{
"id": "main",
"label": "main",
"capabilities": [
{
"id": "temperatureMeasurement",
"version": 1
},
{
"id": "thermostatHeatingSetpoint",
"version": 1
},
{
"id": "thermostatOperatingState",
"version": 1
},
{
"id": "thermostatMode",
"version": 1
},
{
"id": "powerMeter",
"version": 1
},
{
"id": "energyMeter",
"version": 1
},
{
"id": "refresh",
"version": 1
}
],
"categories": [
{
"name": "Thermostat",
"categoryType": "manufacturer"
}
]
}
],
"createTime": "2023-09-22T15:40:58.942Z",
"parentDeviceId": "d04f5ba0-1430-4826-9aa4-fba4efb57c24",
"profile": {
"id": "2677e0e8-9241-3163-815e-6b1d6743f280"
},
"zwave": {
"networkId": "28",
"driverId": "28198799-de20-4cfd-a9f3-67860a0877d5",
"executingLocally": true,
"hubId": "d04f5ba0-1430-4826-9aa4-fba4efb57c24",
"networkSecurityLevel": "ZWAVE_S2_AUTHENTICATED",
"provisioningState": "PROVISIONED",
"manufacturerId": 411,
"productType": 3,
"productId": 515
},
"type": "ZWAVE",
"restrictionTier": 0,
"allowed": null,
"executionContext": "LOCAL",
"relationships": []
}
],
"_links": {}
}

View File

@ -369,6 +369,70 @@
'state': 'heat',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][climate.hall_thermostat-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'hvac_modes': list([
<HVACMode.HEAT: 'heat'>,
]),
'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.hall_thermostat',
'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: 387>,
'translation_key': None,
'unique_id': '69a271f6-6537-4982-8cd9-979866872692',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][climate.hall_thermostat-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'current_temperature': 19.0,
'friendly_name': 'Hall thermostat',
'hvac_action': <HVACAction.HEATING: 'heating'>,
'hvac_modes': list([
<HVACMode.HEAT: 'heat'>,
]),
'max_temp': 35,
'min_temp': 7,
'supported_features': <ClimateEntityFeature: 387>,
'target_temp_high': None,
'target_temp_low': None,
'temperature': 19.0,
}),
'context': <ANY>,
'entity_id': 'climate.hall_thermostat',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'heat',
})
# ---
# name: test_all_entities[virtual_thermostat][climate.asd-entry]
EntityRegistryEntrySnapshot({
'aliases': set({

View File

@ -692,6 +692,39 @@
'via_device_id': None,
})
# ---
# name: test_devices[heatit_ztrm3_thermostat]
DeviceRegistryEntrySnapshot({
'area_id': None,
'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',
'69a271f6-6537-4982-8cd9-979866872692',
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': None,
'model_id': None,
'name': 'Hall thermostat',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'suggested_area': None,
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_devices[hue_color_temperature_bulb]
DeviceRegistryEntrySnapshot({
'area_id': None,

View File

@ -4524,6 +4524,162 @@
'state': '22',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
}),
'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.hall_thermostat_energy',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENERGY: 'energy'>,
'original_icon': None,
'original_name': 'Energy',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '69a271f6-6537-4982-8cd9-979866872692.energy',
'unit_of_measurement': 'kWh',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_energy-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'energy',
'friendly_name': 'Hall thermostat Energy',
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
'unit_of_measurement': 'kWh',
}),
'context': <ANY>,
'entity_id': 'sensor.hall_thermostat_energy',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2339.5',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_power-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.hall_thermostat_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Power',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '69a271f6-6537-4982-8cd9-979866872692.power',
'unit_of_measurement': 'W',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_power-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Hall thermostat Power',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'W',
}),
'context': <ANY>,
'entity_id': 'sensor.hall_thermostat_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '368.17',
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_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.hall_thermostat_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': '69a271f6-6537-4982-8cd9-979866872692.temperature',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_all_entities[heatit_ztrm3_thermostat][sensor.hall_thermostat_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Hall thermostat Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.hall_thermostat_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '19.0',
})
# ---
# name: test_all_entities[multipurpose_sensor][sensor.deck_door_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({