mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Use climate enums in izone (#70674)
This commit is contained in:
parent
475296fb36
commit
fbfce51536
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user