1 """Provides device triggers for lutron caseta."""
3 from __future__
import annotations
6 from typing
import cast
8 import voluptuous
as vol
30 LUTRON_CASETA_BUTTON_EVENT,
32 from .models
import LutronCasetaConfigEntry
34 _LOGGER = logging.getLogger(__name__)
38 """Reverse a dictionary."""
39 return {v: k
for k, v
in forward_dict.items()}
42 SUPPORTED_INPUTS_EVENTS_TYPES = [ACTION_PRESS, ACTION_RELEASE]
44 LUTRON_BUTTON_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
46 vol.Required(CONF_TYPE): vol.In(SUPPORTED_INPUTS_EVENTS_TYPES),
51 KEYPAD_LEAP_BUTTON_NAME_OVERRIDE = {
65 PICO_2_BUTTON_BUTTON_TYPES_TO_LIP = {
69 PICO_2_BUTTON_BUTTON_TYPES_TO_LEAP = {
73 PICO_2_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
75 vol.Required(CONF_SUBTYPE): vol.In(PICO_2_BUTTON_BUTTON_TYPES_TO_LIP),
80 PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP = {
86 PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LEAP = {
92 PICO_2_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
94 vol.Required(CONF_SUBTYPE): vol.In(
95 PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP
101 PICO_3_BUTTON_BUTTON_TYPES_TO_LIP = {
106 PICO_3_BUTTON_BUTTON_TYPES_TO_LEAP = {
111 PICO_3_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
113 vol.Required(CONF_SUBTYPE): vol.In(PICO_3_BUTTON_BUTTON_TYPES_TO_LIP),
117 PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP = {
124 PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LEAP = {
131 PICO_3_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
133 vol.Required(CONF_SUBTYPE): vol.In(
134 PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP
139 PICO_4_BUTTON_BUTTON_TYPES_TO_LIP = {
145 PICO_4_BUTTON_BUTTON_TYPES_TO_LEAP = {
151 LEAP_TO_PICO_4_BUTTON_BUTTON_TYPES = {
152 v: k
for k, v
in PICO_4_BUTTON_BUTTON_TYPES_TO_LEAP.items()
154 PICO_4_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
156 vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_BUTTON_TYPES_TO_LIP),
161 PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LIP = {
167 PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LEAP = {
173 LEAP_TO_PICO_4_BUTTON_ZONE_BUTTON_TYPES = {
174 v: k
for k, v
in PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LEAP.items()
176 PICO_4_BUTTON_ZONE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
178 vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LIP),
183 PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LIP = {
189 PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LEAP = {
195 PICO_4_BUTTON_SCENE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
197 vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LIP),
202 PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LIP = {
203 "group_1_button_1": 8,
204 "group_1_button_2": 9,
205 "group_2_button_1": 10,
206 "group_2_button_2": 11,
208 PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LEAP = {
209 "group_1_button_1": 1,
210 "group_1_button_2": 2,
211 "group_2_button_1": 3,
212 "group_2_button_2": 4,
214 PICO_4_BUTTON_2_GROUP_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
216 vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LIP),
220 FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LIP = {
247 FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LEAP = {
274 FOUR_GROUP_REMOTE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend(
276 vol.Required(CONF_SUBTYPE): vol.In(FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LIP),
281 DEVICE_TYPE_SCHEMA_MAP = {
282 "Pico2Button": PICO_2_BUTTON_TRIGGER_SCHEMA,
283 "Pico2ButtonRaiseLower": PICO_2_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA,
284 "Pico3Button": PICO_3_BUTTON_TRIGGER_SCHEMA,
285 "Pico3ButtonRaiseLower": PICO_3_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA,
286 "Pico4Button": PICO_4_BUTTON_TRIGGER_SCHEMA,
287 "Pico4ButtonScene": PICO_4_BUTTON_SCENE_TRIGGER_SCHEMA,
288 "Pico4ButtonZone": PICO_4_BUTTON_ZONE_TRIGGER_SCHEMA,
289 "Pico4Button2Group": PICO_4_BUTTON_2_GROUP_TRIGGER_SCHEMA,
290 "FourGroupRemote": FOUR_GROUP_REMOTE_TRIGGER_SCHEMA,
293 DEVICE_TYPE_SUBTYPE_MAP_TO_LIP = {
294 "Pico2Button": PICO_2_BUTTON_BUTTON_TYPES_TO_LIP,
295 "Pico2ButtonRaiseLower": PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP,
296 "Pico3Button": PICO_3_BUTTON_BUTTON_TYPES_TO_LIP,
297 "Pico3ButtonRaiseLower": PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP,
298 "Pico4Button": PICO_4_BUTTON_BUTTON_TYPES_TO_LIP,
299 "Pico4ButtonScene": PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LIP,
300 "Pico4ButtonZone": PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LIP,
301 "Pico4Button2Group": PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LIP,
302 "FourGroupRemote": FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LIP,
305 DEVICE_TYPE_SUBTYPE_MAP_TO_LEAP = {
306 "Pico2Button": PICO_2_BUTTON_BUTTON_TYPES_TO_LEAP,
307 "Pico2ButtonRaiseLower": PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LEAP,
308 "Pico3Button": PICO_3_BUTTON_BUTTON_TYPES_TO_LEAP,
309 "Pico3ButtonRaiseLower": PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LEAP,
310 "Pico4Button": PICO_4_BUTTON_BUTTON_TYPES_TO_LEAP,
311 "Pico4ButtonScene": PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LEAP,
312 "Pico4ButtonZone": PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LEAP,
313 "Pico4Button2Group": PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LEAP,
314 "FourGroupRemote": FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LEAP,
317 LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP: dict[str, dict[int, str]] = {
318 k:
_reverse_dict(v)
for k, v
in DEVICE_TYPE_SUBTYPE_MAP_TO_LEAP.items()
321 TRIGGER_SCHEMA = vol.Any(
322 PICO_2_BUTTON_TRIGGER_SCHEMA,
323 PICO_3_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA,
324 PICO_4_BUTTON_TRIGGER_SCHEMA,
325 PICO_4_BUTTON_SCENE_TRIGGER_SCHEMA,
326 PICO_4_BUTTON_ZONE_TRIGGER_SCHEMA,
327 PICO_4_BUTTON_2_GROUP_TRIGGER_SCHEMA,
328 FOUR_GROUP_REMOTE_TRIGGER_SCHEMA,
333 hass: HomeAssistant, config: ConfigType
335 """Validate trigger config."""
337 device_id = config[CONF_DEVICE_ID]
338 subtype = config[CONF_SUBTYPE]
341 keypad := data.keypad_data.dr_device_id_to_keypad.get(device_id)
345 keypad_trigger_schemas = data.keypad_data.trigger_schemas
346 keypad_button_names_to_leap = data.keypad_data.button_names_to_leap
350 schema := DEVICE_TYPE_SCHEMA_MAP.get(
352 keypad_trigger_schemas.get(keypad[
"lutron_device_id"]),
357 "Cannot validate trigger %s because the trigger schema was not found",
363 device_type = keypad[
"type"]
364 valid_buttons = DEVICE_TYPE_SUBTYPE_MAP_TO_LEAP.get(
366 keypad_button_names_to_leap[keypad[
"lutron_device_id"]],
369 if subtype
not in valid_buttons:
372 "Cannot validate trigger %s because subtype %s is invalid", config, subtype
376 return schema(config)
380 hass: HomeAssistant, device_id: str
381 ) -> list[dict[str, str]]:
382 """List device triggers for lutron caseta devices."""
385 keypad := data.keypad_data.dr_device_id_to_keypad.get(device_id)
389 keypad_button_names_to_leap = data.keypad_data.button_names_to_leap
392 valid_buttons = DEVICE_TYPE_SUBTYPE_MAP_TO_LEAP.get(
394 keypad_button_names_to_leap[keypad[
"lutron_device_id"]],
399 CONF_PLATFORM:
"device",
400 CONF_DEVICE_ID: device_id,
403 CONF_SUBTYPE: subtype,
405 for trigger
in SUPPORTED_INPUTS_EVENTS_TYPES
406 for subtype
in valid_buttons
413 action: TriggerActionType,
414 trigger_info: TriggerInfo,
416 """Attach a trigger."""
417 return await event_trigger.async_attach_trigger(
419 event_trigger.TRIGGER_SCHEMA(
421 event_trigger.CONF_PLATFORM: CONF_EVENT,
422 event_trigger.CONF_EVENT_TYPE: LUTRON_CASETA_BUTTON_EVENT,
423 event_trigger.CONF_EVENT_DATA: {
424 CONF_DEVICE_ID: config[CONF_DEVICE_ID],
425 ATTR_ACTION: config[CONF_TYPE],
426 ATTR_BUTTON_TYPE: config[CONF_SUBTYPE],
432 platform_type=
"device",
437 """Get a lutron integration data for the given device registry device id."""
439 list[LutronCasetaConfigEntry],
440 hass.config_entries.async_entries(
441 DOMAIN, include_ignore=
False, include_disabled=
False
444 for entry
in entries:
445 if hasattr(entry,
"runtime_data"):
446 if entry.runtime_data.keypad_data.dr_device_id_to_keypad.get(device_id):
447 return entry.runtime_data
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)
dict _reverse_dict(dict forward_dict)
ConfigType async_validate_trigger_config(HomeAssistant hass, ConfigType config)
def get_lutron_data_by_dr_id(HomeAssistant hass, str device_id)
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)