Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device triggers for YoLink."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 import voluptuous as vol
8 from yolink.const import ATTR_DEVICE_SMART_REMOTER
9 
10 from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA
11 from homeassistant.components.homeassistant.triggers import event as event_trigger
12 from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_PLATFORM, CONF_TYPE
13 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
14 from homeassistant.helpers import device_registry as dr
15 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
16 from homeassistant.helpers.typing import ConfigType
17 
18 from . import DOMAIN, YOLINK_EVENT
19 from .const import (
20  DEV_MODEL_FLEX_FOB_YS3604_EC,
21  DEV_MODEL_FLEX_FOB_YS3604_UC,
22  DEV_MODEL_FLEX_FOB_YS3614_EC,
23  DEV_MODEL_FLEX_FOB_YS3614_UC,
24 )
25 
26 CONF_BUTTON_1 = "button_1"
27 CONF_BUTTON_2 = "button_2"
28 CONF_BUTTON_3 = "button_3"
29 CONF_BUTTON_4 = "button_4"
30 CONF_SHORT_PRESS = "short_press"
31 CONF_LONG_PRESS = "long_press"
32 
33 FLEX_FOB_4_BUTTONS = {
34  f"{CONF_BUTTON_1}_{CONF_SHORT_PRESS}",
35  f"{CONF_BUTTON_1}_{CONF_LONG_PRESS}",
36  f"{CONF_BUTTON_2}_{CONF_SHORT_PRESS}",
37  f"{CONF_BUTTON_2}_{CONF_LONG_PRESS}",
38  f"{CONF_BUTTON_3}_{CONF_SHORT_PRESS}",
39  f"{CONF_BUTTON_3}_{CONF_LONG_PRESS}",
40  f"{CONF_BUTTON_4}_{CONF_SHORT_PRESS}",
41  f"{CONF_BUTTON_4}_{CONF_LONG_PRESS}",
42 }
43 
44 FLEX_FOB_2_BUTTONS = {
45  f"{CONF_BUTTON_1}_{CONF_SHORT_PRESS}",
46  f"{CONF_BUTTON_1}_{CONF_LONG_PRESS}",
47  f"{CONF_BUTTON_2}_{CONF_SHORT_PRESS}",
48  f"{CONF_BUTTON_2}_{CONF_LONG_PRESS}",
49 }
50 
51 TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
52  {vol.Required(CONF_TYPE): vol.In(FLEX_FOB_4_BUTTONS)}
53 )
54 
55 
56 # YoLink Remotes YS3604/YS3614
57 FLEX_FOB_TRIGGER_TYPES: dict[str, set[str]] = {
58  DEV_MODEL_FLEX_FOB_YS3604_EC: FLEX_FOB_4_BUTTONS,
59  DEV_MODEL_FLEX_FOB_YS3604_UC: FLEX_FOB_4_BUTTONS,
60  DEV_MODEL_FLEX_FOB_YS3614_UC: FLEX_FOB_2_BUTTONS,
61  DEV_MODEL_FLEX_FOB_YS3614_EC: FLEX_FOB_2_BUTTONS,
62 }
63 
64 
66  hass: HomeAssistant, device_id: str
67 ) -> list[dict[str, Any]]:
68  """List device triggers for YoLink devices."""
69  device_registry = dr.async_get(hass)
70  registry_device = device_registry.async_get(device_id)
71  if not registry_device or registry_device.model != ATTR_DEVICE_SMART_REMOTER:
72  return []
73  if registry_device.model_id not in list(FLEX_FOB_TRIGGER_TYPES.keys()):
74  return []
75  return [
76  {
77  CONF_DEVICE_ID: device_id,
78  CONF_DOMAIN: DOMAIN,
79  CONF_PLATFORM: "device",
80  CONF_TYPE: trigger,
81  }
82  for trigger in FLEX_FOB_TRIGGER_TYPES[registry_device.model_id]
83  ]
84 
85 
87  hass: HomeAssistant,
88  config: ConfigType,
89  action: TriggerActionType,
90  trigger_info: TriggerInfo,
91 ) -> CALLBACK_TYPE:
92  """Listen for state changes based on configuration."""
93  event_config = {
94  event_trigger.CONF_PLATFORM: "event",
95  event_trigger.CONF_EVENT_TYPE: YOLINK_EVENT,
96  event_trigger.CONF_EVENT_DATA: {
97  CONF_DEVICE_ID: config[CONF_DEVICE_ID],
98  CONF_TYPE: config[CONF_TYPE],
99  },
100  }
101  event_config = event_trigger.TRIGGER_SCHEMA(event_config)
102  return await event_trigger.async_attach_trigger(
103  hass, event_config, action, trigger_info, platform_type="device"
104  )