Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Event platform for Google Nest."""
2 
3 from dataclasses import dataclass
4 import logging
5 
6 from google_nest_sdm.device import Device
7 from google_nest_sdm.device_manager import DeviceManager
8 from google_nest_sdm.event import EventMessage, EventType
9 from google_nest_sdm.traits import TraitType
10 
12  EventDeviceClass,
13  EventEntity,
14  EventEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DATA_DEVICE_MANAGER, DOMAIN
21 from .device_info import NestDeviceInfo
22 from .events import (
23  EVENT_CAMERA_MOTION,
24  EVENT_CAMERA_PERSON,
25  EVENT_CAMERA_SOUND,
26  EVENT_DOORBELL_CHIME,
27  EVENT_NAME_MAP,
28 )
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 
33 @dataclass(kw_only=True, frozen=True)
35  """Entity description for nest event entities."""
36 
37  trait_types: list[TraitType]
38  api_event_types: list[EventType]
39  event_types: list[str]
40 
41 
42 ENTITY_DESCRIPTIONS = [
44  key=EVENT_DOORBELL_CHIME,
45  translation_key="chime",
46  device_class=EventDeviceClass.DOORBELL,
47  event_types=[EVENT_DOORBELL_CHIME],
48  trait_types=[TraitType.DOORBELL_CHIME],
49  api_event_types=[EventType.DOORBELL_CHIME],
50  ),
52  key=EVENT_CAMERA_MOTION,
53  translation_key="motion",
54  device_class=EventDeviceClass.MOTION,
55  event_types=[EVENT_CAMERA_MOTION, EVENT_CAMERA_PERSON, EVENT_CAMERA_SOUND],
56  trait_types=[
57  TraitType.CAMERA_MOTION,
58  TraitType.CAMERA_PERSON,
59  TraitType.CAMERA_SOUND,
60  ],
61  api_event_types=[
62  EventType.CAMERA_MOTION,
63  EventType.CAMERA_PERSON,
64  EventType.CAMERA_SOUND,
65  ],
66  ),
67 ]
68 
69 
71  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
72 ) -> None:
73  """Set up the sensors."""
74 
75  device_manager: DeviceManager = hass.data[DOMAIN][entry.entry_id][
76  DATA_DEVICE_MANAGER
77  ]
79  NestTraitEventEntity(desc, device)
80  for device in device_manager.devices.values()
81  for desc in ENTITY_DESCRIPTIONS
82  if any(trait in device.traits for trait in desc.trait_types)
83  )
84 
85 
87  """Nest doorbell event entity."""
88 
89  entity_description: NestEventEntityDescription
90  _attr_has_entity_name = True
91 
92  def __init__(
93  self, entity_description: NestEventEntityDescription, device: Device
94  ) -> None:
95  """Initialize the event entity."""
96  self.entity_descriptionentity_description = entity_description
97  self._device_device = device
98  self._attr_unique_id_attr_unique_id = f"{device.name}-{entity_description.key}"
99  self._attr_device_info_attr_device_info = NestDeviceInfo(device).device_info
100 
101  async def _async_handle_event(self, event_message: EventMessage) -> None:
102  """Handle a device event."""
103  if (
104  event_message.relation_update
105  or not event_message.resource_update_name
106  or not (events := event_message.resource_update_events)
107  ):
108  return
109  last_nest_event_id = self.state_attributesstate_attributesstate_attributes.get("nest_event_id")
110  for api_event_type, nest_event in events.items():
111  if api_event_type not in self.entity_descriptionentity_description.api_event_types:
112  continue
113 
114  event_type = EVENT_NAME_MAP[api_event_type]
115  nest_event_id = nest_event.event_token
116  if last_nest_event_id is not None and last_nest_event_id == nest_event_id:
117  # This event is a duplicate message in the same thread
118  return
119 
120  self._trigger_event_trigger_event(
121  event_type,
122  {"nest_event_id": nest_event_id},
123  )
124  self.async_write_ha_stateasync_write_ha_state()
125  return
126 
127  async def async_added_to_hass(self) -> None:
128  """Run when entity is added to attach an event listener."""
129  self.async_on_removeasync_on_remove(self._device_device.add_event_callback(self._async_handle_event_async_handle_event))
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
None _async_handle_event(self, EventMessage event_message)
Definition: event.py:101
None __init__(self, NestEventEntityDescription entity_description, Device device)
Definition: event.py:94
dict[str, Any]|None state_attributes(self)
Definition: entity.py:778
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: event.py:72