Home Assistant Unofficial Reference 2024.12.1
logbook.py
Go to the documentation of this file.
1 """Describe deCONZ logbook events."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 
7 from homeassistant.components.logbook import LOGBOOK_ENTRY_MESSAGE, LOGBOOK_ENTRY_NAME
8 from homeassistant.const import ATTR_DEVICE_ID, CONF_EVENT, CONF_ID
9 from homeassistant.core import Event, HomeAssistant, callback
11 
12 from .const import CONF_GESTURE, DOMAIN as DECONZ_DOMAIN
13 from .deconz_event import CONF_DECONZ_ALARM_EVENT, CONF_DECONZ_EVENT
14 from .device_trigger import (
15  CONF_BOTH_BUTTONS,
16  CONF_BOTTOM_BUTTONS,
17  CONF_BUTTON_1,
18  CONF_BUTTON_2,
19  CONF_BUTTON_3,
20  CONF_BUTTON_4,
21  CONF_BUTTON_5,
22  CONF_BUTTON_6,
23  CONF_BUTTON_7,
24  CONF_BUTTON_8,
25  CONF_CLOSE,
26  CONF_DIM_DOWN,
27  CONF_DIM_UP,
28  CONF_DOUBLE_PRESS,
29  CONF_DOUBLE_TAP,
30  CONF_LEFT,
31  CONF_LONG_PRESS,
32  CONF_LONG_RELEASE,
33  CONF_MOVE,
34  CONF_OPEN,
35  CONF_QUADRUPLE_PRESS,
36  CONF_QUINTUPLE_PRESS,
37  CONF_RIGHT,
38  CONF_ROTATE_FROM_SIDE_1,
39  CONF_ROTATE_FROM_SIDE_2,
40  CONF_ROTATE_FROM_SIDE_3,
41  CONF_ROTATE_FROM_SIDE_4,
42  CONF_ROTATE_FROM_SIDE_5,
43  CONF_ROTATE_FROM_SIDE_6,
44  CONF_ROTATED,
45  CONF_ROTATED_FAST,
46  CONF_ROTATION_STOPPED,
47  CONF_SHAKE,
48  CONF_SHORT_PRESS,
49  CONF_SHORT_RELEASE,
50  CONF_SIDE_1,
51  CONF_SIDE_2,
52  CONF_SIDE_3,
53  CONF_SIDE_4,
54  CONF_SIDE_5,
55  CONF_SIDE_6,
56  CONF_TOP_BUTTONS,
57  CONF_TRIPLE_PRESS,
58  CONF_TURN_OFF,
59  CONF_TURN_ON,
60  REMOTES,
61  _get_deconz_event_from_device,
62 )
63 
64 ACTIONS = {
65  CONF_SHORT_PRESS: "Short press",
66  CONF_SHORT_RELEASE: "Short release",
67  CONF_LONG_PRESS: "Long press",
68  CONF_LONG_RELEASE: "Long release",
69  CONF_DOUBLE_PRESS: "Double press",
70  CONF_TRIPLE_PRESS: "Triple press",
71  CONF_QUADRUPLE_PRESS: "Quadruple press",
72  CONF_QUINTUPLE_PRESS: "Quintuple press",
73  CONF_ROTATED: "Rotated",
74  CONF_ROTATED_FAST: "Rotated fast",
75  CONF_ROTATION_STOPPED: "Rotated stopped",
76  CONF_MOVE: "Move",
77  CONF_DOUBLE_TAP: "Double tap",
78  CONF_SHAKE: "Shake",
79  CONF_ROTATE_FROM_SIDE_1: "Rotate from side 1",
80  CONF_ROTATE_FROM_SIDE_2: "Rotate from side 2",
81  CONF_ROTATE_FROM_SIDE_3: "Rotate from side 3",
82  CONF_ROTATE_FROM_SIDE_4: "Rotate from side 4",
83  CONF_ROTATE_FROM_SIDE_5: "Rotate from side 5",
84  CONF_ROTATE_FROM_SIDE_6: "Rotate from side 6",
85 }
86 
87 INTERFACES = {
88  CONF_TURN_ON: "Turn on",
89  CONF_TURN_OFF: "Turn off",
90  CONF_DIM_UP: "Dim up",
91  CONF_DIM_DOWN: "Dim down",
92  CONF_LEFT: "Left",
93  CONF_RIGHT: "Right",
94  CONF_OPEN: "Open",
95  CONF_CLOSE: "Close",
96  CONF_BOTH_BUTTONS: "Both buttons",
97  CONF_TOP_BUTTONS: "Top buttons",
98  CONF_BOTTOM_BUTTONS: "Bottom buttons",
99  CONF_BUTTON_1: "Button 1",
100  CONF_BUTTON_2: "Button 2",
101  CONF_BUTTON_3: "Button 3",
102  CONF_BUTTON_4: "Button 4",
103  CONF_BUTTON_5: "Button 5",
104  CONF_BUTTON_6: "Button 6",
105  CONF_BUTTON_7: "Button 7",
106  CONF_BUTTON_8: "Button 8",
107  CONF_SIDE_1: "Side 1",
108  CONF_SIDE_2: "Side 2",
109  CONF_SIDE_3: "Side 3",
110  CONF_SIDE_4: "Side 4",
111  CONF_SIDE_5: "Side 5",
112  CONF_SIDE_6: "Side 6",
113 }
114 
115 
117  modelid: str, event: int
118 ) -> tuple[str | None, str | None]:
119  """Get device event description."""
120  device_event_descriptions = REMOTES[modelid]
121 
122  for event_type_tuple, event_dict in device_event_descriptions.items():
123  if event == event_dict.get(CONF_EVENT):
124  return event_type_tuple
125  if event == event_dict.get(CONF_GESTURE):
126  return event_type_tuple
127 
128  return (None, None)
129 
130 
131 @callback
133  hass: HomeAssistant,
134  async_describe_event: Callable[[str, str, Callable[[Event], dict[str, str]]], None],
135 ) -> None:
136  """Describe logbook events."""
137  device_registry = dr.async_get(hass)
138 
139  @callback
140  def async_describe_deconz_alarm_event(event: Event) -> dict[str, str]:
141  """Describe deCONZ logbook alarm event."""
142  if device := device_registry.devices.get(event.data[ATTR_DEVICE_ID]):
143  deconz_alarm_event = _get_deconz_event_from_device(hass, device)
144  name = deconz_alarm_event.device.name
145  else:
146  name = event.data[CONF_ID]
147 
148  data = event.data[CONF_EVENT]
149 
150  return {
151  LOGBOOK_ENTRY_NAME: name,
152  LOGBOOK_ENTRY_MESSAGE: f"fired event '{data}'",
153  }
154 
155  @callback
156  def async_describe_deconz_event(event: Event) -> dict[str, str]:
157  """Describe deCONZ logbook event."""
158  if device := device_registry.devices.get(event.data[ATTR_DEVICE_ID]):
159  deconz_event = _get_deconz_event_from_device(hass, device)
160  name = deconz_event.device.name
161  else:
162  deconz_event = None
163  name = event.data[CONF_ID]
164 
165  action = None
166  interface = None
167  data = event.data.get(CONF_EVENT) or event.data.get(CONF_GESTURE, "")
168 
169  if data and deconz_event and deconz_event.device.model_id in REMOTES:
170  action, interface = _get_device_event_description(
171  deconz_event.device.model_id, data
172  )
173 
174  # Unknown event
175  if not data:
176  return {
177  LOGBOOK_ENTRY_NAME: name,
178  LOGBOOK_ENTRY_MESSAGE: "fired an unknown event",
179  }
180 
181  # No device event match
182  if not action:
183  return {
184  LOGBOOK_ENTRY_NAME: name,
185  LOGBOOK_ENTRY_MESSAGE: f"fired event '{data}'",
186  }
187 
188  # Gesture event
189  if not interface:
190  return {
191  LOGBOOK_ENTRY_NAME: name,
192  LOGBOOK_ENTRY_MESSAGE: f"fired event '{ACTIONS[action]}'",
193  }
194 
195  return {
196  LOGBOOK_ENTRY_NAME: name,
197  LOGBOOK_ENTRY_MESSAGE: (
198  f"'{ACTIONS[action]}' event for '{INTERFACES[interface]}' was fired"
199  ),
200  }
201 
202  async_describe_event(
203  DECONZ_DOMAIN, CONF_DECONZ_ALARM_EVENT, async_describe_deconz_alarm_event
204  )
205  async_describe_event(DECONZ_DOMAIN, CONF_DECONZ_EVENT, async_describe_deconz_event)
DeconzAlarmEvent|DeconzEvent|DeconzPresenceEvent|DeconzRelativeRotaryEvent _get_deconz_event_from_device(HomeAssistant hass, dr.DeviceEntry device)
tuple[str|None, str|None] _get_device_event_description(str modelid, int event)
Definition: logbook.py:118
None async_describe_events(HomeAssistant hass, Callable[[str, str, Callable[[Event], dict[str, str]]], None] async_describe_event)
Definition: logbook.py:135