1 """Provides device triggers for Shelly."""
3 from __future__
import annotations
5 from typing
import Final
7 import voluptuous
as vol
10 DEVICE_TRIGGER_BASE_SCHEMA,
11 InvalidDeviceAutomationConfig,
29 BLOCK_INPUTS_EVENTS_TYPES,
33 INPUTS_EVENTS_SUBTYPES,
34 RPC_INPUTS_EVENTS_TYPES,
37 from .coordinator
import (
38 get_block_coordinator_by_device_id,
39 get_rpc_coordinator_by_device_id,
42 get_block_input_triggers,
43 get_rpc_input_triggers,
44 get_shbtn_input_triggers,
47 TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend(
49 vol.Required(CONF_TYPE): vol.In(
50 RPC_INPUTS_EVENTS_TYPES | BLOCK_INPUTS_EVENTS_TYPES
52 vol.Required(CONF_SUBTYPE): vol.In(INPUTS_EVENTS_SUBTYPES),
58 triggers: list[dict[str, str]],
59 input_triggers: list[tuple[str, str]],
62 """Add trigger to triggers list."""
63 for trigger, subtype
in input_triggers:
66 CONF_PLATFORM:
"device",
67 CONF_DEVICE_ID: device_id,
70 CONF_SUBTYPE: subtype,
76 hass: HomeAssistant, config: ConfigType
78 """Validate config."""
82 trigger = (config[CONF_TYPE], config[CONF_SUBTYPE])
84 if config[CONF_TYPE]
in RPC_INPUTS_EVENTS_TYPES:
86 if not rpc_coordinator
or not rpc_coordinator.device.initialized:
90 if trigger
in input_triggers:
93 elif config[CONF_TYPE]
in BLOCK_INPUTS_EVENTS_TYPES:
95 hass, config[CONF_DEVICE_ID]
97 if not block_coordinator
or not block_coordinator.device.initialized:
100 assert block_coordinator.device.blocks
102 for block
in block_coordinator.device.blocks:
104 if trigger
in input_triggers:
108 f
"Invalid ({CONF_TYPE},{CONF_SUBTYPE}): {trigger}"
113 hass: HomeAssistant, device_id: str
114 ) -> list[dict[str, str]]:
115 """List device triggers for Shelly devices."""
116 triggers: list[dict[str, str]] = []
124 if block_coordinator.model
in SHBTN_MODELS:
129 if not block_coordinator.device.initialized:
132 assert block_coordinator.device.blocks
134 for block
in block_coordinator.device.blocks:
146 action: TriggerActionType,
147 trigger_info: TriggerInfo,
149 """Attach a trigger."""
151 event_trigger.CONF_PLATFORM: CONF_EVENT,
152 event_trigger.CONF_EVENT_TYPE: EVENT_SHELLY_CLICK,
153 event_trigger.CONF_EVENT_DATA: {
154 ATTR_DEVICE_ID: config[CONF_DEVICE_ID],
155 ATTR_CHANNEL: INPUTS_EVENTS_SUBTYPES[config[CONF_SUBTYPE]],
156 ATTR_CLICK_TYPE: config[CONF_TYPE],
160 event_config = event_trigger.TRIGGER_SCHEMA(event_config)
161 return await event_trigger.async_attach_trigger(
162 hass, event_config, action, trigger_info, platform_type=
"device"
ShellyRpcCoordinator|None get_rpc_coordinator_by_device_id(HomeAssistant hass, str device_id)
ShellyBlockCoordinator|None get_block_coordinator_by_device_id(HomeAssistant hass, str device_id)
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)
ConfigType async_validate_trigger_config(HomeAssistant hass, ConfigType config)
None append_input_triggers(list[dict[str, str]] triggers, list[tuple[str, str]] input_triggers, str device_id)
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
list[tuple[str, str]] get_shbtn_input_triggers()
list[tuple[str, str]] get_rpc_input_triggers(RpcDevice device)
list[tuple[str, str]] get_block_input_triggers(BlockDevice device, Block block)