1 """Support for the Airzone sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from typing
import Any, Final
9 from aioairzone.common
import GrilleAngle, OperationMode, SleepTimeout
10 from aioairzone.const
import (
30 from .
import AirzoneConfigEntry
31 from .coordinator
import AirzoneUpdateCoordinator
32 from .entity
import AirzoneEntity, AirzoneZoneEntity
35 @dataclass(frozen=True, kw_only=True)
37 """Class to describe an Airzone select entity."""
40 options_dict: dict[str, int]
41 options_fn: Callable[[dict[str, Any], dict[str, int]], list[str]] = (
42 lambda zone_data, value:
list(value)
46 GRILLE_ANGLE_DICT: Final[dict[str, int]] = {
47 "90deg": GrilleAngle.DEG_90,
48 "50deg": GrilleAngle.DEG_50,
49 "45deg": GrilleAngle.DEG_45,
50 "40deg": GrilleAngle.DEG_40,
53 MODE_DICT: Final[dict[str, int]] = {
54 "cool": OperationMode.COOLING,
55 "dry": OperationMode.DRY,
56 "fan": OperationMode.FAN,
57 "heat": OperationMode.HEATING,
58 "heat_cool": OperationMode.AUTO,
59 "stop": OperationMode.STOP,
62 SLEEP_DICT: Final[dict[str, int]] = {
63 "off": SleepTimeout.SLEEP_OFF,
64 "30m": SleepTimeout.SLEEP_30,
65 "60m": SleepTimeout.SLEEP_60,
66 "90m": SleepTimeout.SLEEP_90,
71 zone_data: dict[str, Any],
72 options: dict[str, int],
74 """Filter available modes."""
75 modes = zone_data.get(AZD_MODES, [])
76 return [k
for k, v
in options.items()
if v
in modes]
79 MAIN_ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
83 options_dict=MODE_DICT,
84 options_fn=main_zone_options,
85 translation_key=
"modes",
90 ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
92 api_param=API_COLD_ANGLE,
93 entity_category=EntityCategory.CONFIG,
95 options=
list(GRILLE_ANGLE_DICT),
96 options_dict=GRILLE_ANGLE_DICT,
97 translation_key=
"grille_angles",
100 api_param=API_HEAT_ANGLE,
101 entity_category=EntityCategory.CONFIG,
103 options=
list(GRILLE_ANGLE_DICT),
104 options_dict=GRILLE_ANGLE_DICT,
105 translation_key=
"heat_angles",
109 entity_category=EntityCategory.CONFIG,
111 options=
list(SLEEP_DICT),
112 options_dict=SLEEP_DICT,
113 translation_key=
"sleep_times",
120 entry: AirzoneConfigEntry,
121 async_add_entities: AddEntitiesCallback,
123 """Add Airzone select from a config_entry."""
124 coordinator = entry.runtime_data
126 added_zones: set[str] = set()
128 def _async_entity_listener() -> None:
129 """Handle additions of select."""
131 zones_data = coordinator.data.get(AZD_ZONES, {})
132 received_zones = set(zones_data)
133 new_zones = received_zones - added_zones
135 entities: list[AirzoneZoneSelect] = [
141 zones_data.get(system_zone_id),
143 for system_zone_id
in new_zones
144 for description
in MAIN_ZONE_SELECT_TYPES
145 if description.key
in zones_data.get(system_zone_id)
146 and zones_data.get(system_zone_id).
get(AZD_MASTER)
is True
154 zones_data.get(system_zone_id),
156 for system_zone_id
in new_zones
157 for description
in ZONE_SELECT_TYPES
158 if description.key
in zones_data.get(system_zone_id)
161 added_zones.update(new_zones)
163 entry.async_on_unload(coordinator.async_add_listener(_async_entity_listener))
164 _async_entity_listener()
168 """Define an Airzone select."""
170 entity_description: AirzoneSelectDescription
171 values_dict: dict[int, str]
175 """Update attributes when the coordinator updates."""
181 return self.values_dict.
get(value)
185 """Update select attributes."""
190 """Define an Airzone Zone select."""
194 coordinator: AirzoneUpdateCoordinator,
195 description: AirzoneSelectDescription,
198 zone_data: dict[str, Any],
201 super().
__init__(coordinator, entry, system_zone_id, zone_data)
204 f
"{self._attr_unique_id}_{system_zone_id}_{description.key}"
209 zone_data, description.options_dict
212 self.
values_dictvalues_dict = {v: k
for k, v
in description.options_dict.items()}
217 """Change the selected option."""
Any get_airzone_value(self, str key)
None _async_update_hvac_params(self, dict[str, Any] params)
str|None _get_current_option(self)
None _async_update_attrs(self)
None _handle_coordinator_update(self)
None __init__(self, AirzoneUpdateCoordinator coordinator, AirzoneSelectDescription description, ConfigEntry entry, str system_zone_id, dict[str, Any] zone_data)
None async_select_option(self, str option)
None async_setup_entry(HomeAssistant hass, AirzoneConfigEntry entry, AddEntitiesCallback async_add_entities)
list[str] main_zone_options(dict[str, Any] zone_data, dict[str, int] options)
web.Response get(self, web.Request request, str config_key)