Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """UPnP/IGD coordinator."""
2 
3 from collections import defaultdict
4 from collections.abc import Callable
5 from datetime import datetime, timedelta
6 
7 from async_upnp_client.exceptions import UpnpCommunicationError
8 
9 from homeassistant.core import HomeAssistant
10 from homeassistant.helpers.device_registry import DeviceEntry
11 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
12 
13 from .const import LOGGER
14 from .device import Device
15 
16 
18  DataUpdateCoordinator[dict[str, str | datetime | int | float | None]]
19 ):
20  """Define an object to update data from UPNP device."""
21 
22  def __init__(
23  self,
24  hass: HomeAssistant,
25  device: Device,
26  device_entry: DeviceEntry,
27  update_interval: timedelta,
28  ) -> None:
29  """Initialize."""
30  self.devicedevice = device
31  self.device_entrydevice_entry = device_entry
32  self._features_by_entity_id: defaultdict[str, set[str]] = defaultdict(set)
33 
34  super().__init__(
35  hass,
36  LOGGER,
37  name=device.name,
38  update_interval=update_interval,
39  )
40 
41  def register_entity(self, key: str, entity_id: str) -> Callable[[], None]:
42  """Register an entity."""
43  self._features_by_entity_id[key].add(entity_id)
44 
45  def unregister_entity() -> None:
46  """Unregister entity."""
47  self._features_by_entity_id[key].remove(entity_id)
48 
49  if not self._features_by_entity_id[key]:
50  del self._features_by_entity_id[key]
51 
52  return unregister_entity
53 
54  @property
55  def _entity_description_keys(self) -> list[str] | None:
56  """Return a list of entity description keys for which data is required."""
57  if not self._features_by_entity_id:
58  # Must be the first update, no entities attached/enabled yet.
59  return None
60 
61  return list(self._features_by_entity_id)
62 
63  async def _async_update_data(
64  self,
65  ) -> dict[str, str | datetime | int | float | None]:
66  """Update data."""
67  try:
68  return await self.devicedevice.async_get_data(self._entity_description_keys_entity_description_keys)
69  except UpnpCommunicationError as exception:
70  LOGGER.debug(
71  "Caught exception when updating device: %s, exception: %s",
72  self.devicedevice,
73  exception,
74  )
75  raise UpdateFailed(
76  f"Unable to communicate with IGD at: {self.device.device_url}"
77  ) from exception
None __init__(self, HomeAssistant hass, Device device, DeviceEntry device_entry, timedelta update_interval)
Definition: coordinator.py:28
dict[str, str|datetime|int|float|None] _async_update_data(self)
Definition: coordinator.py:65
Callable[[], None] register_entity(self, str key, str entity_id)
Definition: coordinator.py:41
bool add(self, _T matcher)
Definition: match.py:185
bool remove(self, _T matcher)
Definition: match.py:214
RadioThermUpdate async_get_data(HomeAssistant hass, CommonThermostat device)
Definition: data.py:73