"""Provides device automations for Tasmota.""" from __future__ import annotations from hatasmota.const import AUTOMATION_TYPE_TRIGGER from hatasmota.models import DiscoveryHashType from hatasmota.trigger import TasmotaTrigger from homeassistant.config_entries import ConfigEntry from homeassistant.core import Event, HomeAssistant, callback from homeassistant.helpers.device_registry import ( EVENT_DEVICE_REGISTRY_UPDATED, EventDeviceRegistryUpdatedData, ) from homeassistant.helpers.dispatcher import async_dispatcher_connect from . import device_trigger from .const import DATA_REMOVE_DISCOVER_COMPONENT, DATA_UNSUB from .discovery import TASMOTA_DISCOVERY_ENTITY_NEW async def async_remove_automations(hass: HomeAssistant, device_id: str) -> None: """Remove automations for a Tasmota device.""" await device_trigger.async_remove_triggers(hass, device_id) async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> None: """Set up Tasmota device automation dynamically through discovery.""" async def async_device_removed( event: Event[EventDeviceRegistryUpdatedData], ) -> None: """Handle the removal of a device.""" await async_remove_automations(hass, event.data["device_id"]) @callback def _async_device_removed_filter( event_data: EventDeviceRegistryUpdatedData, ) -> bool: """Filter device registry events.""" return event_data["action"] == "remove" async def async_discover( tasmota_automation: TasmotaTrigger, discovery_hash: DiscoveryHashType ) -> None: """Discover and add a Tasmota device automation.""" if tasmota_automation.automation_type == AUTOMATION_TYPE_TRIGGER: await device_trigger.async_setup_trigger( hass, tasmota_automation, config_entry, discovery_hash ) hass.data[DATA_REMOVE_DISCOVER_COMPONENT.format("device_automation")] = ( async_dispatcher_connect( hass, TASMOTA_DISCOVERY_ENTITY_NEW.format("device_automation"), async_discover, ) ) hass.data[DATA_UNSUB].append( hass.bus.async_listen( EVENT_DEVICE_REGISTRY_UPDATED, async_device_removed, event_filter=_async_device_removed_filter, ) )