Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Hue event entities from Button resources."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from aiohue.v2 import HueBridgeV2
8 from aiohue.v2.controllers.events import EventType
9 from aiohue.v2.models.button import Button
10 from aiohue.v2.models.relative_rotary import RelativeRotary, RelativeRotaryDirection
11 
13  EventDeviceClass,
14  EventEntity,
15  EventEntityDescription,
16 )
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.core import HomeAssistant, callback
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from .bridge import HueBridge
22 from .const import DEFAULT_BUTTON_EVENT_TYPES, DEVICE_SPECIFIC_EVENT_TYPES, DOMAIN
23 from .v2.entity import HueBaseEntity
24 
25 
27  hass: HomeAssistant,
28  config_entry: ConfigEntry,
29  async_add_entities: AddEntitiesCallback,
30 ) -> None:
31  """Set up event platform from Hue button resources."""
32  bridge: HueBridge = hass.data[DOMAIN][config_entry.entry_id]
33  api: HueBridgeV2 = bridge.api
34 
35  if bridge.api_version == 1:
36  # should not happen, but just in case
37  raise NotImplementedError("Event support is only available for V2 bridges")
38 
39  # add entities for all button and relative rotary resources
40  @callback
41  def async_add_entity(
42  event_type: EventType,
43  resource: Button | RelativeRotary,
44  ) -> None:
45  """Add entity from Hue resource."""
46  if isinstance(resource, RelativeRotary):
48  [HueRotaryEventEntity(bridge, api.sensors.relative_rotary, resource)]
49  )
50  else:
52  [HueButtonEventEntity(bridge, api.sensors.button, resource)]
53  )
54 
55  for controller in (api.sensors.button, api.sensors.relative_rotary):
56  # add all current items in controller
57  for item in controller:
58  async_add_entity(EventType.RESOURCE_ADDED, item)
59 
60  # register listener for new items only
61  config_entry.async_on_unload(
62  controller.subscribe(
63  async_add_entity, event_filter=EventType.RESOURCE_ADDED
64  )
65  )
66 
67 
69  """Representation of a Hue Event entity from a button resource."""
70 
71  entity_description = EventEntityDescription(
72  key="button",
73  device_class=EventDeviceClass.BUTTON,
74  translation_key="button",
75  has_entity_name=True,
76  )
77 
78  def __init__(self, *args: Any, **kwargs: Any) -> None:
79  """Initialize the entity."""
80  super().__init__(*args, **kwargs)
81  # fill the event types based on the features the switch supports
82  hue_dev_id = self.controllercontroller.get_device(self.resourceresource.id).id
83  model_id = self.bridgebridge.api.devices[hue_dev_id].product_data.product_name
84  self._attr_event_types: list[str] = [
85  event_type.value
86  for event_type in DEVICE_SPECIFIC_EVENT_TYPES.get(
87  model_id, DEFAULT_BUTTON_EVENT_TYPES
88  )
89  ]
90  self._attr_translation_placeholders_attr_translation_placeholders = {
91  "button_id": self.resourceresource.metadata.control_id
92  }
93 
94  @callback
95  def _handle_event(self, event_type: EventType, resource: Button) -> None:
96  """Handle status event for this resource (or it's parent)."""
97  if event_type == EventType.RESOURCE_UPDATED and resource.id == self.resourceresource.id:
98  if resource.button is None or resource.button.button_report is None:
99  return
100  self._trigger_event_trigger_event(resource.button.button_report.event.value)
101  self.async_write_ha_stateasync_write_ha_state()
102  return
103  super()._handle_event(event_type, resource)
104 
105 
107  """Representation of a Hue Event entity from a RelativeRotary resource."""
108 
109  entity_description = EventEntityDescription(
110  key="rotary",
111  device_class=EventDeviceClass.BUTTON,
112  translation_key="rotary",
113  event_types=[
114  RelativeRotaryDirection.CLOCK_WISE.value,
115  RelativeRotaryDirection.COUNTER_CLOCK_WISE.value,
116  ],
117  has_entity_name=True,
118  )
119 
120  @callback
121  def _handle_event(self, event_type: EventType, resource: RelativeRotary) -> None:
122  """Handle status event for this resource (or it's parent)."""
123  if event_type == EventType.RESOURCE_UPDATED and resource.id == self.resourceresource.id:
124  if (
125  resource.relative_rotary is None
126  or resource.relative_rotary.rotary_report is None
127  ):
128  return
129  event_key = resource.relative_rotary.rotary_report.rotation.direction.value
130  event_data = {
131  "duration": resource.relative_rotary.rotary_report.rotation.duration,
132  "steps": resource.relative_rotary.rotary_report.rotation.steps,
133  "action": resource.relative_rotary.rotary_report.action.value,
134  }
135  self._trigger_event_trigger_event(event_key, event_data)
136  self.async_write_ha_stateasync_write_ha_state()
137  return
138  super()._handle_event(event_type, resource)
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
None _handle_event(self, EventType event_type, Button resource)
Definition: event.py:95
None __init__(self, *Any args, **Any kwargs)
Definition: event.py:78
None _handle_event(self, EventType event_type, RelativeRotary resource)
Definition: event.py:121
DeviceEntry get_device(HomeAssistant hass, str unique_id)
Definition: util.py:12
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: event.py:30