Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """A risco entity base class."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from pyrisco import RiscoCloud
8 from pyrisco.cloud.zone import Zone as CloudZone
9 from pyrisco.local.zone import Zone as LocalZone
10 
11 from homeassistant.helpers.device_registry import DeviceInfo
12 from homeassistant.helpers.dispatcher import async_dispatcher_connect
13 from homeassistant.helpers.entity import Entity
14 from homeassistant.helpers.update_coordinator import CoordinatorEntity
15 
16 from . import zone_update_signal
17 from .const import DOMAIN
18 from .coordinator import RiscoDataUpdateCoordinator
19 
20 
21 def zone_unique_id(risco: RiscoCloud, zone_id: int) -> str:
22  """Return unique id for a cloud zone."""
23  return f"{risco.site_uuid}_zone_{zone_id}"
24 
25 
26 class RiscoCloudEntity(CoordinatorEntity[RiscoDataUpdateCoordinator]):
27  """Risco cloud entity base class."""
28 
29  def __init__(
30  self, *, coordinator: RiscoDataUpdateCoordinator, **kwargs: Any
31  ) -> None:
32  """Init the entity."""
33  super().__init__(coordinator=coordinator, **kwargs)
34 
35  def _get_data_from_coordinator(self) -> None:
36  raise NotImplementedError
37 
38  def _handle_coordinator_update(self) -> None:
39  self._get_data_from_coordinator_get_data_from_coordinator()
40  self.async_write_ha_state()
41 
42  @property
43  def _risco(self) -> RiscoCloud:
44  """Return the Risco API object."""
45  return self.coordinator.risco
46 
47 
49  """Risco cloud zone entity base class."""
50 
51  _attr_has_entity_name = True
52 
53  def __init__(
54  self,
55  *,
56  coordinator: RiscoDataUpdateCoordinator,
57  suffix: str,
58  zone_id: int,
59  zone: CloudZone,
60  **kwargs: Any,
61  ) -> None:
62  """Init the zone."""
63  super().__init__(coordinator=coordinator, **kwargs)
64  self._zone_id_zone_id = zone_id
65  self._zone_zone = zone
66  device_unique_id = zone_unique_id(self._risco_risco, zone_id)
67  self._attr_unique_id_attr_unique_id = f"{device_unique_id}{suffix}"
68  self._attr_device_info_attr_device_info = DeviceInfo(
69  identifiers={(DOMAIN, device_unique_id)},
70  manufacturer="Risco",
71  name=self._zone_zone.name,
72  )
73  self._attr_extra_state_attributes_attr_extra_state_attributes = {"zone_id": zone_id}
74 
75  def _get_data_from_coordinator(self) -> None:
76  self._zone_zone = self.coordinator.data.zones[self._zone_id_zone_id]
77 
78 
80  """Risco local zone entity base class."""
81 
82  _attr_should_poll = False
83  _attr_has_entity_name = True
84 
85  def __init__(
86  self,
87  *,
88  system_id: str,
89  suffix: str,
90  zone_id: int,
91  zone: LocalZone,
92  **kwargs: Any,
93  ) -> None:
94  """Init the zone."""
95  super().__init__(**kwargs)
96  self._zone_id_zone_id = zone_id
97  self._zone_zone = zone
98  device_unique_id = f"{system_id}_zone_{zone_id}_local"
99  self._attr_unique_id_attr_unique_id = f"{device_unique_id}{suffix}"
100  self._attr_device_info_attr_device_info = DeviceInfo(
101  identifiers={(DOMAIN, device_unique_id)},
102  manufacturer="Risco",
103  name=zone.name,
104  )
105  self._attr_extra_state_attributes_attr_extra_state_attributes = {"zone_id": zone_id}
106 
107  async def async_added_to_hass(self) -> None:
108  """Subscribe to updates."""
109  signal = zone_update_signal(self._zone_id_zone_id)
110  self.async_on_removeasync_on_remove(
111  async_dispatcher_connect(self.hasshass, signal, self.async_write_ha_stateasync_write_ha_state)
112  )
None __init__(self, *RiscoDataUpdateCoordinator coordinator, **Any kwargs)
Definition: entity.py:31
None __init__(self, *RiscoDataUpdateCoordinator coordinator, str suffix, int zone_id, CloudZone zone, **Any kwargs)
Definition: entity.py:61
None __init__(self, *str system_id, str suffix, int zone_id, LocalZone zone, **Any kwargs)
Definition: entity.py:93
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
str zone_unique_id(RiscoCloud risco, int zone_id)
Definition: entity.py:21
str zone_update_signal(int zone_id)
Definition: __init__.py:63
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103