diff --git a/custom_components/tasmota_irhvac/climate.py b/custom_components/tasmota_irhvac/climate.py index 4a15b85..daec09b 100644 --- a/custom_components/tasmota_irhvac/climate.py +++ b/custom_components/tasmota_irhvac/climate.py @@ -546,11 +546,12 @@ def __init__( self._attr_target_temperature_step = config[CONF_TEMP_STEP] self._attr_hvac_modes = config[CONF_MODES_LIST] self._attr_fan_modes = config.get(CONF_FAN_LIST) - if ( - isinstance(self._attr_fan_modes, list) - and HVAC_FAN_MAX_HIGH in self._attr_fan_modes - and HVAC_FAN_AUTO_MAX in self._attr_fan_modes - ): + self._quirk_fan_max_high = all([ + isinstance(self._attr_fan_modes, list), + HVAC_FAN_MAX_HIGH in self._attr_fan_modes, + HVAC_FAN_AUTO_MAX in self._attr_fan_modes, + ]) + if self._quirk_fan_max_high: new_fan_list = [] for val in self._attr_fan_modes: if val == HVAC_FAN_MAX_HIGH: @@ -560,6 +561,9 @@ def __init__( else: new_fan_list.append(val) self._attr_fan_modes = new_fan_list if len(new_fan_list) else None + self._quirk_fan_prettify = all(mode not in (self._attr_fan_modes or []) for mode in [FAN_LOW, FAN_HIGH]) + if self._quirk_fan_prettify and self._attr_fan_modes: + self._attr_fan_modes = [self.fan_prettify(mode) for mode in self._attr_fan_modes] self._attr_fan_mode = ( self._attr_fan_modes[0] if isinstance(self._attr_fan_modes, list) and len(self._attr_fan_modes) @@ -585,6 +589,24 @@ def __init__( if self._attr_swing_mode is not None: self._support_flags = self._support_flags | ClimateEntityFeature.SWING_MODE + def fan_prettify(self, mode): + if not self._quirk_fan_prettify: + return mode + if mode == HVAC_FAN_MIN: + return FAN_LOW + if mode == HVAC_FAN_MAX: + return FAN_HIGH + return mode + + def fan_unprettify(self, mode): + if not self._quirk_fan_prettify: + return mode + if mode == FAN_LOW: + return HVAC_FAN_MIN + if mode == FAN_HIGH: + return HVAC_FAN_MAX + return mode + async def async_added_to_hass(self): # Replacing `async_track_state_change` with `async_track_state_change_event` # See, https://developers.home-assistant.io/blog/2024/04/13/deprecate_async_track_state_change/ @@ -792,17 +814,15 @@ async def state_message_received(message: mqtt.ReceiveMessage) -> None: if "FanSpeed" in payload: fan_mode = payload["FanSpeed"].lower() # ELECTRA_AC fan modes fix - if HVAC_FAN_MAX_HIGH in ( - self._attr_fan_modes or [] - ) and HVAC_FAN_AUTO_MAX in (self._attr_fan_modes or []): + if self._quirk_fan_max_high: if fan_mode == HVAC_FAN_MAX: self._attr_fan_mode = FAN_HIGH elif fan_mode == HVAC_FAN_AUTO: self._attr_fan_mode = HVAC_FAN_MAX else: - self._attr_fan_mode = fan_mode + self._attr_fan_mode = self.fan_prettify(fan_mode) else: - self._attr_fan_mode = fan_mode + self._attr_fan_mode = self.fan_prettify(fan_mode) _LOGGER.debug(self._attr_fan_mode) if self._attr_hvac_mode is not HVACMode.OFF: @@ -933,24 +953,12 @@ async def async_set_temperature(self, **kwargs): async def async_set_fan_mode(self, fan_mode): """Set new target fan mode.""" if fan_mode not in (self._attr_fan_modes or []): - # tweak for some ELECTRA_AC devices - if HVAC_FAN_MAX_HIGH in ( - self._attr_fan_modes or [] - ) and HVAC_FAN_AUTO_MAX in (self._attr_fan_modes or []): - if fan_mode != FAN_HIGH and fan_mode != HVAC_FAN_MAX: - _LOGGER.error( - "Invalid swing mode selected. Got '%s'. Allowed modes are:", - fan_mode, - ) - _LOGGER.error(self._attr_fan_modes) - return - else: - _LOGGER.error( - "Invalid swing mode selected. Got '%s'. Allowed modes are:", - fan_mode, - ) - _LOGGER.error(self._attr_fan_modes) - return + _LOGGER.error( + "Invalid fan mode selected. Got '%s'. Allowed modes are:", + fan_mode, + ) + _LOGGER.error(self._attr_fan_modes) + return self._attr_fan_mode = fan_mode if not self._attr_hvac_mode == HVACMode.OFF: self.power_mode = STATE_ON @@ -1193,14 +1201,12 @@ async def set_mode(self, hvac_mode): async def send_ir(self): """Send the payload to tasmota mqtt topic.""" - fan_speed = self.fan_mode + fan_speed = self.fan_unprettify(self._attr_fan_mode) # tweak for some ELECTRA_AC devices - if HVAC_FAN_MAX_HIGH in (self._attr_fan_modes or []) and HVAC_FAN_AUTO_MAX in ( - self._attr_fan_modes or [] - ): - if self.fan_mode == FAN_HIGH: + if self._quirk_fan_max_high: + if fan_speed == FAN_HIGH: fan_speed = HVAC_FAN_MAX - if self.fan_mode == HVAC_FAN_MAX: + elif fan_speed == HVAC_FAN_MAX: fan_speed = HVAC_FAN_AUTO # Set the swing mode - default off