Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device automations for Device Tracker."""
2 
3 from __future__ import annotations
4 
5 from operator import attrgetter
6 from typing import Final
7 
8 import voluptuous as vol
9 
10 from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA
11 from homeassistant.components.zone import DOMAIN as DOMAIN_ZONE, trigger as zone
12 from homeassistant.const import (
13  CONF_DEVICE_ID,
14  CONF_DOMAIN,
15  CONF_ENTITY_ID,
16  CONF_EVENT,
17  CONF_PLATFORM,
18  CONF_TYPE,
19  CONF_ZONE,
20 )
21 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
22 from homeassistant.helpers import config_validation as cv, entity_registry as er
23 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
24 from homeassistant.helpers.typing import ConfigType
25 
26 from .const import DOMAIN
27 
28 TRIGGER_TYPES: Final[set[str]] = {"enters", "leaves"}
29 
30 TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend(
31  {
32  vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
33  vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES),
34  vol.Required(CONF_ZONE): cv.entity_domain(DOMAIN_ZONE),
35  }
36 )
37 
38 
40  hass: HomeAssistant, device_id: str
41 ) -> list[dict[str, str]]:
42  """List device triggers for Device Tracker devices."""
43  registry = er.async_get(hass)
44  triggers = []
45 
46  # Get all the integrations entities for this device
47  for entry in er.async_entries_for_device(registry, device_id):
48  if entry.domain != DOMAIN:
49  continue
50 
51  triggers.append(
52  {
53  CONF_PLATFORM: "device",
54  CONF_DEVICE_ID: device_id,
55  CONF_DOMAIN: DOMAIN,
56  CONF_ENTITY_ID: entry.id,
57  CONF_TYPE: "enters",
58  }
59  )
60  triggers.append(
61  {
62  CONF_PLATFORM: "device",
63  CONF_DEVICE_ID: device_id,
64  CONF_DOMAIN: DOMAIN,
65  CONF_ENTITY_ID: entry.id,
66  CONF_TYPE: "leaves",
67  }
68  )
69 
70  return triggers
71 
72 
74  hass: HomeAssistant,
75  config: ConfigType,
76  action: TriggerActionType,
77  trigger_info: TriggerInfo,
78 ) -> CALLBACK_TYPE:
79  """Attach a trigger."""
80  if config[CONF_TYPE] == "enters":
81  event = zone.EVENT_ENTER
82  else:
83  event = zone.EVENT_LEAVE
84 
85  zone_config = {
86  CONF_PLATFORM: DOMAIN_ZONE,
87  CONF_ENTITY_ID: config[CONF_ENTITY_ID],
88  CONF_ZONE: config[CONF_ZONE],
89  CONF_EVENT: event,
90  }
91  zone_config = await zone.async_validate_trigger_config(hass, zone_config)
92  return await zone.async_attach_trigger(
93  hass, zone_config, action, trigger_info, platform_type="device"
94  )
95 
96 
98  hass: HomeAssistant, config: ConfigType
99 ) -> dict[str, vol.Schema]:
100  """List trigger capabilities."""
101  zones = {
102  ent.entity_id: ent.name
103  for ent in sorted(hass.states.async_all(DOMAIN_ZONE), key=attrgetter("name"))
104  }
105  return {
106  "extra_fields": vol.Schema(
107  {
108  vol.Required(CONF_ZONE): vol.In(zones),
109  }
110  )
111  }
dict[str, vol.Schema] async_get_trigger_capabilities(HomeAssistant hass, ConfigType config)
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)