Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Update coordinator for Knocki integration."""
2 
3 from knocki import Event, KnockiClient, KnockiConnectionError, Trigger
4 
5 from homeassistant.components.event import DOMAIN as EVENT_DOMAIN
6 from homeassistant.core import HomeAssistant, callback
7 from homeassistant.helpers import entity_registry as er
8 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
9 
10 from .const import DOMAIN, LOGGER
11 
12 
13 class KnockiCoordinator(DataUpdateCoordinator[dict[int, Trigger]]):
14  """The Knocki coordinator."""
15 
16  def __init__(self, hass: HomeAssistant, client: KnockiClient) -> None:
17  """Initialize the coordinator."""
18  super().__init__(
19  hass,
20  logger=LOGGER,
21  name=DOMAIN,
22  )
23  self.clientclient = client
24  self._known_triggers_known_triggers: set[tuple[str, int]] = set()
25 
26  async def _async_update_data(self) -> dict[int, Trigger]:
27  try:
28  triggers = await self.clientclient.get_triggers()
29  except KnockiConnectionError as exc:
30  raise UpdateFailed from exc
31  current_triggers = {
32  (trigger.device_id, trigger.details.trigger_id) for trigger in triggers
33  }
34  removed_triggers = self._known_triggers_known_triggers - current_triggers
35  for trigger in removed_triggers:
36  self._async_delete_device_async_delete_device(trigger)
37  self._known_triggers_known_triggers = current_triggers
38  return {trigger.details.trigger_id: trigger for trigger in triggers}
39 
40  def add_trigger(self, event: Event) -> None:
41  """Add a trigger to the coordinator."""
42  self.async_set_updated_dataasync_set_updated_data(
43  {**self.datadata, event.payload.details.trigger_id: event.payload}
44  )
45  self._known_triggers_known_triggers.add(
46  (event.payload.device_id, event.payload.details.trigger_id)
47  )
48 
49  @callback
50  def _async_delete_device(self, trigger: tuple[str, int]) -> None:
51  """Delete a device from the coordinator."""
52  device_id, trigger_id = trigger
53  entity_registry = er.async_get(self.hasshass)
54  entity_entry = entity_registry.async_get_entity_id(
55  EVENT_DOMAIN, DOMAIN, f"{device_id}_{trigger_id}"
56  )
57  if entity_entry:
58  entity_registry.async_remove(entity_entry)
None __init__(self, HomeAssistant hass, KnockiClient client)
Definition: coordinator.py:16
None _async_delete_device(self, tuple[str, int] trigger)
Definition: coordinator.py:50
bool add(self, _T matcher)
Definition: match.py:185