From 57422ddf0da49a609a931a175ccc428ac12e3a04 Mon Sep 17 00:00:00 2001 From: Li Shuzhen Date: Fri, 24 Jan 2025 10:43:49 +0800 Subject: [PATCH] fix: fan level with value-list & fan reverse (#689) * fix: fan level with value-list * feat: update wind-reverse logic * feat: use macro define for fan entity * fix: fix fan async_set_direction error --------- Co-authored-by: topsworld --- custom_components/xiaomi_home/fan.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/custom_components/xiaomi_home/fan.py b/custom_components/xiaomi_home/fan.py index 92a41f4..0f64aa8 100644 --- a/custom_components/xiaomi_home/fan.py +++ b/custom_components/xiaomi_home/fan.py @@ -52,7 +52,12 @@ import logging from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.components.fan import FanEntity, FanEntityFeature +from homeassistant.components.fan import ( + FanEntity, + FanEntityFeature, + DIRECTION_FORWARD, + DIRECTION_REVERSE +) from homeassistant.util.percentage import ( percentage_to_ranged_value, ranged_value_to_percentage, @@ -172,8 +177,9 @@ class Fan(MIoTServiceEntity, FanEntity): self._prop_wind_reverse_reverse = True elif prop.value_list: for item in prop.value_list.items: - if item.name in {'foreward'}: + if item.name in {'foreward', 'forward'}: self._prop_wind_reverse_forward = item.value + elif item.name in {'reversal', 'reverse'}: self._prop_wind_reverse_reverse = item.value if ( self._prop_wind_reverse_forward is None @@ -202,9 +208,9 @@ class Fan(MIoTServiceEntity, FanEntity): if self._speed_names: await self.set_property_async( prop=self._prop_fan_level, - value=self.get_map_value( + value=self.get_map_key( map_=self._speed_name_map, - key=percentage_to_ordered_list_item( + value=percentage_to_ordered_list_item( self._speed_names, percentage))) else: await self.set_property_async( @@ -233,9 +239,9 @@ class Fan(MIoTServiceEntity, FanEntity): if self._speed_names: await self.set_property_async( prop=self._prop_fan_level, - value=self.get_map_value( + value=self.get_map_key( map_=self._speed_name_map, - key=percentage_to_ordered_list_item( + value=percentage_to_ordered_list_item( self._speed_names, percentage))) else: await self.set_property_async( @@ -264,7 +270,7 @@ class Fan(MIoTServiceEntity, FanEntity): prop=self._prop_wind_reverse, value=( self._prop_wind_reverse_reverse - if self.current_direction == 'reverse' + if direction == DIRECTION_REVERSE else self._prop_wind_reverse_forward)) async def async_oscillate(self, oscillating: bool) -> None: @@ -293,9 +299,9 @@ class Fan(MIoTServiceEntity, FanEntity): """Return the current direction of the fan.""" if not self._prop_wind_reverse: return None - return 'reverse' if self.get_prop_value( + return DIRECTION_REVERSE if self.get_prop_value( prop=self._prop_wind_reverse - ) == self._prop_wind_reverse_reverse else 'forward' + ) == self._prop_wind_reverse_reverse else DIRECTION_FORWARD @property def percentage(self) -> Optional[int]: