Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix fan modes #154

Merged
merged 4 commits into from
Jan 4, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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