Beispiel #1
0
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")
Beispiel #2
0
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")
Beispiel #3
0
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")
Beispiel #4
0
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"
    )
Beispiel #5
0
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")
Beispiel #6
0
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")
Beispiel #7
0
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")
Beispiel #8
0
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"
    )
Beispiel #9
0
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")
Beispiel #10
0
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")
Beispiel #11
0
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")
Beispiel #12
0
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"
    )
Beispiel #13
0
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],
        )
Beispiel #15
0
        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)