From 76dd82f8e5a9c4a19492f2d05906e7e011009927 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 26 Apr 2022 09:19:02 +0200 Subject: [PATCH] Use climate enums in nest (#70723) --- homeassistant/components/nest/climate_sdm.py | 79 ++++++++----------- .../components/nest/legacy/climate.py | 46 +++++------ 2 files changed, 54 insertions(+), 71 deletions(-) diff --git a/homeassistant/components/nest/climate_sdm.py b/homeassistant/components/nest/climate_sdm.py index b00ede9d25e..26fb88482ee 100644 --- a/homeassistant/components/nest/climate_sdm.py +++ b/homeassistant/components/nest/climate_sdm.py @@ -14,25 +14,18 @@ from google_nest_sdm.thermostat_traits import ( ThermostatTemperatureSetpointTrait, ) -from homeassistant.components.climate import ClimateEntity, ClimateEntityFeature +from homeassistant.components.climate import ClimateEntity from homeassistant.components.climate.const import ( ATTR_HVAC_MODE, ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW, - CURRENT_HVAC_COOL, - CURRENT_HVAC_HEAT, - CURRENT_HVAC_IDLE, - CURRENT_HVAC_OFF, FAN_OFF, FAN_ON, - HVAC_MODE_AUTO, - HVAC_MODE_COOL, - HVAC_MODE_FAN_ONLY, - HVAC_MODE_HEAT, - HVAC_MODE_HEAT_COOL, - HVAC_MODE_OFF, PRESET_ECO, PRESET_NONE, + ClimateEntityFeature, + HVACAction, + HVACMode, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS @@ -45,11 +38,11 @@ from .const import DATA_SUBSCRIBER, DOMAIN from .device_info import NestDeviceInfo # Mapping for sdm.devices.traits.ThermostatMode mode field -THERMOSTAT_MODE_MAP: dict[str, str] = { - "OFF": HVAC_MODE_OFF, - "HEAT": HVAC_MODE_HEAT, - "COOL": HVAC_MODE_COOL, - "HEATCOOL": HVAC_MODE_HEAT_COOL, +THERMOSTAT_MODE_MAP: dict[str, HVACMode] = { + "OFF": HVACMode.OFF, + "HEAT": HVACMode.HEAT, + "COOL": HVACMode.COOL, + "HEATCOOL": HVACMode.HEAT_COOL, } THERMOSTAT_INV_MODE_MAP = {v: k for k, v in THERMOSTAT_MODE_MAP.items()} @@ -58,12 +51,12 @@ THERMOSTAT_ECO_MODE = "MANUAL_ECO" # Mapping for sdm.devices.traits.ThermostatHvac status field THERMOSTAT_HVAC_STATUS_MAP = { - "OFF": CURRENT_HVAC_OFF, - "HEATING": CURRENT_HVAC_HEAT, - "COOLING": CURRENT_HVAC_COOL, + "OFF": HVACAction.OFF, + "HEATING": HVACAction.HEATING, + "COOLING": HVACAction.COOLING, } -THERMOSTAT_RANGE_MODES = [HVAC_MODE_HEAT_COOL, HVAC_MODE_AUTO] +THERMOSTAT_RANGE_MODES = [HVACMode.HEAT_COOL, HVACMode.AUTO] PRESET_MODE_MAP = { "MANUAL_ECO": PRESET_ECO, @@ -153,16 +146,16 @@ class ThermostatEntity(ClimateEntity): """Return the temperature currently set to be reached.""" if not (trait := self._target_temperature_trait): return None - if self.hvac_mode == HVAC_MODE_HEAT: + if self.hvac_mode == HVACMode.HEAT: return trait.heat_celsius - if self.hvac_mode == HVAC_MODE_COOL: + if self.hvac_mode == HVACMode.COOL: return trait.cool_celsius return None @property def target_temperature_high(self) -> float | None: """Return the upper bound target temperature.""" - if self.hvac_mode != HVAC_MODE_HEAT_COOL: + if self.hvac_mode != HVACMode.HEAT_COOL: return None if not (trait := self._target_temperature_trait): return None @@ -171,7 +164,7 @@ class ThermostatEntity(ClimateEntity): @property def target_temperature_low(self) -> float | None: """Return the lower bound target temperature.""" - if self.hvac_mode != HVAC_MODE_HEAT_COOL: + if self.hvac_mode != HVACMode.HEAT_COOL: return None if not (trait := self._target_temperature_trait): return None @@ -197,26 +190,26 @@ class ThermostatEntity(ClimateEntity): return None @property - def hvac_mode(self) -> str: + def hvac_mode(self) -> HVACMode: """Return the current operation (e.g. heat, cool, idle).""" - hvac_mode = HVAC_MODE_OFF + hvac_mode = HVACMode.OFF if ThermostatModeTrait.NAME in self._device.traits: trait = self._device.traits[ThermostatModeTrait.NAME] if trait.mode in THERMOSTAT_MODE_MAP: hvac_mode = THERMOSTAT_MODE_MAP[trait.mode] - if hvac_mode == HVAC_MODE_OFF and self.fan_mode == FAN_ON: - hvac_mode = HVAC_MODE_FAN_ONLY + if hvac_mode == HVACMode.OFF and self.fan_mode == FAN_ON: + hvac_mode = HVACMode.FAN_ONLY return hvac_mode @property - def hvac_modes(self) -> list[str]: + def hvac_modes(self) -> list[HVACMode]: """List of available operation modes.""" supported_modes = [] for mode in self._get_device_hvac_modes: if mode in THERMOSTAT_MODE_MAP: supported_modes.append(THERMOSTAT_MODE_MAP[mode]) if self.supported_features & ClimateEntityFeature.FAN_MODE: - supported_modes.append(HVAC_MODE_FAN_ONLY) + supported_modes.append(HVACMode.FAN_ONLY) return supported_modes @property @@ -229,14 +222,12 @@ class ThermostatEntity(ClimateEntity): return set(modes) @property - def hvac_action(self) -> str | None: + def hvac_action(self) -> HVACAction | None: """Return the current HVAC action (heating, cooling).""" trait = self._device.traits[ThermostatHvacTrait.NAME] - if trait.status == "OFF" and self.hvac_mode != HVAC_MODE_OFF: - return CURRENT_HVAC_IDLE - if trait.status in THERMOSTAT_HVAC_STATUS_MAP: - return THERMOSTAT_HVAC_STATUS_MAP[trait.status] - return None + if trait.status == "OFF" and self.hvac_mode != HVACMode.OFF: + return HVACAction.IDLE + return THERMOSTAT_HVAC_STATUS_MAP.get(trait.status) @property def preset_mode(self) -> str: @@ -281,9 +272,9 @@ class ThermostatEntity(ClimateEntity): def _get_supported_features(self) -> int: """Compute the bitmap of supported features from the current state.""" features = 0 - if HVAC_MODE_HEAT_COOL in self.hvac_modes: + if HVACMode.HEAT_COOL in self.hvac_modes: features |= ClimateEntityFeature.TARGET_TEMPERATURE_RANGE - if HVAC_MODE_HEAT in self.hvac_modes or HVAC_MODE_COOL in self.hvac_modes: + if HVACMode.HEAT in self.hvac_modes or HVACMode.COOL in self.hvac_modes: features |= ClimateEntityFeature.TARGET_TEMPERATURE if ThermostatEcoTrait.NAME in self._device.traits: features |= ClimateEntityFeature.PRESET_MODE @@ -294,14 +285,14 @@ class ThermostatEntity(ClimateEntity): features |= ClimateEntityFeature.FAN_MODE return features - 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 hvac mode.""" if hvac_mode not in self.hvac_modes: raise ValueError(f"Unsupported hvac_mode '{hvac_mode}'") - if hvac_mode == HVAC_MODE_FAN_ONLY: + if hvac_mode == HVACMode.FAN_ONLY: # Turn the fan on but also turn off the hvac if it is on await self.async_set_fan_mode(FAN_ON) - hvac_mode = HVAC_MODE_OFF + hvac_mode = HVACMode.OFF api_mode = THERMOSTAT_INV_MODE_MAP[hvac_mode] trait = self._device.traits[ThermostatModeTrait.NAME] await trait.set_mode(api_mode) @@ -318,12 +309,12 @@ class ThermostatEntity(ClimateEntity): if ThermostatTemperatureSetpointTrait.NAME not in self._device.traits: return trait = self._device.traits[ThermostatTemperatureSetpointTrait.NAME] - if self.preset_mode == PRESET_ECO or hvac_mode == HVAC_MODE_HEAT_COOL: + if self.preset_mode == PRESET_ECO or hvac_mode == HVACMode.HEAT_COOL: if low_temp and high_temp: await trait.set_range(low_temp, high_temp) - elif hvac_mode == HVAC_MODE_COOL and temp: + elif hvac_mode == HVACMode.COOL and temp: await trait.set_cool(temp) - elif hvac_mode == HVAC_MODE_HEAT and temp: + elif hvac_mode == HVACMode.HEAT and temp: await trait.set_heat(temp) async def async_set_preset_mode(self, preset_mode: str) -> None: diff --git a/homeassistant/components/nest/legacy/climate.py b/homeassistant/components/nest/legacy/climate.py index 2305f14d00a..07238a46ea9 100644 --- a/homeassistant/components/nest/legacy/climate.py +++ b/homeassistant/components/nest/legacy/climate.py @@ -6,26 +6,18 @@ import logging from nest.nest import APIError import voluptuous as vol -from homeassistant.components.climate import ( - PLATFORM_SCHEMA, - ClimateEntity, - ClimateEntityFeature, -) +from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateEntity from homeassistant.components.climate.const import ( ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW, - CURRENT_HVAC_COOL, - CURRENT_HVAC_HEAT, - CURRENT_HVAC_IDLE, FAN_AUTO, FAN_ON, - HVAC_MODE_AUTO, - HVAC_MODE_COOL, - HVAC_MODE_HEAT, - HVAC_MODE_OFF, PRESET_AWAY, PRESET_ECO, PRESET_NONE, + ClimateEntityFeature, + HVACAction, + HVACMode, ) from homeassistant.const import ( ATTR_TEMPERATURE, @@ -51,18 +43,18 @@ NEST_MODE_COOL = "cool" NEST_MODE_OFF = "off" MODE_HASS_TO_NEST = { - HVAC_MODE_AUTO: NEST_MODE_HEAT_COOL, - HVAC_MODE_HEAT: NEST_MODE_HEAT, - HVAC_MODE_COOL: NEST_MODE_COOL, - HVAC_MODE_OFF: NEST_MODE_OFF, + HVACMode.AUTO: NEST_MODE_HEAT_COOL, + HVACMode.HEAT: NEST_MODE_HEAT, + HVACMode.COOL: NEST_MODE_COOL, + HVACMode.OFF: NEST_MODE_OFF, } MODE_NEST_TO_HASS = {v: k for k, v in MODE_HASS_TO_NEST.items()} ACTION_NEST_TO_HASS = { - "off": CURRENT_HVAC_IDLE, - "heating": CURRENT_HVAC_HEAT, - "cooling": CURRENT_HVAC_COOL, + "off": HVACAction.IDLE, + "heating": HVACAction.HEATING, + "cooling": HVACAction.COOLING, } PRESET_AWAY_AND_ECO = "Away and Eco" @@ -110,17 +102,17 @@ class NestThermostat(ClimateEntity): self._operation_list = [] if self.device.can_heat and self.device.can_cool: - self._operation_list.append(HVAC_MODE_AUTO) + self._operation_list.append(HVACMode.AUTO) self._support_flags |= ClimateEntityFeature.TARGET_TEMPERATURE_RANGE # Add supported nest thermostat features if self.device.can_heat: - self._operation_list.append(HVAC_MODE_HEAT) + self._operation_list.append(HVACMode.HEAT) if self.device.can_cool: - self._operation_list.append(HVAC_MODE_COOL) + self._operation_list.append(HVACMode.COOL) - self._operation_list.append(HVAC_MODE_OFF) + self._operation_list.append(HVACMode.OFF) # feature of device self._has_fan = self.device.has_fan @@ -197,7 +189,7 @@ class NestThermostat(ClimateEntity): return self._temperature @property - def hvac_mode(self): + def hvac_mode(self) -> HVACMode: """Return current operation ie. heat, cool, idle.""" if self._mode == NEST_MODE_ECO: if self.device.previous_mode in MODE_NEST_TO_HASS: @@ -209,7 +201,7 @@ class NestThermostat(ClimateEntity): return MODE_NEST_TO_HASS[self._mode] @property - def hvac_action(self): + def hvac_action(self) -> HVACAction: """Return the current hvac action.""" return ACTION_NEST_TO_HASS[self._action] @@ -259,12 +251,12 @@ class NestThermostat(ClimateEntity): # restore target temperature self.schedule_update_ha_state(True) - def set_hvac_mode(self, hvac_mode): + def set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set operation mode.""" self.device.mode = MODE_HASS_TO_NEST[hvac_mode] @property - def hvac_modes(self): + def hvac_modes(self) -> list[HVACMode]: """List of available operation modes.""" return self._operation_list