Skip to content

Commit

Permalink
Revert "Revert "Fix fan modes""
Browse files Browse the repository at this point in the history
  • Loading branch information
hristo-atanasov authored Jan 4, 2025
1 parent 69706e8 commit 77a400c
Showing 1 changed file with 40 additions and 34 deletions.
74 changes: 40 additions & 34 deletions custom_components/tasmota_irhvac/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand All @@ -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/
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 77a400c

Please sign in to comment.