Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for repeating alerts when conditions are met."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
7 from homeassistant.const import (
8  CONF_ENTITY_ID,
9  CONF_NAME,
10  CONF_REPEAT,
11  CONF_STATE,
12  SERVICE_TOGGLE,
13  SERVICE_TURN_OFF,
14  SERVICE_TURN_ON,
15  STATE_ON,
16 )
17 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_component import EntityComponent
20 from homeassistant.helpers.typing import ConfigType
21 
22 from .const import (
23  CONF_ALERT_MESSAGE,
24  CONF_CAN_ACK,
25  CONF_DATA,
26  CONF_DONE_MESSAGE,
27  CONF_NOTIFIERS,
28  CONF_SKIP_FIRST,
29  CONF_TITLE,
30  DEFAULT_CAN_ACK,
31  DEFAULT_SKIP_FIRST,
32  DOMAIN,
33  LOGGER,
34 )
35 from .entity import AlertEntity
36 
37 ALERT_SCHEMA = vol.Schema(
38  {
39  vol.Required(CONF_NAME): cv.string,
40  vol.Required(CONF_ENTITY_ID): cv.entity_id,
41  vol.Optional(CONF_STATE, default=STATE_ON): cv.string,
42  vol.Required(CONF_REPEAT): vol.All(
43  cv.ensure_list,
44  [vol.Coerce(float)],
45  # Minimum delay is 1 second = 0.016 minutes
46  [vol.Range(min=0.016)],
47  ),
48  vol.Optional(CONF_CAN_ACK, default=DEFAULT_CAN_ACK): cv.boolean,
49  vol.Optional(CONF_SKIP_FIRST, default=DEFAULT_SKIP_FIRST): cv.boolean,
50  vol.Optional(CONF_ALERT_MESSAGE): cv.template,
51  vol.Optional(CONF_DONE_MESSAGE): cv.template,
52  vol.Optional(CONF_TITLE): cv.template,
53  vol.Optional(CONF_DATA): dict,
54  vol.Optional(CONF_NOTIFIERS, default=list): vol.All(
55  cv.ensure_list, [cv.string]
56  ),
57  }
58 )
59 
60 CONFIG_SCHEMA = vol.Schema(
61  {DOMAIN: cv.schema_with_slug_keys(ALERT_SCHEMA)}, extra=vol.ALLOW_EXTRA
62 )
63 
64 
65 async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
66  """Set up the Alert component."""
67  component = EntityComponent[AlertEntity](LOGGER, DOMAIN, hass)
68 
69  entities: list[AlertEntity] = []
70 
71  for object_id, cfg in config[DOMAIN].items():
72  if not cfg:
73  cfg = {}
74 
75  name = cfg[CONF_NAME]
76  watched_entity_id = cfg[CONF_ENTITY_ID]
77  alert_state = cfg[CONF_STATE]
78  repeat = cfg[CONF_REPEAT]
79  skip_first = cfg[CONF_SKIP_FIRST]
80  message_template = cfg.get(CONF_ALERT_MESSAGE)
81  done_message_template = cfg.get(CONF_DONE_MESSAGE)
82  notifiers = cfg[CONF_NOTIFIERS]
83  can_ack = cfg[CONF_CAN_ACK]
84  title_template = cfg.get(CONF_TITLE)
85  data = cfg.get(CONF_DATA)
86 
87  entities.append(
89  hass,
90  object_id,
91  name,
92  watched_entity_id,
93  alert_state,
94  repeat,
95  skip_first,
96  message_template,
97  done_message_template,
98  notifiers,
99  can_ack,
100  title_template,
101  data,
102  )
103  )
104 
105  if not entities:
106  return False
107 
108  component.async_register_entity_service(SERVICE_TURN_OFF, None, "async_turn_off")
109  component.async_register_entity_service(SERVICE_TURN_ON, None, "async_turn_on")
110  component.async_register_entity_service(SERVICE_TOGGLE, None, "async_toggle")
111 
112  await component.async_add_entities(entities)
113 
114  return True
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:65