Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Event entity for Knocki integration."""
2 
3 from knocki import Event, EventType, KnockiClient, Trigger
4 
5 from homeassistant.components.event import EventEntity
6 from homeassistant.core import HomeAssistant, callback
7 from homeassistant.helpers.device_registry import DeviceInfo
8 from homeassistant.helpers.entity_platform import AddEntitiesCallback
9 
10 from . import KnockiConfigEntry
11 from .const import DOMAIN
12 
13 
15  hass: HomeAssistant,
16  entry: KnockiConfigEntry,
17  async_add_entities: AddEntitiesCallback,
18 ) -> None:
19  """Set up Knocki from a config entry."""
20  coordinator = entry.runtime_data
21 
22  added_triggers = set(coordinator.data)
23 
24  @callback
25  def _async_add_entities() -> None:
26  current_triggers = set(coordinator.data)
27  new_triggers = current_triggers - added_triggers
28  added_triggers.update(new_triggers)
29  if new_triggers:
31  KnockiTrigger(coordinator.data[trigger], coordinator.client)
32  for trigger in new_triggers
33  )
34 
35  coordinator.async_add_listener(_async_add_entities)
36 
38  KnockiTrigger(trigger, coordinator.client)
39  for trigger in coordinator.data.values()
40  )
41 
42 
43 EVENT_TRIGGERED = "triggered"
44 
45 
47  """Representation of a Knocki trigger."""
48 
49  _attr_event_types = [EVENT_TRIGGERED]
50  _attr_has_entity_name = True
51  _attr_should_poll = False
52  _attr_translation_key = "knocki"
53 
54  def __init__(self, trigger: Trigger, client: KnockiClient) -> None:
55  """Initialize the entity."""
56  self._trigger_trigger = trigger
57  self._client_client = client
58  self._attr_name_attr_name = trigger.details.name
59  self._attr_device_info_attr_device_info = DeviceInfo(
60  identifiers={(DOMAIN, trigger.device_id)},
61  manufacturer="Knocki",
62  serial_number=trigger.device_id,
63  name=trigger.device_id,
64  )
65  self._attr_unique_id_attr_unique_id = f"{trigger.device_id}_{trigger.details.trigger_id}"
66 
67  async def async_added_to_hass(self) -> None:
68  """Register listener."""
69  await super().async_added_to_hass()
70  self.async_on_removeasync_on_remove(
71  self._client_client.register_listener(EventType.TRIGGERED, self._handle_event_handle_event)
72  )
73 
74  def _handle_event(self, event: Event) -> None:
75  """Handle incoming event."""
76  if (
77  event.payload.details.trigger_id == self._trigger_trigger.details.trigger_id
78  and event.payload.device_id == self._trigger_trigger.device_id
79  ):
80  self._trigger_event_trigger_event(EVENT_TRIGGERED)
81  self.schedule_update_ha_stateschedule_update_ha_state()
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
None __init__(self, Trigger trigger, KnockiClient client)
Definition: event.py:54
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
None _async_add_entities(AvmWrapper avm_wrapper, AddEntitiesCallback async_add_entities, FritzData data_fritz)
None async_setup_entry(HomeAssistant hass, KnockiConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: event.py:18