Use climate enums in izone (#70674)

This commit is contained in:
epenet 2022-04-26 09:28:58 +02:00 committed by GitHub
parent 475296fb36
commit fbfce51536
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,21 +6,17 @@ import logging
from pizone import Controller, Zone from pizone import Controller, Zone
import voluptuous as vol import voluptuous as vol
from homeassistant.components.climate import ClimateEntity, ClimateEntityFeature from homeassistant.components.climate import ClimateEntity
from homeassistant.components.climate.const import ( from homeassistant.components.climate.const import (
FAN_AUTO, FAN_AUTO,
FAN_HIGH, FAN_HIGH,
FAN_LOW, FAN_LOW,
FAN_MEDIUM, FAN_MEDIUM,
FAN_TOP, 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_ECO,
PRESET_NONE, PRESET_NONE,
ClimateEntityFeature,
HVACMode,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
@ -136,24 +132,24 @@ class ControllerDevice(ClimateEntity):
"""Initialise ControllerDevice.""" """Initialise ControllerDevice."""
self._controller = controller 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, # 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 # otherwise the unit determines which zone to use as target. See interface manual p. 8
if ( if (
controller.ras_mode == "master" and controller.zone_ctrl == 13 controller.ras_mode == "master" and controller.zone_ctrl == 13
) or controller.ras_mode == "RAS": ) or controller.ras_mode == "RAS":
self._supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE
self._state_to_pizone = { self._state_to_pizone = {
HVAC_MODE_COOL: Controller.Mode.COOL, HVACMode.COOL: Controller.Mode.COOL,
HVAC_MODE_HEAT: Controller.Mode.HEAT, HVACMode.HEAT: Controller.Mode.HEAT,
HVAC_MODE_HEAT_COOL: Controller.Mode.AUTO, HVACMode.HEAT_COOL: Controller.Mode.AUTO,
HVAC_MODE_FAN_ONLY: Controller.Mode.VENT, HVACMode.FAN_ONLY: Controller.Mode.VENT,
HVAC_MODE_DRY: Controller.Mode.DRY, HVACMode.DRY: Controller.Mode.DRY,
} }
if controller.free_air_enabled: if controller.free_air_enabled:
self._supported_features |= ClimateEntityFeature.PRESET_MODE self._attr_supported_features |= ClimateEntityFeature.PRESET_MODE
self._fan_to_pizone = {} self._fan_to_pizone = {}
for fan in controller.fan_modes: for fan in controller.fan_modes:
@ -264,11 +260,6 @@ class ControllerDevice(ClimateEntity):
""" """
return False return False
@property
def supported_features(self) -> int:
"""Return the list of supported features."""
return self._supported_features
@property @property
def temperature_unit(self) -> str: def temperature_unit(self) -> str:
"""Return the unit of measurement which this thermostat uses.""" """Return the unit of measurement which this thermostat uses."""
@ -308,12 +299,12 @@ class ControllerDevice(ClimateEntity):
} }
@property @property
def hvac_mode(self) -> str: def hvac_mode(self) -> HVACMode:
"""Return current operation ie. heat, cool, idle.""" """Return current operation ie. heat, cool, idle."""
if not self._controller.is_on: if not self._controller.is_on:
return HVAC_MODE_OFF return HVACMode.OFF
if (mode := self._controller.mode) == Controller.Mode.FREE_AIR: 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(): for (key, value) in self._state_to_pizone.items():
if value == mode: if value == mode:
return key return key
@ -321,11 +312,11 @@ class ControllerDevice(ClimateEntity):
@property @property
@_return_on_connection_error([]) @_return_on_connection_error([])
def hvac_modes(self) -> list[str]: def hvac_modes(self) -> list[HVACMode]:
"""Return the list of available operation modes.""" """Return the list of available operation modes."""
if self._controller.free_air: if self._controller.free_air:
return [HVAC_MODE_OFF, HVAC_MODE_FAN_ONLY] return [HVACMode.OFF, HVACMode.FAN_ONLY]
return [HVAC_MODE_OFF, *self._state_to_pizone] return [HVACMode.OFF, *self._state_to_pizone]
@property @property
@_return_on_connection_error(PRESET_NONE) @_return_on_connection_error(PRESET_NONE)
@ -352,7 +343,7 @@ class ControllerDevice(ClimateEntity):
@property @property
def control_zone_name(self): def control_zone_name(self):
"""Return the zone that currently controls the AC unit (if target temp not set by controller).""" """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 return None
zone_ctrl = self._controller.zone_ctrl zone_ctrl = self._controller.zone_ctrl
zone = next((z for z in self.zones.values() if z.zone_index == zone_ctrl), None) zone = next((z for z in self.zones.values() if z.zone_index == zone_ctrl), None)
@ -363,7 +354,7 @@ class ControllerDevice(ClimateEntity):
@property @property
def control_zone_setpoint(self) -> float | None: 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).""" """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 return None
zone_ctrl = self._controller.zone_ctrl zone_ctrl = self._controller.zone_ctrl
zone = next((z for z in self.zones.values() if z.zone_index == zone_ctrl), None) 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() @_return_on_connection_error()
def target_temperature(self) -> float | None: def target_temperature(self) -> float | None:
"""Return the temperature we try to reach (either from control zone or master unit).""" """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._controller.temp_setpoint
return self.control_zone_setpoint return self.control_zone_setpoint
@ -433,9 +424,9 @@ class ControllerDevice(ClimateEntity):
fan = self._fan_to_pizone[fan_mode] fan = self._fan_to_pizone[fan_mode]
await self.wrap_and_catch(self._controller.set_fan(fan)) 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.""" """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)) await self.wrap_and_catch(self._controller.set_on(False))
return return
if not self._controller.is_on: if not self._controller.is_on:
@ -465,19 +456,19 @@ class ZoneDevice(ClimateEntity):
self._zone = zone self._zone = zone
self._name = zone.name.title() self._name = zone.name.title()
self._supported_features = 0 self._attr_supported_features = 0
if zone.type != Zone.Type.AUTO: if zone.type != Zone.Type.AUTO:
self._state_to_pizone = { self._state_to_pizone = {
HVAC_MODE_OFF: Zone.Mode.CLOSE, HVACMode.OFF: Zone.Mode.CLOSE,
HVAC_MODE_FAN_ONLY: Zone.Mode.OPEN, HVACMode.FAN_ONLY: Zone.Mode.OPEN,
} }
else: else:
self._state_to_pizone = { self._state_to_pizone = {
HVAC_MODE_OFF: Zone.Mode.CLOSE, HVACMode.OFF: Zone.Mode.CLOSE,
HVAC_MODE_FAN_ONLY: Zone.Mode.OPEN, HVACMode.FAN_ONLY: Zone.Mode.OPEN,
HVAC_MODE_HEAT_COOL: Zone.Mode.AUTO, HVACMode.HEAT_COOL: Zone.Mode.AUTO,
} }
self._supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(IZONE, controller.unique_id, zone.index)}, identifiers={(IZONE, controller.unique_id, zone.index)},
@ -547,8 +538,8 @@ class ZoneDevice(ClimateEntity):
def supported_features(self): def supported_features(self):
"""Return the list of supported features.""" """Return the list of supported features."""
if self._zone.mode == Zone.Mode.AUTO: if self._zone.mode == Zone.Mode.AUTO:
return self._supported_features return self._attr_supported_features
return self._supported_features & ~ClimateEntityFeature.TARGET_TEMPERATURE return self._attr_supported_features & ~ClimateEntityFeature.TARGET_TEMPERATURE
@property @property
def temperature_unit(self): def temperature_unit(self):
@ -561,7 +552,7 @@ class ZoneDevice(ClimateEntity):
return PRECISION_TENTHS return PRECISION_TENTHS
@property @property
def hvac_mode(self): def hvac_mode(self) -> HVACMode:
"""Return current operation ie. heat, cool, idle.""" """Return current operation ie. heat, cool, idle."""
mode = self._zone.mode mode = self._zone.mode
for (key, value) in self._state_to_pizone.items(): for (key, value) in self._state_to_pizone.items():
@ -570,7 +561,7 @@ class ZoneDevice(ClimateEntity):
return None return None
@property @property
def hvac_modes(self): def hvac_modes(self) -> list[HVACMode]:
"""Return the list of available operation modes.""" """Return the list of available operation modes."""
return list(self._state_to_pizone) return list(self._state_to_pizone)
@ -632,7 +623,7 @@ class ZoneDevice(ClimateEntity):
if (temp := kwargs.get(ATTR_TEMPERATURE)) is not None: if (temp := kwargs.get(ATTR_TEMPERATURE)) is not None:
await self._controller.wrap_and_catch(self._zone.set_temp_setpoint(temp)) 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.""" """Set new target operation mode."""
mode = self._state_to_pizone[hvac_mode] mode = self._state_to_pizone[hvac_mode]
await self._controller.wrap_and_catch(self._zone.set_mode(mode)) await self._controller.wrap_and_catch(self._zone.set_mode(mode))