diff --git a/homeassistant/components/airzone_cloud/climate.py b/homeassistant/components/airzone_cloud/climate.py index 277bafba498e45e438bd069df8ea8b7f49cc4b52..80f8af36a1531ba9fce4c9f0713e1321f1b8fca7 100644 --- a/homeassistant/components/airzone_cloud/climate.py +++ b/homeassistant/components/airzone_cloud/climate.py @@ -193,6 +193,12 @@ class AirzoneClimate(AirzoneEntity, ClimateEntity): ClimateEntityFeature.TARGET_TEMPERATURE_RANGE ) + if ( + self.get_airzone_value(AZD_SPEED) is not None + and self.get_airzone_value(AZD_SPEEDS) is not None + ): + self._initialize_fan_speeds() + @callback def _handle_coordinator_update(self) -> None: """Update attributes when the coordinator updates.""" @@ -207,6 +213,8 @@ class AirzoneClimate(AirzoneEntity, ClimateEntity): self._attr_hvac_action = HVAC_ACTION_LIB_TO_HASS[ self.get_airzone_value(AZD_ACTION) ] + if self.supported_features & ClimateEntityFeature.FAN_MODE: + self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED)) if self.get_airzone_value(AZD_POWER): self._attr_hvac_mode = HVAC_MODE_LIB_TO_HASS[ self.get_airzone_value(AZD_MODE) @@ -234,6 +242,37 @@ class AirzoneDeviceClimate(AirzoneClimate): | ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON ) + _speeds: dict[int, str] + _speeds_reverse: dict[str, int] + + def _initialize_fan_speeds(self) -> None: + """Initialize fan speeds.""" + azd_speeds: dict[int, int] = self.get_airzone_value(AZD_SPEEDS) + max_speed = max(azd_speeds) + + fan_speeds: dict[int, str] + if speeds_map := FAN_SPEED_MAPS.get(max_speed): + fan_speeds = speeds_map + else: + fan_speeds = {} + + for speed in azd_speeds: + if speed != 0: + fan_speeds[speed] = f"{int(round((speed * 100) / max_speed, 0))}%" + + if 0 in azd_speeds: + fan_speeds = FAN_SPEED_AUTO | fan_speeds + + self._speeds = {} + for key, value in fan_speeds.items(): + _key = azd_speeds.get(key) + if _key is not None: + self._speeds[_key] = value + + self._speeds_reverse = {v: k for k, v in self._speeds.items()} + self._attr_fan_modes = list(self._speeds_reverse) + + self._attr_supported_features |= ClimateEntityFeature.FAN_MODE async def async_turn_on(self) -> None: """Turn the entity on.""" @@ -253,6 +292,15 @@ class AirzoneDeviceClimate(AirzoneClimate): } await self._async_update_params(params) + async def async_set_fan_mode(self, fan_mode: str) -> None: + """Set new fan mode.""" + params: dict[str, Any] = { + API_SPEED_CONF: { + API_VALUE: self._speeds_reverse.get(fan_mode), + } + } + await self._async_update_params(params) + async def async_set_temperature(self, **kwargs: Any) -> None: """Set new target temperature.""" params: dict[str, Any] = {} @@ -341,9 +389,6 @@ class AirzoneDeviceGroupClimate(AirzoneClimate): class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate): """Define an Airzone Cloud Aidoo climate.""" - _speeds: dict[int, str] - _speeds_reverse: dict[str, int] - def __init__( self, coordinator: AirzoneUpdateCoordinator, @@ -355,52 +400,9 @@ class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate): self._attr_unique_id = aidoo_id self._init_attributes() - if ( - self.get_airzone_value(AZD_SPEED) is not None - and self.get_airzone_value(AZD_SPEEDS) is not None - ): - self._initialize_fan_speeds() self._async_update_attrs() - def _initialize_fan_speeds(self) -> None: - """Initialize Aidoo fan speeds.""" - azd_speeds: dict[int, int] = self.get_airzone_value(AZD_SPEEDS) - max_speed = max(azd_speeds) - - fan_speeds: dict[int, str] - if speeds_map := FAN_SPEED_MAPS.get(max_speed): - fan_speeds = speeds_map - else: - fan_speeds = {} - - for speed in azd_speeds: - if speed != 0: - fan_speeds[speed] = f"{int(round((speed * 100) / max_speed, 0))}%" - - if 0 in azd_speeds: - fan_speeds = FAN_SPEED_AUTO | fan_speeds - - self._speeds = {} - for key, value in fan_speeds.items(): - _key = azd_speeds.get(key) - if _key is not None: - self._speeds[_key] = value - - self._speeds_reverse = {v: k for k, v in self._speeds.items()} - self._attr_fan_modes = list(self._speeds_reverse) - - self._attr_supported_features |= ClimateEntityFeature.FAN_MODE - - async def async_set_fan_mode(self, fan_mode: str) -> None: - """Set Aidoo fan mode.""" - params: dict[str, Any] = { - API_SPEED_CONF: { - API_VALUE: self._speeds_reverse.get(fan_mode), - } - } - await self._async_update_params(params) - async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set hvac mode.""" params: dict[str, Any] = {} @@ -418,14 +420,6 @@ class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate): } await self._async_update_params(params) - @callback - def _async_update_attrs(self) -> None: - """Update Aidoo climate attributes.""" - super()._async_update_attrs() - - if self.supported_features & ClimateEntityFeature.FAN_MODE: - self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED)) - class AirzoneGroupClimate(AirzoneGroupEntity, AirzoneDeviceGroupClimate): """Define an Airzone Cloud Group climate.""" diff --git a/homeassistant/components/airzone_cloud/manifest.json b/homeassistant/components/airzone_cloud/manifest.json index 366f8214bc1c3ebe3b96892265f1c39a88b9cb58..ca024d0e1a3f4debc3dc42e4b18266da909b70ae 100644 --- a/homeassistant/components/airzone_cloud/manifest.json +++ b/homeassistant/components/airzone_cloud/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/airzone_cloud", "iot_class": "cloud_push", "loggers": ["aioairzone_cloud"], - "requirements": ["aioairzone-cloud==0.5.1"] + "requirements": ["aioairzone-cloud==0.5.2"] } diff --git a/requirements_all.txt b/requirements_all.txt index 367fe4de0f45d41f03d077b35039372212be696c..94e824342b33c549646b3b677651b250f13f30f2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -179,7 +179,7 @@ aio-georss-gdacs==0.9 aioairq==0.3.2 # homeassistant.components.airzone_cloud -aioairzone-cloud==0.5.1 +aioairzone-cloud==0.5.2 # homeassistant.components.airzone aioairzone==0.7.6 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 21b41dc1c28f5e31c22c6acc21af03e8494a562a..005cd2ae77c8ebc438176e015161eb24d4e73e02 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -158,7 +158,7 @@ aio-georss-gdacs==0.9 aioairq==0.3.2 # homeassistant.components.airzone_cloud -aioairzone-cloud==0.5.1 +aioairzone-cloud==0.5.2 # homeassistant.components.airzone aioairzone==0.7.6