Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device automations for Philips Hue events."""
2 
3 from __future__ import annotations
4 
5 from typing import TYPE_CHECKING, Any
6 
7 from homeassistant.components.device_automation import InvalidDeviceAutomationConfig
8 from homeassistant.const import CONF_DEVICE_ID
9 from homeassistant.core import CALLBACK_TYPE
10 from homeassistant.helpers import device_registry as dr
11 from homeassistant.helpers.typing import ConfigType
12 
13 from .const import DOMAIN
14 from .v1.device_trigger import (
15  async_attach_trigger as async_attach_trigger_v1,
16  async_get_triggers as async_get_triggers_v1,
17  async_validate_trigger_config as async_validate_trigger_config_v1,
18 )
19 from .v2.device_trigger import (
20  async_attach_trigger as async_attach_trigger_v2,
21  async_get_triggers as async_get_triggers_v2,
22  async_validate_trigger_config as async_validate_trigger_config_v2,
23 )
24 
25 if TYPE_CHECKING:
26  from homeassistant.core import HomeAssistant
27  from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
28 
29  from .bridge import HueBridge
30 
31 
33  hass: HomeAssistant, config: ConfigType
34 ) -> ConfigType:
35  """Validate config."""
36  if DOMAIN not in hass.data:
37  # happens at startup
38  return config
39  device_id = config[CONF_DEVICE_ID]
40  # lookup device in HASS DeviceRegistry
41  dev_reg: dr.DeviceRegistry = dr.async_get(hass)
42  if (device_entry := dev_reg.async_get(device_id)) is None:
43  raise InvalidDeviceAutomationConfig(f"Device ID {device_id} is not valid")
44 
45  for conf_entry_id in device_entry.config_entries:
46  if conf_entry_id not in hass.data[DOMAIN]:
47  continue
48  bridge: HueBridge = hass.data[DOMAIN][conf_entry_id]
49  if bridge.api_version == 1:
50  return await async_validate_trigger_config_v1(bridge, device_entry, config)
51  return await async_validate_trigger_config_v2(bridge, device_entry, config)
52  return config
53 
54 
56  hass: HomeAssistant,
57  config: ConfigType,
58  action: TriggerActionType,
59  trigger_info: TriggerInfo,
60 ) -> CALLBACK_TYPE:
61  """Listen for state changes based on configuration."""
62  device_id = config[CONF_DEVICE_ID]
63  # lookup device in HASS DeviceRegistry
64  dev_reg: dr.DeviceRegistry = dr.async_get(hass)
65  if (device_entry := dev_reg.async_get(device_id)) is None:
66  raise InvalidDeviceAutomationConfig(f"Device ID {device_id} is not valid")
67 
68  for conf_entry_id in device_entry.config_entries:
69  if conf_entry_id not in hass.data[DOMAIN]:
70  continue
71  bridge: HueBridge = hass.data[DOMAIN][conf_entry_id]
72  if bridge.api_version == 1:
73  return await async_attach_trigger_v1(
74  bridge, device_entry, config, action, trigger_info
75  )
76  return await async_attach_trigger_v2(
77  bridge, device_entry, config, action, trigger_info
78  )
80  f"Device ID {device_id} is not found on any Hue bridge"
81  )
82 
83 
85  hass: HomeAssistant, device_id: str
86 ) -> list[dict[str, Any]]:
87  """Get device triggers for given (hass) device id."""
88  if DOMAIN not in hass.data:
89  return []
90  # lookup device in HASS DeviceRegistry
91  dev_reg: dr.DeviceRegistry = dr.async_get(hass)
92  if (device_entry := dev_reg.async_get(device_id)) is None:
93  raise ValueError(f"Device ID {device_id} is not valid")
94 
95  # Iterate all config entries for this device
96  # and work out the bridge version
97  for conf_entry_id in device_entry.config_entries:
98  if conf_entry_id not in hass.data[DOMAIN]:
99  continue
100  bridge: HueBridge = hass.data[DOMAIN][conf_entry_id]
101 
102  if bridge.api_version == 1:
103  return async_get_triggers_v1(bridge, device_entry)
104  return async_get_triggers_v2(bridge, device_entry)
105  return []
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
list[dict[str, Any]] async_get_triggers(HomeAssistant hass, str device_id)
ConfigType async_validate_trigger_config(HomeAssistant hass, ConfigType config)