Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Support for august events."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import TYPE_CHECKING
8 
9 from yalexs.activity import Activity
10 from yalexs.doorbell import DoorbellDetail
11 from yalexs.lock import LockDetail
12 
14  EventDeviceClass,
15  EventEntity,
16  EventEntityDescription,
17 )
18 from homeassistant.core import HomeAssistant, callback
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from . import AugustConfigEntry, AugustData
22 from .entity import AugustDescriptionEntity
23 from .util import (
24  retrieve_ding_activity,
25  retrieve_doorbell_motion_activity,
26  retrieve_online_state,
27 )
28 
29 
30 @dataclass(kw_only=True, frozen=True)
32  """Describe august event entities."""
33 
34  value_fn: Callable[[AugustData, DoorbellDetail | LockDetail], Activity | None]
35 
36 
37 TYPES_VIDEO_DOORBELL: tuple[AugustEventEntityDescription, ...] = (
39  key="motion",
40  translation_key="motion",
41  device_class=EventDeviceClass.MOTION,
42  event_types=["motion"],
43  value_fn=retrieve_doorbell_motion_activity,
44  ),
45 )
46 
47 
48 TYPES_DOORBELL: tuple[AugustEventEntityDescription, ...] = (
50  key="doorbell",
51  translation_key="doorbell",
52  device_class=EventDeviceClass.DOORBELL,
53  event_types=["ring"],
54  value_fn=retrieve_ding_activity,
55  ),
56 )
57 
58 
60  hass: HomeAssistant,
61  config_entry: AugustConfigEntry,
62  async_add_entities: AddEntitiesCallback,
63 ) -> None:
64  """Set up the august event platform."""
65  data = config_entry.runtime_data
66  entities: list[AugustEventEntity] = [
67  AugustEventEntity(data, lock, description)
68  for description in TYPES_DOORBELL
69  for lock in data.locks
70  if (detail := data.get_device_detail(lock.device_id)) and detail.doorbell
71  ]
72  entities.extend(
73  AugustEventEntity(data, doorbell, description)
74  for description in TYPES_DOORBELL + TYPES_VIDEO_DOORBELL
75  for doorbell in data.doorbells
76  )
77  async_add_entities(entities)
78 
79 
81  """An august event entity."""
82 
83  entity_description: AugustEventEntityDescription
84  _last_activity: Activity | None = None
85 
86  @callback
87  def _update_from_data(self) -> None:
88  """Update from data."""
89  self._attr_available_attr_available = retrieve_online_state(self._data_data, self._detail_detail)
90  current_activity = self.entity_descriptionentity_description.value_fn(self._data_data, self._detail_detail)
91  if not current_activity or current_activity == self._last_activity_last_activity:
92  return
93  self._last_activity_last_activity = current_activity
94  event_types = self.entity_descriptionentity_description.event_types
95  if TYPE_CHECKING:
96  assert event_types is not None
97  self._trigger_event_trigger_event(event_type=event_types[0])
98  self.async_write_ha_stateasync_write_ha_state()
DoorbellDetail|LockDetail _detail(self)
Definition: entity.py:53
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
None async_setup_entry(HomeAssistant hass, AugustConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: event.py:63
bool retrieve_online_state(AugustData data, DoorbellDetail|LockDetail detail)
Definition: util.py:73