89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
"""Provides device triggers for YoLink."""
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
from typing import Any
 | 
						|
 | 
						|
import voluptuous as vol
 | 
						|
from yolink.const import ATTR_DEVICE_SMART_REMOTER
 | 
						|
 | 
						|
from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA
 | 
						|
from homeassistant.components.homeassistant.triggers import event as event_trigger
 | 
						|
from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_PLATFORM, CONF_TYPE
 | 
						|
from homeassistant.core import CALLBACK_TYPE, HomeAssistant
 | 
						|
from homeassistant.helpers import device_registry as dr
 | 
						|
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
 | 
						|
from homeassistant.helpers.typing import ConfigType
 | 
						|
 | 
						|
from . import DOMAIN, YOLINK_EVENT
 | 
						|
 | 
						|
CONF_BUTTON_1 = "button_1"
 | 
						|
CONF_BUTTON_2 = "button_2"
 | 
						|
CONF_BUTTON_3 = "button_3"
 | 
						|
CONF_BUTTON_4 = "button_4"
 | 
						|
CONF_SHORT_PRESS = "short_press"
 | 
						|
CONF_LONG_PRESS = "long_press"
 | 
						|
 | 
						|
REMOTE_TRIGGER_TYPES = {
 | 
						|
    f"{CONF_BUTTON_1}_{CONF_SHORT_PRESS}",
 | 
						|
    f"{CONF_BUTTON_1}_{CONF_LONG_PRESS}",
 | 
						|
    f"{CONF_BUTTON_2}_{CONF_SHORT_PRESS}",
 | 
						|
    f"{CONF_BUTTON_2}_{CONF_LONG_PRESS}",
 | 
						|
    f"{CONF_BUTTON_3}_{CONF_SHORT_PRESS}",
 | 
						|
    f"{CONF_BUTTON_3}_{CONF_LONG_PRESS}",
 | 
						|
    f"{CONF_BUTTON_4}_{CONF_SHORT_PRESS}",
 | 
						|
    f"{CONF_BUTTON_4}_{CONF_LONG_PRESS}",
 | 
						|
}
 | 
						|
 | 
						|
TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
 | 
						|
    {vol.Required(CONF_TYPE): vol.In(REMOTE_TRIGGER_TYPES)}
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
# YoLink Remotes YS3604/YS3605/YS3606/YS3607
 | 
						|
DEVICE_TRIGGER_TYPES: dict[str, set[str]] = {
 | 
						|
    ATTR_DEVICE_SMART_REMOTER: REMOTE_TRIGGER_TYPES,
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
async def async_get_triggers(
 | 
						|
    hass: HomeAssistant, device_id: str
 | 
						|
) -> list[dict[str, Any]]:
 | 
						|
    """List device triggers for YoLink devices."""
 | 
						|
    device_registry = dr.async_get(hass)
 | 
						|
    registry_device = device_registry.async_get(device_id)
 | 
						|
    if not registry_device or registry_device.model != ATTR_DEVICE_SMART_REMOTER:
 | 
						|
        return []
 | 
						|
 | 
						|
    triggers = []
 | 
						|
    for trigger in DEVICE_TRIGGER_TYPES[ATTR_DEVICE_SMART_REMOTER]:
 | 
						|
        triggers.append(
 | 
						|
            {
 | 
						|
                CONF_DEVICE_ID: device_id,
 | 
						|
                CONF_DOMAIN: DOMAIN,
 | 
						|
                CONF_PLATFORM: "device",
 | 
						|
                CONF_TYPE: trigger,
 | 
						|
            }
 | 
						|
        )
 | 
						|
    return triggers
 | 
						|
 | 
						|
 | 
						|
async def async_attach_trigger(
 | 
						|
    hass: HomeAssistant,
 | 
						|
    config: ConfigType,
 | 
						|
    action: TriggerActionType,
 | 
						|
    trigger_info: TriggerInfo,
 | 
						|
) -> CALLBACK_TYPE:
 | 
						|
    """Listen for state changes based on configuration."""
 | 
						|
    event_config = {
 | 
						|
        event_trigger.CONF_PLATFORM: "event",
 | 
						|
        event_trigger.CONF_EVENT_TYPE: YOLINK_EVENT,
 | 
						|
        event_trigger.CONF_EVENT_DATA: {
 | 
						|
            CONF_DEVICE_ID: config[CONF_DEVICE_ID],
 | 
						|
            CONF_TYPE: config[CONF_TYPE],
 | 
						|
        },
 | 
						|
    }
 | 
						|
    event_config = event_trigger.TRIGGER_SCHEMA(event_config)
 | 
						|
    return await event_trigger.async_attach_trigger(
 | 
						|
        hass, event_config, action, trigger_info, platform_type="device"
 | 
						|
    )
 |