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
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))