1 """Representation of a deCONZ remote or keypad."""
3 from __future__
import annotations
7 from pydeconz.models.event
import EventType
8 from pydeconz.models.sensor.ancillary_control
import (
10 AncillaryControlAction,
12 from pydeconz.models.sensor.presence
import Presence, PresenceStatePresenceEvent
13 from pydeconz.models.sensor.relative_rotary
import RelativeRotary, RelativeRotaryEvent
14 from pydeconz.models.sensor.switch
import Switch
27 from .const
import ATTR_DURATION, ATTR_ROTATION, CONF_ANGLE, CONF_GESTURE, LOGGER
28 from .entity
import DeconzBase
29 from .hub
import DeconzHub
31 CONF_DECONZ_EVENT =
"deconz_event"
32 CONF_DECONZ_ALARM_EVENT =
"deconz_alarm_event"
33 CONF_DECONZ_PRESENCE_EVENT =
"deconz_presence_event"
34 CONF_DECONZ_RELATIVE_ROTARY_EVENT =
"deconz_relative_rotary_event"
36 SUPPORTED_DECONZ_ALARM_EVENTS = {
37 AncillaryControlAction.EMERGENCY,
38 AncillaryControlAction.FIRE,
39 AncillaryControlAction.INVALID_CODE,
40 AncillaryControlAction.PANIC,
42 SUPPORTED_DECONZ_PRESENCE_EVENTS = {
43 PresenceStatePresenceEvent.ENTER,
44 PresenceStatePresenceEvent.LEAVE,
45 PresenceStatePresenceEvent.ENTER_LEFT,
46 PresenceStatePresenceEvent.RIGHT_LEAVE,
47 PresenceStatePresenceEvent.ENTER_RIGHT,
48 PresenceStatePresenceEvent.LEFT_LEAVE,
49 PresenceStatePresenceEvent.APPROACHING,
50 PresenceStatePresenceEvent.ABSENTING,
52 RELATIVE_ROTARY_DECONZ_TO_EVENT = {
53 RelativeRotaryEvent.NEW:
"new",
54 RelativeRotaryEvent.REPEAT:
"repeat",
59 """Set up the deCONZ events."""
62 def async_add_sensor(_: EventType, sensor_id: str) ->
None:
63 """Create DeconzEvent."""
68 | DeconzRelativeRotaryEvent
70 sensor = hub.api.sensors[sensor_id]
72 if isinstance(sensor, Switch):
75 elif isinstance(sensor, AncillaryControl):
78 elif isinstance(sensor, Presence):
79 if sensor.presence_event
is None:
83 elif isinstance(sensor, RelativeRotary):
86 hub.hass.async_create_task(new_event.async_update_device_registry())
87 hub.events.append(new_event)
89 hub.register_platform_add_device_callback(
91 hub.api.sensors.switch,
93 hub.register_platform_add_device_callback(
95 hub.api.sensors.ancillary_control,
97 hub.register_platform_add_device_callback(
99 hub.api.sensors.presence,
101 hub.register_platform_add_device_callback(
103 hub.api.sensors.relative_rotary,
109 """Unload all deCONZ events."""
110 for event
in hub.events:
111 event.async_will_remove_from_hass()
117 """When you want signals instead of entities.
119 Stateless sensors such as remotes are expected to generate an event
120 instead of a sensor entity in hass.
125 device: AncillaryControl | Presence | RelativeRotary | Switch,
128 """Register callback that will be used for signals."""
134 self.
device_iddevice_id: str |
None =
None
136 LOGGER.debug(
"deCONZ event created: %s", self.
event_idevent_id)
140 """Disconnect event object when removed."""
145 """Fire the event if reason is that state is updated."""
146 raise NotImplementedError
149 """Update device registry."""
150 if not self.device_info:
153 device_registry = dr.async_get(self.hub.hass)
155 entry = device_registry.async_get_or_create(
156 config_entry_id=self.hub.config_entry.entry_id, **self.device_info
162 """When you want signals instead of entities.
164 Stateless sensors such as remotes are expected to generate an event
165 instead of a sensor entity in hass.
172 """Fire the event if reason is that state is updated."""
173 if self.hub.ignore_state_updates
or "state" not in self._device.changed_keys:
176 data: dict[str, Any] = {
178 CONF_UNIQUE_ID: self.serial,
179 CONF_EVENT: self._device.button_event,
183 data[CONF_DEVICE_ID] = self.
device_iddevice_id
185 if self._device.gesture
is not None:
186 data[CONF_GESTURE] = self._device.gesture
188 if self._device.angle
is not None:
189 data[CONF_ANGLE] = self._device.angle
191 if self._device.xy
is not None:
192 data[CONF_XY] = self._device.xy
194 self.hub.hass.bus.async_fire(CONF_DECONZ_EVENT, data)
198 """Alarm control panel companion event when user interacts with a keypad."""
200 _device: AncillaryControl
204 """Fire the event if reason is new action is updated."""
206 self.hub.ignore_state_updates
207 or "action" not in self._device.changed_keys
208 or self._device.action
not in SUPPORTED_DECONZ_ALARM_EVENTS
214 CONF_UNIQUE_ID: self.serial,
216 CONF_EVENT: self._device.action.value,
219 self.hub.hass.bus.async_fire(CONF_DECONZ_ALARM_EVENT, data)
223 """Presence event."""
229 """Fire the event if reason is new action is updated."""
231 self.hub.ignore_state_updates
232 or "presenceevent" not in self._device.changed_keys
233 or self._device.presence_event
not in SUPPORTED_DECONZ_PRESENCE_EVENTS
239 CONF_UNIQUE_ID: self.serial,
241 CONF_EVENT: self._device.presence_event.value,
244 self.hub.hass.bus.async_fire(CONF_DECONZ_PRESENCE_EVENT, data)
248 """Relative rotary event."""
250 _device: RelativeRotary
254 """Fire the event if reason is new action is updated."""
256 self.hub.ignore_state_updates
257 or "rotaryevent" not in self._device.changed_keys
263 CONF_UNIQUE_ID: self.serial,
265 CONF_EVENT: RELATIVE_ROTARY_DECONZ_TO_EVENT[self._device.rotary_event],
266 ATTR_ROTATION: self._device.expected_rotation,
267 ATTR_DURATION: self._device.expected_event_duration,
270 self.hub.hass.bus.async_fire(CONF_DECONZ_RELATIVE_ROTARY_EVENT, data)
None async_update_callback(self)
None async_update_callback(self)
None async_will_remove_from_hass(self)
None async_update_device_registry(self)
None __init__(self, AncillaryControl|Presence|RelativeRotary|Switch device, DeconzHub hub)
None async_update_callback(self)
None async_update_callback(self)
None async_update_callback(self)
None async_setup_events(DeconzHub hub)
None async_unload_events(DeconzHub hub)