1 """Device automation helpers for toggle entity."""
3 from __future__
import annotations
5 import voluptuous
as vol
20 config_validation
as cv,
21 entity_registry
as er,
26 from .
import DEVICE_TRIGGER_BASE_SCHEMA, entity
40 CONF_TYPE: CONF_TURN_OFF
44 CONF_TYPE: CONF_TURN_ON
48 CONF_TYPE: CONF_TOGGLE
55 CONF_CONDITION:
"device",
56 CONF_TYPE: CONF_IS_OFF,
60 CONF_CONDITION:
"device",
61 CONF_TYPE: CONF_IS_ON,
68 CONF_PLATFORM:
"device",
69 CONF_TYPE: CONF_TURNED_OFF,
73 CONF_PLATFORM:
"device",
74 CONF_TYPE: CONF_TURNED_ON,
78 DEVICE_ACTION_TYPES = [CONF_TOGGLE, CONF_TURN_OFF, CONF_TURN_ON]
80 ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
82 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
83 vol.Required(CONF_TYPE): vol.In(DEVICE_ACTION_TYPES),
87 CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend(
89 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
90 vol.Required(CONF_TYPE): vol.In([CONF_IS_OFF, CONF_IS_ON]),
91 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
95 _TOGGLE_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
97 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
98 vol.Required(CONF_TYPE): vol.In([CONF_TURNED_OFF, CONF_TURNED_ON]),
99 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
103 TRIGGER_SCHEMA = vol.Any(entity.TRIGGER_SCHEMA, _TOGGLE_TRIGGER_SCHEMA)
109 variables: TemplateVarsType,
110 context: Context |
None,
113 """Change state based on configuration."""
114 action_type = config[CONF_TYPE]
115 if action_type == CONF_TURN_ON:
117 elif action_type == CONF_TURN_OFF:
122 service_data = {ATTR_ENTITY_ID: config[CONF_ENTITY_ID]}
124 await hass.services.async_call(
125 domain, action, service_data, blocking=
True, context=context
131 hass: HomeAssistant, config: ConfigType
132 ) -> condition.ConditionCheckerType:
133 """Evaluate state based on configuration."""
134 if config[CONF_TYPE] == CONF_IS_ON:
139 CONF_CONDITION:
"state",
140 CONF_ENTITY_ID: config[CONF_ENTITY_ID],
143 if CONF_FOR
in config:
144 state_config[CONF_FOR] = config[CONF_FOR]
146 state_config = cv.STATE_CONDITION_SCHEMA(state_config)
147 state_config = condition.state_validate_config(hass, state_config)
148 return condition.state_from_config(state_config)
154 action: TriggerActionType,
155 trigger_info: TriggerInfo,
157 """Listen for state changes based on configuration."""
158 if config[CONF_TYPE]
not in [CONF_TURNED_ON, CONF_TURNED_OFF]:
159 return await entity.async_attach_trigger(hass, config, action, trigger_info)
161 if config[CONF_TYPE] == CONF_TURNED_ON:
166 CONF_PLATFORM:
"state",
167 state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID],
168 state_trigger.CONF_TO: to_state,
170 if CONF_FOR
in config:
171 state_config[CONF_FOR] = config[CONF_FOR]
173 state_config = await state_trigger.async_validate_trigger_config(hass, state_config)
174 return await state_trigger.async_attach_trigger(
175 hass, state_config, action, trigger_info, platform_type=
"device"
182 automation_templates: list[dict[str, str]],
184 ) -> list[dict[str, str]]:
185 """List device automations."""
186 automations: list[dict[str, str]] = []
187 entity_registry = er.async_get(hass)
191 for entry
in er.async_entries_for_device(entity_registry, device_id)
192 if entry.domain == domain
195 for entry
in entries:
199 "device_id": device_id,
200 "entity_id": entry.id,
203 for template
in automation_templates
210 hass: HomeAssistant, device_id: str, domain: str
211 ) -> list[dict[str, str]]:
212 """List device actions."""
217 hass: HomeAssistant, device_id: str, domain: str
218 ) -> list[dict[str, str]]:
219 """List device conditions."""
224 hass: HomeAssistant, device_id: str, domain: str
225 ) -> list[dict[str, str]]:
226 """List device triggers."""
227 triggers = await entity.async_get_triggers(hass, device_id, domain)
235 hass: HomeAssistant, config: ConfigType
236 ) -> dict[str, vol.Schema]:
237 """List condition capabilities."""
239 "extra_fields": vol.Schema(
240 {vol.Optional(CONF_FOR): cv.positive_time_period_dict}
246 hass: HomeAssistant, config: ConfigType
247 ) -> dict[str, vol.Schema]:
248 """List trigger capabilities."""
249 if config[CONF_TYPE]
not in [CONF_TURNED_ON, CONF_TURNED_OFF]:
250 return await entity.async_get_trigger_capabilities(hass, config)
253 "extra_fields": vol.Schema(
254 {vol.Optional(CONF_FOR): cv.positive_time_period_dict}
dict[str, vol.Schema] async_get_condition_capabilities(HomeAssistant hass, ConfigType config)
list[dict[str, str]] async_get_conditions(HomeAssistant hass, str device_id, str domain)
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id, str domain)
list[dict[str, str]] async_get_actions(HomeAssistant hass, str device_id, str domain)
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
dict[str, vol.Schema] async_get_trigger_capabilities(HomeAssistant hass, ConfigType config)
list[dict[str, str]] _async_get_automations(HomeAssistant hass, str device_id, list[dict[str, str]] automation_templates, str domain)
None async_call_action_from_config(HomeAssistant hass, ConfigType config, TemplateVarsType variables, Context|None context, str domain)
condition.ConditionCheckerType async_condition_from_config(HomeAssistant hass, ConfigType config)