From 6e2de896c39731844a9cc04847ff949a62cb70d0 Mon Sep 17 00:00:00 2001 From: topsworld Date: Wed, 18 Dec 2024 17:42:40 +0800 Subject: [PATCH] feat: update xiaomi heater ctrl logic --- custom_components/xiaomi_home/climate.py | 36 +++++++++++++++++++ .../xiaomi_home/miot/specs/specv2entity.py | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/custom_components/xiaomi_home/climate.py b/custom_components/xiaomi_home/climate.py index ccda2b61..106abb9f 100644 --- a/custom_components/xiaomi_home/climate.py +++ b/custom_components/xiaomi_home/climate.py @@ -484,10 +484,13 @@ class Heater(MIoTServiceEntity, ClimateEntity): _prop_on: Optional[MIoTSpecProperty] _prop_mode: Optional[MIoTSpecProperty] _prop_target_temp: Optional[MIoTSpecProperty] + _prop_heat_level: Optional[MIoTSpecProperty] # service: environment _prop_env_temp: Optional[MIoTSpecProperty] _prop_env_humi: Optional[MIoTSpecProperty] + _heat_level_map: Optional[dict[int, str]] + def __init__( self, miot_device: MIoTDevice, entity_data: MIoTEntityData ) -> None: @@ -495,12 +498,15 @@ def __init__( super().__init__(miot_device=miot_device, entity_data=entity_data) self._attr_icon = 'mdi:air-conditioner' self._attr_supported_features = ClimateEntityFeature(0) + self._attr_preset_modes = [] self._prop_on = None self._prop_mode = None self._prop_target_temp = None + self._prop_heat_level = None self._prop_env_temp = None self._prop_env_humi = None + self._heat_level_map = None # properties for prop in entity_data.props: @@ -523,6 +529,21 @@ def __init__( self._attr_supported_features |= ( ClimateEntityFeature.TARGET_TEMPERATURE) self._prop_target_temp = prop + elif prop.name == 'heat-level': + if ( + not isinstance(prop.value_list, list) + or not prop.value_list + ): + _LOGGER.error( + 'invalid heat-level value_list, %s', self.entity_id) + continue + self._heat_level_map = { + item['value']: item['description'] + for item in prop.value_list} + self._attr_preset_modes = list(self._heat_level_map.values()) + self._attr_supported_features |= ( + ClimateEntityFeature.PRESET_MODE) + self._prop_heat_level = prop elif prop.name == 'temperature': self._prop_env_temp = prop elif prop.name == 'relative-humidity': @@ -557,6 +578,13 @@ async def async_set_temperature(self, **kwargs): await self.set_property_async( prop=self._prop_target_temp, value=temp) + async def async_set_preset_mode(self, preset_mode: str) -> None: + """Set the preset mode.""" + await self.set_property_async( + self._prop_heat_level, + value=self.get_map_value( + map_=self._heat_level_map, description=preset_mode)) + @property def target_temperature(self) -> Optional[float]: """Return the target temperature.""" @@ -581,3 +609,11 @@ def hvac_mode(self) -> Optional[HVACMode]: return ( HVACMode.HEAT if self.get_prop_value(prop=self._prop_on) else HVACMode.OFF) + + @property + def preset_mode(self) -> Optional[str]: + return ( + self.get_map_description( + map_=self._heat_level_map, + key=self.get_prop_value(prop=self._prop_heat_level)) + if self._prop_heat_level else None) diff --git a/custom_components/xiaomi_home/miot/specs/specv2entity.py b/custom_components/xiaomi_home/miot/specs/specv2entity.py index 084cb1a1..4a578671 100644 --- a/custom_components/xiaomi_home/miot/specs/specv2entity.py +++ b/custom_components/xiaomi_home/miot/specs/specv2entity.py @@ -220,7 +220,7 @@ } }, 'optional': { - 'properties': {'target-temperature'} + 'properties': {'target-temperature', 'heat-level'} }, } },