From fbfce5153653bc7c92709853277f02fc38af5433 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 26 Apr 2022 09:28:58 +0200 Subject: [PATCH] Use climate enums in izone (#70674) --- homeassistant/components/izone/climate.py | 77 ++++++++++------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/homeassistant/components/izone/climate.py b/homeassistant/components/izone/climate.py index 3ae835b2495..419e1709b45 100644 --- a/homeassistant/components/izone/climate.py +++ b/homeassistant/components/izone/climate.py @@ -6,21 +6,17 @@ import logging from pizone import Controller, Zone import voluptuous as vol -from homeassistant.components.climate import ClimateEntity, ClimateEntityFeature +from homeassistant.components.climate import ClimateEntity from homeassistant.components.climate.const import ( FAN_AUTO, FAN_HIGH, FAN_LOW, FAN_MEDIUM, FAN_TOP, - HVAC_MODE_COOL, - HVAC_MODE_DRY, - HVAC_MODE_FAN_ONLY, - HVAC_MODE_HEAT, - HVAC_MODE_HEAT_COOL, - HVAC_MODE_OFF, PRESET_ECO, PRESET_NONE, + ClimateEntityFeature, + HVACMode, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -136,24 +132,24 @@ class ControllerDevice(ClimateEntity): """Initialise ControllerDevice.""" self._controller = controller - self._supported_features = ClimateEntityFeature.FAN_MODE + self._attr_supported_features = ClimateEntityFeature.FAN_MODE # If mode RAS, or mode master with CtrlZone 13 then can set master temperature, # otherwise the unit determines which zone to use as target. See interface manual p. 8 if ( controller.ras_mode == "master" and controller.zone_ctrl == 13 ) or controller.ras_mode == "RAS": - self._supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE + self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE self._state_to_pizone = { - HVAC_MODE_COOL: Controller.Mode.COOL, - HVAC_MODE_HEAT: Controller.Mode.HEAT, - HVAC_MODE_HEAT_COOL: Controller.Mode.AUTO, - HVAC_MODE_FAN_ONLY: Controller.Mode.VENT, - HVAC_MODE_DRY: Controller.Mode.DRY, + HVACMode.COOL: Controller.Mode.COOL, + HVACMode.HEAT: Controller.Mode.HEAT, + HVACMode.HEAT_COOL: Controller.Mode.AUTO, + HVACMode.FAN_ONLY: Controller.Mode.VENT, + HVACMode.DRY: Controller.Mode.DRY, } if controller.free_air_enabled: - self._supported_features |= ClimateEntityFeature.PRESET_MODE + self._attr_supported_features |= ClimateEntityFeature.PRESET_MODE self._fan_to_pizone = {} for fan in controller.fan_modes: @@ -264,11 +260,6 @@ class ControllerDevice(ClimateEntity): """ return False - @property - def supported_features(self) -> int: - """Return the list of supported features.""" - return self._supported_features - @property def temperature_unit(self) -> str: """Return the unit of measurement which this thermostat uses.""" @@ -308,12 +299,12 @@ class ControllerDevice(ClimateEntity): } @property - def hvac_mode(self) -> str: + def hvac_mode(self) -> HVACMode: """Return current operation ie. heat, cool, idle.""" if not self._controller.is_on: - return HVAC_MODE_OFF + return HVACMode.OFF if (mode := self._controller.mode) == Controller.Mode.FREE_AIR: - return HVAC_MODE_FAN_ONLY + return HVACMode.FAN_ONLY for (key, value) in self._state_to_pizone.items(): if value == mode: return key @@ -321,11 +312,11 @@ class ControllerDevice(ClimateEntity): @property @_return_on_connection_error([]) - def hvac_modes(self) -> list[str]: + def hvac_modes(self) -> list[HVACMode]: """Return the list of available operation modes.""" if self._controller.free_air: - return [HVAC_MODE_OFF, HVAC_MODE_FAN_ONLY] - return [HVAC_MODE_OFF, *self._state_to_pizone] + return [HVACMode.OFF, HVACMode.FAN_ONLY] + return [HVACMode.OFF, *self._state_to_pizone] @property @_return_on_connection_error(PRESET_NONE) @@ -352,7 +343,7 @@ class ControllerDevice(ClimateEntity): @property def control_zone_name(self): """Return the zone that currently controls the AC unit (if target temp not set by controller).""" - if self._supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: + if self._attr_supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: return None zone_ctrl = self._controller.zone_ctrl zone = next((z for z in self.zones.values() if z.zone_index == zone_ctrl), None) @@ -363,7 +354,7 @@ class ControllerDevice(ClimateEntity): @property def control_zone_setpoint(self) -> float | None: """Return the temperature setpoint of the zone that currently controls the AC unit (if target temp not set by controller).""" - if self._supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: + if self._attr_supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: return None zone_ctrl = self._controller.zone_ctrl zone = next((z for z in self.zones.values() if z.zone_index == zone_ctrl), None) @@ -375,7 +366,7 @@ class ControllerDevice(ClimateEntity): @_return_on_connection_error() def target_temperature(self) -> float | None: """Return the temperature we try to reach (either from control zone or master unit).""" - if self._supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: + if self._attr_supported_features & ClimateEntityFeature.TARGET_TEMPERATURE: return self._controller.temp_setpoint return self.control_zone_setpoint @@ -433,9 +424,9 @@ class ControllerDevice(ClimateEntity): fan = self._fan_to_pizone[fan_mode] await self.wrap_and_catch(self._controller.set_fan(fan)) - async def async_set_hvac_mode(self, hvac_mode: str) -> None: + async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target operation mode.""" - if hvac_mode == HVAC_MODE_OFF: + if hvac_mode == HVACMode.OFF: await self.wrap_and_catch(self._controller.set_on(False)) return if not self._controller.is_on: @@ -465,19 +456,19 @@ class ZoneDevice(ClimateEntity): self._zone = zone self._name = zone.name.title() - self._supported_features = 0 + self._attr_supported_features = 0 if zone.type != Zone.Type.AUTO: self._state_to_pizone = { - HVAC_MODE_OFF: Zone.Mode.CLOSE, - HVAC_MODE_FAN_ONLY: Zone.Mode.OPEN, + HVACMode.OFF: Zone.Mode.CLOSE, + HVACMode.FAN_ONLY: Zone.Mode.OPEN, } else: self._state_to_pizone = { - HVAC_MODE_OFF: Zone.Mode.CLOSE, - HVAC_MODE_FAN_ONLY: Zone.Mode.OPEN, - HVAC_MODE_HEAT_COOL: Zone.Mode.AUTO, + HVACMode.OFF: Zone.Mode.CLOSE, + HVACMode.FAN_ONLY: Zone.Mode.OPEN, + HVACMode.HEAT_COOL: Zone.Mode.AUTO, } - self._supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE + self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE self._attr_device_info = DeviceInfo( identifiers={(IZONE, controller.unique_id, zone.index)}, @@ -547,8 +538,8 @@ class ZoneDevice(ClimateEntity): def supported_features(self): """Return the list of supported features.""" if self._zone.mode == Zone.Mode.AUTO: - return self._supported_features - return self._supported_features & ~ClimateEntityFeature.TARGET_TEMPERATURE + return self._attr_supported_features + return self._attr_supported_features & ~ClimateEntityFeature.TARGET_TEMPERATURE @property def temperature_unit(self): @@ -561,7 +552,7 @@ class ZoneDevice(ClimateEntity): return PRECISION_TENTHS @property - def hvac_mode(self): + def hvac_mode(self) -> HVACMode: """Return current operation ie. heat, cool, idle.""" mode = self._zone.mode for (key, value) in self._state_to_pizone.items(): @@ -570,7 +561,7 @@ class ZoneDevice(ClimateEntity): return None @property - def hvac_modes(self): + def hvac_modes(self) -> list[HVACMode]: """Return the list of available operation modes.""" return list(self._state_to_pizone) @@ -632,7 +623,7 @@ class ZoneDevice(ClimateEntity): if (temp := kwargs.get(ATTR_TEMPERATURE)) is not None: await self._controller.wrap_and_catch(self._zone.set_temp_setpoint(temp)) - async def async_set_hvac_mode(self, hvac_mode: str) -> None: + async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target operation mode.""" mode = self._state_to_pizone[hvac_mode] await self._controller.wrap_and_catch(self._zone.set_mode(mode))