1 """Provides device automations for Philips Hue events in V1 bridge/api."""
3 from __future__
import annotations
5 from typing
import TYPE_CHECKING
7 import voluptuous
as vol
10 DEVICE_TRIGGER_BASE_SCHEMA,
11 InvalidDeviceAutomationConfig,
27 from ..const
import ATTR_HUE_EVENT, CONF_SUBTYPE, DOMAIN
30 from ..bridge
import HueBridge
32 TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
33 {vol.Required(CONF_TYPE): str, vol.Required(CONF_SUBTYPE): str}
37 CONF_SHORT_PRESS =
"remote_button_short_press"
38 CONF_SHORT_RELEASE =
"remote_button_short_release"
39 CONF_LONG_RELEASE =
"remote_button_long_release"
40 CONF_DOUBLE_SHORT_RELEASE =
"remote_double_button_short_press"
41 CONF_DOUBLE_LONG_RELEASE =
"remote_double_button_long_press"
43 CONF_TURN_ON =
"turn_on"
44 CONF_TURN_OFF =
"turn_off"
45 CONF_DIM_UP =
"dim_up"
46 CONF_DIM_DOWN =
"dim_down"
47 CONF_BUTTON_1 =
"button_1"
48 CONF_BUTTON_2 =
"button_2"
49 CONF_BUTTON_3 =
"button_3"
50 CONF_BUTTON_4 =
"button_4"
51 CONF_DOUBLE_BUTTON_1 =
"double_buttons_1_3"
52 CONF_DOUBLE_BUTTON_2 =
"double_buttons_2_4"
54 HUE_DIMMER_REMOTE_MODEL =
"Hue dimmer switch"
56 (CONF_SHORT_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1002},
57 (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003},
58 (CONF_SHORT_RELEASE, CONF_DIM_UP): {CONF_EVENT: 2002},
59 (CONF_LONG_RELEASE, CONF_DIM_UP): {CONF_EVENT: 2003},
60 (CONF_SHORT_RELEASE, CONF_DIM_DOWN): {CONF_EVENT: 3002},
61 (CONF_LONG_RELEASE, CONF_DIM_DOWN): {CONF_EVENT: 3003},
62 (CONF_SHORT_RELEASE, CONF_TURN_OFF): {CONF_EVENT: 4002},
63 (CONF_LONG_RELEASE, CONF_TURN_OFF): {CONF_EVENT: 4003},
66 HUE_BUTTON_REMOTE_MODEL =
"Hue Smart button"
68 (CONF_SHORT_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1002},
69 (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003},
72 HUE_WALL_REMOTE_MODEL =
"Hue wall switch module"
74 (CONF_SHORT_RELEASE, CONF_BUTTON_1): {CONF_EVENT: 1002},
75 (CONF_SHORT_RELEASE, CONF_BUTTON_2): {CONF_EVENT: 2002},
78 HUE_TAP_REMOTE_MODEL =
"Hue tap switch"
80 (CONF_SHORT_PRESS, CONF_BUTTON_1): {CONF_EVENT: 34},
81 (CONF_SHORT_PRESS, CONF_BUTTON_2): {CONF_EVENT: 16},
82 (CONF_SHORT_PRESS, CONF_BUTTON_3): {CONF_EVENT: 17},
83 (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 18},
86 HUE_FOHSWITCH_REMOTE_MODEL =
"Friends of Hue Switch"
87 HUE_FOHSWITCH_REMOTE = {
88 (CONF_SHORT_PRESS, CONF_BUTTON_1): {CONF_EVENT: 20},
89 (CONF_LONG_RELEASE, CONF_BUTTON_1): {CONF_EVENT: 16},
90 (CONF_SHORT_PRESS, CONF_BUTTON_2): {CONF_EVENT: 21},
91 (CONF_LONG_RELEASE, CONF_BUTTON_2): {CONF_EVENT: 17},
92 (CONF_SHORT_PRESS, CONF_BUTTON_3): {CONF_EVENT: 23},
93 (CONF_LONG_RELEASE, CONF_BUTTON_3): {CONF_EVENT: 19},
94 (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 22},
95 (CONF_LONG_RELEASE, CONF_BUTTON_4): {CONF_EVENT: 18},
96 (CONF_DOUBLE_SHORT_RELEASE, CONF_DOUBLE_BUTTON_1): {CONF_EVENT: 101},
97 (CONF_DOUBLE_LONG_RELEASE, CONF_DOUBLE_BUTTON_1): {CONF_EVENT: 100},
98 (CONF_DOUBLE_SHORT_RELEASE, CONF_DOUBLE_BUTTON_2): {CONF_EVENT: 99},
99 (CONF_DOUBLE_LONG_RELEASE, CONF_DOUBLE_BUTTON_2): {CONF_EVENT: 98},
103 REMOTES: dict[str, dict[tuple[str, str], dict[str, int]]] = {
104 HUE_DIMMER_REMOTE_MODEL: HUE_DIMMER_REMOTE,
105 HUE_TAP_REMOTE_MODEL: HUE_TAP_REMOTE,
106 HUE_BUTTON_REMOTE_MODEL: HUE_BUTTON_REMOTE,
107 HUE_WALL_REMOTE_MODEL: HUE_WALL_REMOTE,
108 HUE_FOHSWITCH_REMOTE_MODEL: HUE_FOHSWITCH_REMOTE,
113 """Resolve hue event from device id."""
114 for bridge
in hass.data.get(DOMAIN, {}).values():
115 for hue_event
in bridge.sensor_manager.current_events.values():
116 if device_id == hue_event.device_registry_id:
123 bridge: HueBridge, device_entry: DeviceEntry, config: ConfigType
125 """Validate config."""
127 trigger = (config[CONF_TYPE], config[CONF_SUBTYPE])
131 f
"Device {config[CONF_DEVICE_ID]} not found"
134 if device_entry.model
not in REMOTES:
136 f
"Device model {device_entry.model} is not a remote"
139 if trigger
not in REMOTES[device_entry.model]:
141 f
"Device does not support trigger {trigger}"
149 device_entry: DeviceEntry,
151 action: TriggerActionType,
152 trigger_info: TriggerInfo,
154 """Listen for state changes based on configuration."""
158 if hue_event
is None:
159 raise InvalidDeviceAutomationConfig
161 trigger_key: tuple[str, str] = (config[CONF_TYPE], config[CONF_SUBTYPE])
163 assert device_entry.model
164 trigger = REMOTES[device_entry.model][trigger_key]
167 event_trigger.CONF_PLATFORM:
"event",
168 event_trigger.CONF_EVENT_TYPE: ATTR_HUE_EVENT,
169 event_trigger.CONF_EVENT_DATA: {CONF_UNIQUE_ID: hue_event.unique_id, **trigger},
172 event_config = event_trigger.TRIGGER_SCHEMA(event_config)
173 return await event_trigger.async_attach_trigger(
174 hass, event_config, action, trigger_info, platform_type=
"device"
180 """Return device triggers for device on `v1` bridge.
182 Make sure device is a supported remote model.
183 Retrieve the hue event object matching device entry.
184 Generate device trigger list.
186 if device.model
not in REMOTES:
190 for trigger, subtype
in REMOTES[device.model]:
193 CONF_DEVICE_ID: device.id,
195 CONF_PLATFORM:
"device",
197 CONF_SUBTYPE: subtype,
CALLBACK_TYPE async_attach_trigger(HueBridge bridge, DeviceEntry device_entry, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
ConfigType async_validate_trigger_config(HueBridge bridge, DeviceEntry device_entry, ConfigType config)
list[dict[str, str]] async_get_triggers(HueBridge bridge, DeviceEntry device)
def _get_hue_event_from_device_id(hass, device_id)