1 """Provides device automations for Climate."""
3 from __future__
import annotations
5 import voluptuous
as vol
9 numeric_state
as numeric_state_trigger,
10 state
as state_trigger,
28 from .
import DOMAIN, const
31 "current_temperature_changed",
32 "current_humidity_changed",
36 HVAC_MODE_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
38 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
39 vol.Required(CONF_TYPE):
"hvac_mode_changed",
40 vol.Required(state_trigger.CONF_TO): vol.In(const.HVAC_MODES),
41 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
45 CURRENT_TRIGGER_SCHEMA = vol.All(
46 DEVICE_TRIGGER_BASE_SCHEMA.extend(
48 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
49 vol.Required(CONF_TYPE): vol.In(
50 [
"current_temperature_changed",
"current_humidity_changed"]
52 vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)),
53 vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)),
54 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
57 cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE),
60 TRIGGER_SCHEMA = vol.Any(HVAC_MODE_TRIGGER_SCHEMA, CURRENT_TRIGGER_SCHEMA)
64 hass: HomeAssistant, device_id: str
65 ) -> list[dict[str, str]]:
66 """List device triggers for Climate devices."""
67 registry = er.async_get(hass)
71 for entry
in er.async_entries_for_device(registry, device_id):
72 if entry.domain != DOMAIN:
75 state = hass.states.get(entry.entity_id)
79 CONF_PLATFORM:
"device",
80 CONF_DEVICE_ID: device_id,
82 CONF_ENTITY_ID: entry.id,
88 CONF_TYPE:
"hvac_mode_changed",
92 if state
and const.ATTR_CURRENT_TEMPERATURE
in state.attributes:
96 CONF_TYPE:
"current_temperature_changed",
100 if state
and const.ATTR_CURRENT_HUMIDITY
in state.attributes:
104 CONF_TYPE:
"current_humidity_changed",
114 action: TriggerActionType,
115 trigger_info: TriggerInfo,
117 """Attach a trigger."""
118 if (trigger_type := config[CONF_TYPE]) ==
"hvac_mode_changed":
120 state_trigger.CONF_PLATFORM:
"state",
121 state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID],
122 state_trigger.CONF_TO: config[state_trigger.CONF_TO],
123 state_trigger.CONF_FROM: [
125 for mode
in const.HVAC_MODES
126 if mode != config[state_trigger.CONF_TO]
129 if CONF_FOR
in config:
130 state_config[CONF_FOR] = config[CONF_FOR]
131 state_config = await state_trigger.async_validate_trigger_config(
134 return await state_trigger.async_attach_trigger(
135 hass, state_config, action, trigger_info, platform_type=
"device"
138 numeric_state_config = {
139 numeric_state_trigger.CONF_PLATFORM:
"numeric_state",
140 numeric_state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID],
143 if trigger_type ==
"current_temperature_changed":
144 numeric_state_config[numeric_state_trigger.CONF_VALUE_TEMPLATE] = (
145 "{{ state.attributes.current_temperature }}"
148 numeric_state_config[numeric_state_trigger.CONF_VALUE_TEMPLATE] = (
149 "{{ state.attributes.current_humidity }}"
152 if CONF_ABOVE
in config:
153 numeric_state_config[CONF_ABOVE] = config[CONF_ABOVE]
154 if CONF_BELOW
in config:
155 numeric_state_config[CONF_BELOW] = config[CONF_BELOW]
156 if CONF_FOR
in config:
157 numeric_state_config[CONF_FOR] = config[CONF_FOR]
159 numeric_state_config = await numeric_state_trigger.async_validate_trigger_config(
160 hass, numeric_state_config
162 return await numeric_state_trigger.async_attach_trigger(
163 hass, numeric_state_config, action, trigger_info, platform_type=
"device"
168 hass: HomeAssistant, config: ConfigType
169 ) -> dict[str, vol.Schema]:
170 """List trigger capabilities."""
171 trigger_type = config[CONF_TYPE]
173 if trigger_type ==
"hvac_action_changed":
176 if trigger_type ==
"hvac_mode_changed":
178 "extra_fields": vol.Schema(
180 vol.Required(state_trigger.CONF_TO): vol.In(const.HVAC_MODES),
181 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
186 if trigger_type ==
"current_temperature_changed":
187 unit_of_measurement: str = hass.config.units.temperature_unit
189 unit_of_measurement = PERCENTAGE
192 "extra_fields": vol.Schema(
195 CONF_ABOVE, description={
"suffix": unit_of_measurement}
196 ): vol.Coerce(float),
198 CONF_BELOW, description={
"suffix": unit_of_measurement}
199 ): vol.Coerce(float),
200 vol.Optional(CONF_FOR): cv.positive_time_period_dict,
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)