1 """Provides device automations for Philips Hue events."""
3 from __future__
import annotations
5 from typing
import TYPE_CHECKING, Any
7 from aiohue.v2.models.resource
import ResourceTypes
8 import voluptuous
as vol
26 DEFAULT_BUTTON_EVENT_TYPES,
27 DEFAULT_ROTARY_EVENT_SUBTYPES,
28 DEFAULT_ROTARY_EVENT_TYPES,
29 DEVICE_SPECIFIC_EVENT_TYPES,
34 from aiohue.v2
import HueBridgeV2
38 from ..bridge
import HueBridge
40 TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
42 vol.Required(CONF_TYPE): str,
43 vol.Required(CONF_SUBTYPE): vol.Union(int, str),
44 vol.Optional(CONF_UNIQUE_ID): str,
51 device_entry: DeviceEntry,
54 """Validate config."""
60 device_entry: DeviceEntry,
62 action: TriggerActionType,
63 trigger_info: TriggerInfo,
65 """Listen for state changes based on configuration."""
67 event_config = event_trigger.TRIGGER_SCHEMA(
69 event_trigger.CONF_PLATFORM:
"event",
70 event_trigger.CONF_EVENT_TYPE: ATTR_HUE_EVENT,
71 event_trigger.CONF_EVENT_DATA: {
72 CONF_DEVICE_ID: config[CONF_DEVICE_ID],
73 CONF_TYPE: config[CONF_TYPE],
74 CONF_SUBTYPE: config[CONF_SUBTYPE],
78 return await event_trigger.async_attach_trigger(
79 hass, event_config, action, trigger_info, platform_type=
"device"
85 bridge: HueBridge, device_entry: DeviceEntry
86 ) -> list[dict[str, Any]]:
87 """Return device triggers for device on `v2` bridge."""
88 api: HueBridgeV2 = bridge.api
93 triggers: list[dict[str, Any]] = []
94 model_id = api.devices[hue_dev_id].product_data.product_name
96 for resource
in api.devices.get_sensors(hue_dev_id):
98 if resource.type == ResourceTypes.BUTTON:
101 CONF_DEVICE_ID: device_entry.id,
103 CONF_PLATFORM:
"device",
104 CONF_TYPE: event_type.value,
105 CONF_SUBTYPE: resource.metadata.control_id,
106 CONF_UNIQUE_ID: resource.id,
108 for event_type
in DEVICE_SPECIFIC_EVENT_TYPES.get(
109 model_id, DEFAULT_BUTTON_EVENT_TYPES
113 elif resource.type == ResourceTypes.RELATIVE_ROTARY:
116 CONF_DEVICE_ID: device_entry.id,
118 CONF_PLATFORM:
"device",
119 CONF_TYPE: event_type.value,
120 CONF_SUBTYPE: sub_type.value,
121 CONF_UNIQUE_ID: resource.id,
123 for event_type
in DEFAULT_ROTARY_EVENT_TYPES
124 for sub_type
in DEFAULT_ROTARY_EVENT_SUBTYPES
131 """Get Hue device id from device entry."""
135 for identifier
in device_entry.identifiers
136 if identifier[0] == DOMAIN
137 and ":" not in identifier[1]
list[dict[str, Any]] async_get_triggers(HueBridge bridge, DeviceEntry device_entry)
CALLBACK_TYPE async_attach_trigger(HueBridge bridge, DeviceEntry device_entry, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
str|None get_hue_device_id(DeviceEntry device_entry)
ConfigType async_validate_trigger_config(HueBridge bridge, DeviceEntry device_entry, ConfigType config)