Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Entity classes for the Airzone Cloud integration."""
2 
3 from __future__ import annotations
4 
5 from abc import ABC, abstractmethod
6 import logging
7 from typing import Any
8 
9 from aioairzone_cloud.const import (
10  AZD_AIDOOS,
11  AZD_AVAILABLE,
12  AZD_FIRMWARE,
13  AZD_GROUPS,
14  AZD_HOT_WATERS,
15  AZD_INSTALLATIONS,
16  AZD_MODEL,
17  AZD_NAME,
18  AZD_SYSTEM_ID,
19  AZD_SYSTEMS,
20  AZD_THERMOSTAT_FW,
21  AZD_THERMOSTAT_MODEL,
22  AZD_WEBSERVER,
23  AZD_WEBSERVERS,
24  AZD_ZONES,
25 )
26 from aioairzone_cloud.exceptions import AirzoneCloudError
27 
28 from homeassistant.exceptions import HomeAssistantError
29 from homeassistant.helpers import device_registry as dr
30 from homeassistant.helpers.device_registry import DeviceInfo
31 from homeassistant.helpers.update_coordinator import CoordinatorEntity
32 
33 from .const import DOMAIN, MANUFACTURER
34 from .coordinator import AirzoneUpdateCoordinator
35 
36 _LOGGER = logging.getLogger(__name__)
37 
38 
39 class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator], ABC):
40  """Define an Airzone Cloud entity."""
41 
42  _attr_has_entity_name = True
43 
44  @property
45  def available(self) -> bool:
46  """Return Airzone Cloud entity availability."""
47  return super().available and self.get_airzone_valueget_airzone_value(AZD_AVAILABLE)
48 
49  @abstractmethod
50  def get_airzone_value(self, key: str) -> Any:
51  """Return Airzone Cloud entity value by key."""
52 
53  async def _async_update_params(self, params: dict[str, Any]) -> None:
54  """Send Airzone parameters to Cloud API."""
55  raise NotImplementedError
56 
57 
59  """Define an Airzone Cloud Aidoo entity."""
60 
61  def __init__(
62  self,
63  coordinator: AirzoneUpdateCoordinator,
64  aidoo_id: str,
65  aidoo_data: dict[str, Any],
66  ) -> None:
67  """Initialize."""
68  super().__init__(coordinator)
69 
70  self.aidoo_idaidoo_id = aidoo_id
71 
72  self._attr_device_info_attr_device_info = DeviceInfo(
73  identifiers={(DOMAIN, aidoo_id)},
74  manufacturer=MANUFACTURER,
75  model=aidoo_data[AZD_MODEL],
76  name=aidoo_data[AZD_NAME],
77  via_device=(DOMAIN, aidoo_data[AZD_WEBSERVER]),
78  )
79 
80  def get_airzone_value(self, key: str) -> Any:
81  """Return Aidoo value by key."""
82  value = None
83  if aidoo := self.coordinator.data[AZD_AIDOOS].get(self.aidoo_idaidoo_id):
84  value = aidoo.get(key)
85  return value
86 
87  async def _async_update_params(self, params: dict[str, Any]) -> None:
88  """Send Aidoo parameters to Cloud API."""
89  _LOGGER.debug("aidoo=%s: update_params=%s", self.entity_id, params)
90  try:
91  await self.coordinator.airzone.api_set_aidoo_id_params(
92  self.aidoo_idaidoo_id, params
93  )
94  except AirzoneCloudError as error:
95  raise HomeAssistantError(
96  f"Failed to set {self.entity_id} params: {error}"
97  ) from error
98 
99  self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
100 
101 
103  """Define an Airzone Cloud Group entity."""
104 
105  def __init__(
106  self,
107  coordinator: AirzoneUpdateCoordinator,
108  group_id: str,
109  group_data: dict[str, Any],
110  ) -> None:
111  """Initialize."""
112  super().__init__(coordinator)
113 
114  self.group_idgroup_id = group_id
115 
116  self._attr_device_info_attr_device_info = DeviceInfo(
117  identifiers={(DOMAIN, group_id)},
118  model="Group",
119  manufacturer=MANUFACTURER,
120  name=group_data[AZD_NAME],
121  )
122 
123  def get_airzone_value(self, key: str) -> Any:
124  """Return Group value by key."""
125  value = None
126  if group := self.coordinator.data[AZD_GROUPS].get(self.group_idgroup_id):
127  value = group.get(key)
128  return value
129 
130  async def _async_update_params(self, params: dict[str, Any]) -> None:
131  """Send Group parameters to Cloud API."""
132  _LOGGER.debug("group=%s: update_params=%s", self.entity_id, params)
133  try:
134  await self.coordinator.airzone.api_set_group_id_params(
135  self.group_idgroup_id, params
136  )
137  except AirzoneCloudError as error:
138  raise HomeAssistantError(
139  f"Failed to set {self.entity_id} params: {error}"
140  ) from error
141 
142  self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
143 
144 
146  """Define an Airzone Cloud Hot Water entity."""
147 
148  def __init__(
149  self,
150  coordinator: AirzoneUpdateCoordinator,
151  dhw_id: str,
152  dhw_data: dict[str, Any],
153  ) -> None:
154  """Initialize."""
155  super().__init__(coordinator)
156 
157  self.dhw_iddhw_id = dhw_id
158 
159  self._attr_device_info_attr_device_info = DeviceInfo(
160  identifiers={(DOMAIN, dhw_id)},
161  manufacturer=MANUFACTURER,
162  model="Hot Water",
163  name=dhw_data[AZD_NAME],
164  via_device=(DOMAIN, dhw_data[AZD_WEBSERVER]),
165  )
166 
167  def get_airzone_value(self, key: str) -> Any:
168  """Return DHW value by key."""
169  value = None
170  if dhw := self.coordinator.data[AZD_HOT_WATERS].get(self.dhw_iddhw_id):
171  value = dhw.get(key)
172  return value
173 
174  async def _async_update_params(self, params: dict[str, Any]) -> None:
175  """Send DHW parameters to Cloud API."""
176  _LOGGER.debug("dhw=%s: update_params=%s", self.entity_id, params)
177  try:
178  await self.coordinator.airzone.api_set_dhw_id_params(self.dhw_iddhw_id, params)
179  except AirzoneCloudError as error:
180  raise HomeAssistantError(
181  f"Failed to set {self.entity_id} params: {error}"
182  ) from error
183 
184  self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
185 
186 
188  """Define an Airzone Cloud Installation entity."""
189 
190  def __init__(
191  self,
192  coordinator: AirzoneUpdateCoordinator,
193  inst_id: str,
194  inst_data: dict[str, Any],
195  ) -> None:
196  """Initialize."""
197  super().__init__(coordinator)
198 
199  self.inst_idinst_id = inst_id
200 
201  self._attr_device_info_attr_device_info = DeviceInfo(
202  identifiers={(DOMAIN, inst_id)},
203  manufacturer=MANUFACTURER,
204  model="Installation",
205  name=inst_data[AZD_NAME],
206  )
207 
208  def get_airzone_value(self, key: str) -> Any:
209  """Return Installation value by key."""
210  value = None
211  if inst := self.coordinator.data[AZD_INSTALLATIONS].get(self.inst_idinst_id):
212  value = inst.get(key)
213  return value
214 
215  async def _async_update_params(self, params: dict[str, Any]) -> None:
216  """Send Installation parameters to Cloud API."""
217  _LOGGER.debug(
218  "installation=%s: update_params=%s",
219  self.entity_id,
220  params,
221  )
222  try:
223  await self.coordinator.airzone.api_set_installation_id_params(
224  self.inst_idinst_id, params
225  )
226  except AirzoneCloudError as error:
227  raise HomeAssistantError(
228  f"Failed to set {self.entity_id} params: {error}"
229  ) from error
230 
231  self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
232 
233 
235  """Define an Airzone Cloud System entity."""
236 
237  def __init__(
238  self,
239  coordinator: AirzoneUpdateCoordinator,
240  system_id: str,
241  system_data: dict[str, Any],
242  ) -> None:
243  """Initialize."""
244  super().__init__(coordinator)
245 
246  self.system_idsystem_id = system_id
247 
248  self._attr_device_info_attr_device_info = DeviceInfo(
249  identifiers={(DOMAIN, system_id)},
250  model=system_data.get(AZD_MODEL),
251  manufacturer=MANUFACTURER,
252  name=system_data[AZD_NAME],
253  via_device=(DOMAIN, system_data[AZD_WEBSERVER]),
254  sw_version=system_data.get(AZD_FIRMWARE),
255  )
256 
257  def get_airzone_value(self, key: str) -> Any:
258  """Return system value by key."""
259  value = None
260  if system := self.coordinator.data[AZD_SYSTEMS].get(self.system_idsystem_id):
261  value = system.get(key)
262  return value
263 
264 
266  """Define an Airzone Cloud WebServer entity."""
267 
268  def __init__(
269  self,
270  coordinator: AirzoneUpdateCoordinator,
271  ws_id: str,
272  ws_data: dict[str, Any],
273  ) -> None:
274  """Initialize."""
275  super().__init__(coordinator)
276 
277  self.ws_idws_id = ws_id
278 
279  self._attr_device_info_attr_device_info = DeviceInfo(
280  connections={(dr.CONNECTION_NETWORK_MAC, ws_id)},
281  identifiers={(DOMAIN, ws_id)},
282  model="WebServer",
283  manufacturer=MANUFACTURER,
284  name=ws_data[AZD_NAME],
285  sw_version=ws_data[AZD_FIRMWARE],
286  )
287 
288  def get_airzone_value(self, key: str) -> Any:
289  """Return WebServer value by key."""
290  value = None
291  if webserver := self.coordinator.data[AZD_WEBSERVERS].get(self.ws_idws_id):
292  value = webserver.get(key)
293  return value
294 
295 
297  """Define an Airzone Cloud Zone entity."""
298 
299  def __init__(
300  self,
301  coordinator: AirzoneUpdateCoordinator,
302  zone_id: str,
303  zone_data: dict[str, Any],
304  ) -> None:
305  """Initialize."""
306  super().__init__(coordinator)
307 
308  self.system_idsystem_id = zone_data[AZD_SYSTEM_ID]
309  self.zone_idzone_id = zone_id
310 
311  self._attr_device_info_attr_device_info = DeviceInfo(
312  identifiers={(DOMAIN, zone_id)},
313  model=zone_data.get(AZD_THERMOSTAT_MODEL),
314  manufacturer=MANUFACTURER,
315  name=zone_data[AZD_NAME],
316  via_device=(DOMAIN, self.system_idsystem_id),
317  sw_version=zone_data.get(AZD_THERMOSTAT_FW),
318  )
319 
320  def get_airzone_value(self, key: str) -> Any:
321  """Return zone value by key."""
322  value = None
323  if zone := self.coordinator.data[AZD_ZONES].get(self.zone_idzone_id):
324  value = zone.get(key)
325  return value
326 
327  async def _async_update_params(self, params: dict[str, Any]) -> None:
328  """Send Zone parameters to Cloud API."""
329  _LOGGER.debug("zone=%s: update_params=%s", self.entity_id, params)
330  try:
331  await self.coordinator.airzone.api_set_zone_id_params(self.zone_idzone_id, params)
332  except AirzoneCloudError as error:
333  raise HomeAssistantError(
334  f"Failed to set {self.entity_id} params: {error}"
335  ) from error
336 
337  self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
None __init__(self, AirzoneUpdateCoordinator coordinator, str aidoo_id, dict[str, Any] aidoo_data)
Definition: entity.py:66
None _async_update_params(self, dict[str, Any] params)
Definition: entity.py:87
None _async_update_params(self, dict[str, Any] params)
Definition: entity.py:53
None __init__(self, AirzoneUpdateCoordinator coordinator, str group_id, dict[str, Any] group_data)
Definition: entity.py:110
None _async_update_params(self, dict[str, Any] params)
Definition: entity.py:130
None __init__(self, AirzoneUpdateCoordinator coordinator, str dhw_id, dict[str, Any] dhw_data)
Definition: entity.py:153
None __init__(self, AirzoneUpdateCoordinator coordinator, str inst_id, dict[str, Any] inst_data)
Definition: entity.py:195
None __init__(self, AirzoneUpdateCoordinator coordinator, str system_id, dict[str, Any] system_data)
Definition: entity.py:242
None __init__(self, AirzoneUpdateCoordinator coordinator, str ws_id, dict[str, Any] ws_data)
Definition: entity.py:273
None _async_update_params(self, dict[str, Any] params)
Definition: entity.py:327
None __init__(self, AirzoneUpdateCoordinator coordinator, str zone_id, dict[str, Any] zone_data)
Definition: entity.py:304
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88