async def async_attach_trigger(opp, config, action, automation_info): """Listen for state changes based on configuration.""" device_registry = await opp.helpers.device_registry.async_get_registry() device = device_registry.async_get(config[CONF_DEVICE_ID]) trigger = (config[CONF_TYPE], config[CONF_SUBTYPE]) trigger = REMOTES[device.model][trigger] deconz_event = _get_deconz_event_from_device_id(opp, device.id) if deconz_event is None: raise InvalidDeviceAutomationConfig( f'No deconz_event tied to device "{device.name}" found') event_id = deconz_event.serial event_config = { event_trigger.CONF_PLATFORM: "event", event_trigger.CONF_EVENT_TYPE: CONF_DECONZ_EVENT, event_trigger.CONF_EVENT_DATA: { CONF_UNIQUE_ID: event_id, **trigger }, } event_config = event_trigger.TRIGGER_SCHEMA(event_config) return await event_trigger.async_attach_trigger(opp, event_config, action, automation_info, platform_type="device")
async def async_get_condition_capabilities(opp, config): """List condition capabilities.""" state = opp.states.get(config[CONF_ENTITY_ID]) unit_of_measurement = ( state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) if state else None ) if not state or not unit_of_measurement: raise InvalidDeviceAutomationConfig( "No state or unit of measurement found for " f"condition entity {config[CONF_ENTITY_ID]}" ) return { "extra_fields": vol.Schema( { vol.Optional( CONF_ABOVE, description={"suffix": unit_of_measurement} ): vol.Coerce(float), vol.Optional( CONF_BELOW, description={"suffix": unit_of_measurement} ): vol.Coerce(float), } ) }
async def async_get_triggers(opp: OpenPeerPower, device_id: str) -> list[dict]: """List device triggers for Shelly devices.""" triggers = [] wrapper = get_device_wrapper(opp, device_id) if not wrapper: raise InvalidDeviceAutomationConfig(f"Device not found: {device_id}") if wrapper.model in SHBTN_MODELS: for trigger in SHBTN_INPUTS_EVENTS_TYPES: triggers.append({ CONF_PLATFORM: "device", CONF_DEVICE_ID: device_id, CONF_DOMAIN: DOMAIN, CONF_TYPE: trigger, CONF_SUBTYPE: "button", }) return triggers for block in wrapper.device.blocks: input_triggers = get_input_triggers(wrapper.device, block) for trigger, subtype in input_triggers: triggers.append({ CONF_PLATFORM: "device", CONF_DEVICE_ID: device_id, CONF_DOMAIN: DOMAIN, CONF_TYPE: trigger, CONF_SUBTYPE: subtype, }) return triggers
async def async_validate_trigger_config(opp, config): """Validate config.""" config = TRIGGER_SCHEMA(config) device_registry = await opp.helpers.device_registry.async_get_registry() device = device_registry.async_get(config[CONF_DEVICE_ID]) trigger = (config[CONF_TYPE], config[CONF_SUBTYPE]) if not device: raise InvalidDeviceAutomationConfig( f"deCONZ trigger {trigger} device with ID " f"{config[CONF_DEVICE_ID]} not found") if device.model not in REMOTES or trigger not in REMOTES[device.model]: raise InvalidDeviceAutomationConfig( f"deCONZ trigger {trigger} is not valid for device " f"{device} ({config[CONF_DEVICE_ID]})") return config
async def async_validate_trigger_config(opp: OpenPeerPower, config: ConfigType): """Validate config.""" # if device is available verify parameters against device capabilities device = get_button_device_by_dr_id(opp, config[CONF_DEVICE_ID]) if not device: return config schema = DEVICE_TYPE_SCHEMA_MAP.get(device["type"]) if not schema: raise InvalidDeviceAutomationConfig( f"Device type {device['type']} not supported: {config[CONF_DEVICE_ID]}" ) return schema(config)
async def async_validate_trigger_config(opp, config): """Validate config.""" config = TRIGGER_SCHEMA(config) # if device is available verify parameters against device capabilities wrapper = get_device_wrapper(opp, config[CONF_DEVICE_ID]) if not wrapper or not wrapper.device.initialized: return config trigger = (config[CONF_TYPE], config[CONF_SUBTYPE]) for block in wrapper.device.blocks: input_triggers = get_input_triggers(wrapper.device, block) if trigger in input_triggers: return config raise InvalidDeviceAutomationConfig( f"Invalid ({CONF_TYPE},{CONF_SUBTYPE}): {trigger}")
async def async_get_triggers(opp: OpenPeerPower, device_id: str) -> list[dict]: """List device triggers for lutron caseta devices.""" triggers = [] device = get_button_device_by_dr_id(opp, device_id) if not device: raise InvalidDeviceAutomationConfig(f"Device not found: {device_id}") valid_buttons = DEVICE_TYPE_SUBTYPE_MAP.get(device["type"], []) for trigger in SUPPORTED_INPUTS_EVENTS_TYPES: for subtype in valid_buttons: triggers.append({ CONF_PLATFORM: "device", CONF_DEVICE_ID: device_id, CONF_DOMAIN: DOMAIN, CONF_TYPE: trigger, CONF_SUBTYPE: subtype, }) return triggers