async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Listen for state changes based on configuration.""" trigger_type = config[CONF_TYPE] if trigger_type == CONF_TURNED_ON: to_state = "on" else: to_state = "off" state_config = { CONF_PLATFORM: "state", state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" config = TRIGGER_SCHEMA(config) # TODO Implement your own logic to attach triggers. # Generally we suggest to re-use the existing state or event # triggers from the automation integration. if config[CONF_TYPE] == "turned_on": from_state = STATE_OFF to_state = STATE_ON else: from_state = STATE_ON to_state = STATE_OFF state_config = { state.CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state.CONF_FROM: from_state, state.CONF_TO: to_state, } state_config = state.TRIGGER_SCHEMA(state_config) return await state.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" trigger_type = config[CONF_TYPE] if trigger_type == "hvac_mode_changed": state_config = { state_trigger.CONF_PLATFORM: "state", state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: config[state_trigger.CONF_TO], state_trigger.CONF_FROM: [ mode for mode in const.HVAC_MODES if mode != config[state_trigger.CONF_TO] ], } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device") numeric_state_config = { numeric_state_trigger.CONF_PLATFORM: "numeric_state", numeric_state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID], } if trigger_type == "current_temperature_changed": numeric_state_config[ numeric_state_trigger. CONF_VALUE_TEMPLATE] = "{{ state.attributes.current_temperature }}" else: numeric_state_config[ numeric_state_trigger. CONF_VALUE_TEMPLATE] = "{{ state.attributes.current_humidity }}" if CONF_ABOVE in config: numeric_state_config[CONF_ABOVE] = config[CONF_ABOVE] if CONF_BELOW in config: numeric_state_config[CONF_BELOW] = config[CONF_BELOW] if CONF_FOR in config: numeric_state_config[CONF_FOR] = config[CONF_FOR] numeric_state_config = numeric_state_trigger.TRIGGER_SCHEMA( numeric_state_config) return await numeric_state_trigger.async_attach_trigger( hass, numeric_state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" if config[CONF_TYPE] == "jammed": to_state = STATE_JAMMED elif config[CONF_TYPE] == "locking": to_state = STATE_LOCKING elif config[CONF_TYPE] == "unlocking": to_state = STATE_UNLOCKING elif config[CONF_TYPE] == "locked": to_state = STATE_LOCKED else: to_state = STATE_UNLOCKED state_config = { CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger( hass, state_config, action, automation_info, platform_type="device" )
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" config = TRIGGER_SCHEMA(config) if config[CONF_TYPE] == "turned_on": to_state = STATE_ON else: to_state = STATE_OFF state_config = { state_trigger.CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" if config[CONF_TYPE] == "turned_on": to_state = STATE_ON elif config[CONF_TYPE] == "turned_off": to_state = STATE_OFF elif config[CONF_TYPE] == "idle": to_state = STATE_IDLE elif config[CONF_TYPE] == "paused": to_state = STATE_PAUSED else: to_state = STATE_PLAYING state_config = { CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" if config[CONF_TYPE] == "triggered": to_state = STATE_ALARM_TRIGGERED elif config[CONF_TYPE] == "disarmed": to_state = STATE_ALARM_DISARMED elif config[CONF_TYPE] == "arming": to_state = STATE_ALARM_ARMING elif config[CONF_TYPE] == "armed_home": to_state = STATE_ALARM_ARMED_HOME elif config[CONF_TYPE] == "armed_away": to_state = STATE_ALARM_ARMED_AWAY elif config[CONF_TYPE] == "armed_night": to_state = STATE_ALARM_ARMED_NIGHT state_config = { state_trigger.CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger(hass, config, action, automation_info): entity_registry = await hass.helpers.entity_registry.async_get_registry() device_id = config[CONF_DEVICE_ID] entry = next(( entry for entry in entity_registry.entities.values() if entry.device_id == device_id and entry.unique_id.endswith('action') ), None) if not entry: return None to_state = ( config['action'] if config[CONF_TYPE] == 'button' else f"{config[CONF_TYPE]}_{config['action']}" ) state_config = { CONF_PLATFORM: CONF_STATE, CONF_ENTITY_ID: entry.entity_id, state_trigger.CONF_TO: to_state } state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger( hass, state_config, action, automation_info, platform_type="device" )
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" config = TRIGGER_SCHEMA(config) if config[CONF_TYPE] == "cleaning": from_state = [state for state in STATES if state != STATE_CLEANING] to_state = STATE_CLEANING else: from_state = [state for state in STATES if state != STATE_DOCKED] to_state = STATE_DOCKED state_config = { CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_FROM: from_state, state_trigger.CONF_TO: to_state, } state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: AutomationTriggerInfo, ) -> CALLBACK_TYPE: """Attach a trigger.""" if (trigger_type := config[CONF_TYPE]) == "hvac_mode_changed": state_config = { state_trigger.CONF_PLATFORM: "state", state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: config[state_trigger.CONF_TO], state_trigger.CONF_FROM: [ mode for mode in const.HVAC_MODES if mode != config[state_trigger.CONF_TO] ], } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" if config[CONF_TYPE] in STATE_TRIGGER_TYPES: if config[CONF_TYPE] == "opened": to_state = STATE_OPEN elif config[CONF_TYPE] == "closed": to_state = STATE_CLOSED elif config[CONF_TYPE] == "opening": to_state = STATE_OPENING elif config[CONF_TYPE] == "closing": to_state = STATE_CLOSING state_config = { CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device") if config[CONF_TYPE] == "position": position = "current_position" if config[CONF_TYPE] == "tilt_position": position = "current_tilt_position" min_pos = config.get(CONF_ABOVE, -1) max_pos = config.get(CONF_BELOW, 101) value_template = f"{{{{ state.attributes.{position} }}}}" numeric_state_config = { CONF_PLATFORM: "numeric_state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], CONF_BELOW: max_pos, CONF_ABOVE: min_pos, CONF_VALUE_TEMPLATE: value_template, } numeric_state_config = numeric_state_trigger.TRIGGER_SCHEMA( numeric_state_config) return await numeric_state_trigger.async_attach_trigger( hass, numeric_state_config, action, automation_info, platform_type="device")
async def async_attach_trigger(hass, config, action, automation_info): """Listen for state changes based on configuration.""" trigger_type = config[CONF_TYPE] if trigger_type in TURNED_ON: to_state = "on" else: to_state = "off" state_config = { state_trigger.CONF_PLATFORM: "state", state_trigger.CONF_ENTITY_ID: config[CONF_ENTITY_ID], state_trigger.CONF_TO: to_state, } if CONF_FOR in config: state_config[CONF_FOR] = config[CONF_FOR] state_config = state_trigger.TRIGGER_SCHEMA(state_config) return await state_trigger.async_attach_trigger( hass, state_config, action, automation_info, platform_type="device" )
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ) -> CALLBACK_TYPE: """Attach a trigger.""" state_config = { state.CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], CONF_ATTRIBUTE: config[CONF_TYPE][:-len( "_changed" )], # Trigger names are attribute + _changed. Bit hacky, TODO: replace with removesuffix in Python 3.9 } state_config = state.TRIGGER_SCHEMA(state_config) return await state.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device")
async def async_attach_trigger( hass: HomeAssistant, config: ConfigType, action: AutomationActionType, automation_info: dict, ): """ Attach a trigger """ if config[CONF_TYPE] == NEW_VOD: if CONF_ENTITY_ID not in config: (_, device_entries) = await async_get_device_entries( hass, config[CONF_DEVICE_ID] ) config[CONF_ENTITY_ID] = ( next( ( entry.entity_id for entry in device_entries if entry.domain == SENSOR_DOMAIN and entry.device_class == DEVICE_CLASS_TIMESTAMP ) ) if device_entries else None ) state_config = state_trigger.TRIGGER_SCHEMA( { CONF_PLATFORM: "state", CONF_ENTITY_ID: config[CONF_ENTITY_ID], } ) return await state_trigger.async_attach_trigger( hass, state_config, action, automation_info, platform_type=config[CONF_PLATFORM], )
event_config = event.TRIGGER_SCHEMA(event_config) return await event.async_attach_trigger(hass, event_config, action, automation_info, platform_type="device") state_config = {state.CONF_PLATFORM: "state"} if trigger_platform == "state" and trigger_type == NODE_STATUS: state_config[state.CONF_ENTITY_ID] = config[CONF_ENTITY_ID] copy_available_params(config, state_config, [state.CONF_FOR, state.CONF_FROM, state.CONF_TO]) state_config = state.TRIGGER_SCHEMA(state_config) return await state.async_attach_trigger(hass, state_config, action, automation_info, platform_type="device") raise HomeAssistantError(f"Unhandled trigger type {trigger_type}") async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType) -> dict[str, vol.Schema]: """List trigger capabilities.""" node = async_get_node_from_device_id(hass, config[CONF_DEVICE_ID]) value = (get_zwave_value_from_config(node, config) if ATTR_PROPERTY in config else None)