1 """Handle forward of events transmitted by Hue devices to HASS."""
3 from __future__
import annotations
6 from typing
import TYPE_CHECKING
8 from aiohue.v2
import HueBridgeV2
9 from aiohue.v2.controllers.events
import EventType
10 from aiohue.v2.models.button
import Button
11 from aiohue.v2.models.relative_rotary
import RelativeRotary
18 from ..const
import ATTR_HUE_EVENT, CONF_SUBTYPE, DOMAIN
20 CONF_CONTROL_ID =
"control_id"
21 CONF_DURATION =
"duration"
25 from ..bridge
import HueBridge
27 LOGGER = logging.getLogger(__name__)
31 """Manage listeners for stateless Hue sensors that emit events."""
33 api: HueBridgeV2 = bridge.api
34 conf_entry = bridge.config_entry
35 dev_reg = dr.async_get(hass)
37 btn_controller = api.sensors.button
38 rotary_controller = api.sensors.relative_rotary
41 def handle_button_event(evt_type: EventType, hue_resource: Button) ->
None:
42 """Handle event from Hue button resource controller."""
43 LOGGER.debug(
"Received button event: %s", hue_resource)
46 if hue_resource.button
is None:
49 hue_device = btn_controller.get_device(hue_resource.id)
50 device = dev_reg.async_get_device(identifiers={(DOMAIN, hue_device.id)})
55 CONF_ID:
slugify(f
"{hue_device.metadata.name} Button"),
56 CONF_DEVICE_ID: device.id,
57 CONF_UNIQUE_ID: hue_resource.id,
58 CONF_TYPE: hue_resource.button.button_report.event.value,
59 CONF_SUBTYPE: hue_resource.metadata.control_id,
61 hass.bus.async_fire(ATTR_HUE_EVENT, data)
64 conf_entry.async_on_unload(
65 btn_controller.subscribe(
66 handle_button_event, event_filter=EventType.RESOURCE_UPDATED
71 def handle_rotary_event(evt_type: EventType, hue_resource: RelativeRotary) ->
None:
72 """Handle event from Hue relative_rotary resource controller."""
73 LOGGER.debug(
"Received relative_rotary event: %s", hue_resource)
75 hue_device = btn_controller.get_device(hue_resource.id)
76 device = dev_reg.async_get_device(identifiers={(DOMAIN, hue_device.id)})
80 CONF_DEVICE_ID: device.id,
81 CONF_UNIQUE_ID: hue_resource.id,
82 CONF_TYPE: hue_resource.relative_rotary.rotary_report.action.value,
83 CONF_SUBTYPE: hue_resource.relative_rotary.rotary_report.rotation.direction.value,
84 CONF_DURATION: hue_resource.relative_rotary.rotary_report.rotation.duration,
85 CONF_STEPS: hue_resource.relative_rotary.rotary_report.rotation.steps,
87 hass.bus.async_fire(ATTR_HUE_EVENT, data)
90 conf_entry.async_on_unload(
91 rotary_controller.subscribe(
92 handle_rotary_event, event_filter=EventType.RESOURCE_UPDATED
def async_setup_hue_events(HueBridge bridge)