Compare commits

...

3 Commits

Author SHA1 Message Date
LiShuzhen
fbdda23715 feat: add heat and defog mode of ptc bath heater 2025-02-08 17:41:51 +08:00
LiShuzhen
5e41c48f64 Merge branch 'main' into refactor-climate 2025-02-08 16:43:45 +08:00
Li Shuzhen
57422ddf0d
fix: fan level with value-list & fan reverse (#689)
Some checks failed
Tests / check-rule-format (push) Has been cancelled
Validate / validate-hassfest (push) Has been cancelled
Validate / validate-hacs (push) Has been cancelled
Validate / validate-lint (push) Has been cancelled
Validate / validate-setup (push) Has been cancelled
* 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 <sworldtop@gmail.com>
2025-01-24 10:43:49 +08:00
2 changed files with 23 additions and 11 deletions

View File

@ -616,14 +616,20 @@ class PtcBathHeater(FeatureTargetTemperature, FeatureTemperature,
continue continue
self._hvac_mode_map = {} self._hvac_mode_map = {}
for item in prop.value_list.items: for item in prop.value_list.items:
if item.name in {'off', 'idle'}: if item.name in {'off', 'idle'
} and (HVACMode.OFF not in list(
self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.OFF self._hvac_mode_map[item.value] = HVACMode.OFF
elif item.name in {'auto'}: elif item.name in {'auto'}:
self._hvac_mode_map[item.value] = HVACMode.AUTO self._hvac_mode_map[item.value] = HVACMode.AUTO
elif item.name in {'ventilate'}: elif item.name in {'ventilate'}:
self._hvac_mode_map[item.value] = HVACMode.COOL self._hvac_mode_map[item.value] = HVACMode.COOL
elif item.name in {'heat'}: elif item.name in {'heat', 'quick_heat'
} and (HVACMode.HEAT not in list(
self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.HEAT self._hvac_mode_map[item.value] = HVACMode.HEAT
elif item.name in {'defog'}:
self._hvac_mode_map[item.value] = HVACMode.HEAT_COOL
elif item.name in {'dry'}: elif item.name in {'dry'}:
self._hvac_mode_map[item.value] = HVACMode.DRY self._hvac_mode_map[item.value] = HVACMode.DRY
elif item.name in {'fan'}: elif item.name in {'fan'}:

View File

@ -52,7 +52,12 @@ import logging
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback 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 ( from homeassistant.util.percentage import (
percentage_to_ranged_value, percentage_to_ranged_value,
ranged_value_to_percentage, ranged_value_to_percentage,
@ -172,8 +177,9 @@ class Fan(MIoTServiceEntity, FanEntity):
self._prop_wind_reverse_reverse = True self._prop_wind_reverse_reverse = True
elif prop.value_list: elif prop.value_list:
for item in prop.value_list.items: 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 self._prop_wind_reverse_forward = item.value
elif item.name in {'reversal', 'reverse'}:
self._prop_wind_reverse_reverse = item.value self._prop_wind_reverse_reverse = item.value
if ( if (
self._prop_wind_reverse_forward is None self._prop_wind_reverse_forward is None
@ -202,9 +208,9 @@ class Fan(MIoTServiceEntity, FanEntity):
if self._speed_names: if self._speed_names:
await self.set_property_async( await self.set_property_async(
prop=self._prop_fan_level, prop=self._prop_fan_level,
value=self.get_map_value( value=self.get_map_key(
map_=self._speed_name_map, map_=self._speed_name_map,
key=percentage_to_ordered_list_item( value=percentage_to_ordered_list_item(
self._speed_names, percentage))) self._speed_names, percentage)))
else: else:
await self.set_property_async( await self.set_property_async(
@ -233,9 +239,9 @@ class Fan(MIoTServiceEntity, FanEntity):
if self._speed_names: if self._speed_names:
await self.set_property_async( await self.set_property_async(
prop=self._prop_fan_level, prop=self._prop_fan_level,
value=self.get_map_value( value=self.get_map_key(
map_=self._speed_name_map, map_=self._speed_name_map,
key=percentage_to_ordered_list_item( value=percentage_to_ordered_list_item(
self._speed_names, percentage))) self._speed_names, percentage)))
else: else:
await self.set_property_async( await self.set_property_async(
@ -264,7 +270,7 @@ class Fan(MIoTServiceEntity, FanEntity):
prop=self._prop_wind_reverse, prop=self._prop_wind_reverse,
value=( value=(
self._prop_wind_reverse_reverse self._prop_wind_reverse_reverse
if self.current_direction == 'reverse' if direction == DIRECTION_REVERSE
else self._prop_wind_reverse_forward)) else self._prop_wind_reverse_forward))
async def async_oscillate(self, oscillating: bool) -> None: async def async_oscillate(self, oscillating: bool) -> None:
@ -293,9 +299,9 @@ class Fan(MIoTServiceEntity, FanEntity):
"""Return the current direction of the fan.""" """Return the current direction of the fan."""
if not self._prop_wind_reverse: if not self._prop_wind_reverse:
return None return None
return 'reverse' if self.get_prop_value( return DIRECTION_REVERSE if self.get_prop_value(
prop=self._prop_wind_reverse prop=self._prop_wind_reverse
) == self._prop_wind_reverse_reverse else 'forward' ) == self._prop_wind_reverse_reverse else DIRECTION_FORWARD
@property @property
def percentage(self) -> Optional[int]: def percentage(self) -> Optional[int]: