From 56506f259ad8e6ced3d0179de82856ec20b96338 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 14 May 2025 08:05:48 +0200 Subject: [PATCH] Refactor the Trigger class --- homeassistant/components/zwave_js/trigger.py | 12 ++----- .../components/zwave_js/triggers/event.py | 24 +++++++++++++- .../zwave_js/triggers/value_updated.py | 24 +++++++++++++- homeassistant/helpers/trigger.py | 33 ++++++++++++------- 4 files changed, 70 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/zwave_js/trigger.py b/homeassistant/components/zwave_js/trigger.py index 923798d1177..e934faec70c 100644 --- a/homeassistant/components/zwave_js/trigger.py +++ b/homeassistant/components/zwave_js/trigger.py @@ -8,17 +8,11 @@ from homeassistant.helpers.trigger import Trigger from .triggers import event, value_updated TRIGGERS = { - event.PLATFORM_TYPE: Trigger( - event.async_validate_trigger_config, - event.async_attach_trigger, - ), - value_updated.PLATFORM_TYPE: Trigger( - value_updated.async_validate_trigger_config, - value_updated.async_attach_trigger, - ), + event.PLATFORM_TYPE: event.EventTrigger, + value_updated.PLATFORM_TYPE: value_updated.ValueUpdatedTrigger, } -async def async_get_triggers(hass: HomeAssistant) -> dict[str, Trigger]: +async def async_get_triggers(hass: HomeAssistant) -> dict[str, type[Trigger]]: """Return the triggers for Z-Wave JS.""" return TRIGGERS diff --git a/homeassistant/components/zwave_js/triggers/event.py b/homeassistant/components/zwave_js/triggers/event.py index db52683c173..5cecf7096f2 100644 --- a/homeassistant/components/zwave_js/triggers/event.py +++ b/homeassistant/components/zwave_js/triggers/event.py @@ -16,7 +16,7 @@ from homeassistant.const import ATTR_DEVICE_ID, ATTR_ENTITY_ID, CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers.dispatcher import async_dispatcher_connect -from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo +from homeassistant.helpers.trigger import Trigger, TriggerActionType, TriggerInfo from homeassistant.helpers.typing import ConfigType from ..const import ( @@ -251,3 +251,25 @@ async def async_attach_trigger( _create_zwave_listeners() return async_remove + + +class EventTrigger(Trigger): + """Z-Wave JS event trigger.""" + + @classmethod + async def async_validate_trigger_config( + cls, hass: HomeAssistant, config: ConfigType + ) -> ConfigType: + """Validate config.""" + return await async_validate_trigger_config(hass, config) + + @classmethod + async def async_attach_trigger( + cls, + hass: HomeAssistant, + config: ConfigType, + action: TriggerActionType, + trigger_info: TriggerInfo, + ) -> CALLBACK_TYPE: + """Attach a trigger.""" + return await async_attach_trigger(hass, config, action, trigger_info) diff --git a/homeassistant/components/zwave_js/triggers/value_updated.py b/homeassistant/components/zwave_js/triggers/value_updated.py index d6378ea27d5..ba856344a03 100644 --- a/homeassistant/components/zwave_js/triggers/value_updated.py +++ b/homeassistant/components/zwave_js/triggers/value_updated.py @@ -14,7 +14,7 @@ from homeassistant.const import ATTR_DEVICE_ID, ATTR_ENTITY_ID, CONF_PLATFORM, M from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers.dispatcher import async_dispatcher_connect -from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo +from homeassistant.helpers.trigger import Trigger, TriggerActionType, TriggerInfo from homeassistant.helpers.typing import ConfigType from ..config_validation import VALUE_SCHEMA @@ -202,3 +202,25 @@ async def async_attach_trigger( _create_zwave_listeners() return async_remove + + +class ValueUpdatedTrigger(Trigger): + """Z-Wave JS value updated trigger.""" + + @classmethod + async def async_validate_trigger_config( + cls, hass: HomeAssistant, config: ConfigType + ) -> ConfigType: + """Validate config.""" + return await async_validate_trigger_config(hass, config) + + @classmethod + async def async_attach_trigger( + cls, + hass: HomeAssistant, + config: ConfigType, + action: TriggerActionType, + trigger_info: TriggerInfo, + ) -> CALLBACK_TYPE: + """Attach a trigger.""" + return await async_attach_trigger(hass, config, action, trigger_info) diff --git a/homeassistant/helpers/trigger.py b/homeassistant/helpers/trigger.py index bb07d4e54f1..73e3c4a0852 100644 --- a/homeassistant/helpers/trigger.py +++ b/homeassistant/helpers/trigger.py @@ -2,6 +2,7 @@ from __future__ import annotations +import abc import asyncio from collections import defaultdict from collections.abc import Callable, Coroutine @@ -49,18 +50,26 @@ DATA_PLUGGABLE_ACTIONS: HassKey[defaultdict[tuple, PluggableActionsEntry]] = Has ) -@dataclass -class Trigger: - """Trigger descriptor data class.""" +class Trigger(abc.ABC): + """Trigger class.""" - async_validate_trigger_config: Callable[ - [HomeAssistant, ConfigType], - Coroutine[Any, Any, ConfigType], - ] - async_attach_trigger: Callable[ - [HomeAssistant, ConfigType, TriggerActionType, TriggerInfo], - Coroutine[Any, Any, CALLBACK_TYPE], - ] + @classmethod + @abc.abstractmethod + async def async_validate_trigger_config( + cls, hass: HomeAssistant, config: ConfigType + ) -> ConfigType: + """Validate config.""" + + @classmethod + @abc.abstractmethod + async def async_attach_trigger( + cls, + hass: HomeAssistant, + config: ConfigType, + action: TriggerActionType, + trigger_info: TriggerInfo, + ) -> CALLBACK_TYPE: + """Attach a trigger.""" class TriggerProtocol(Protocol): @@ -69,7 +78,7 @@ class TriggerProtocol(Protocol): New implementations should only implement async_get_triggers. """ - async def async_get_triggers(self, hass: HomeAssistant) -> dict[str, Trigger]: + async def async_get_triggers(self, hass: HomeAssistant) -> dict[str, type[Trigger]]: """Return the triggers provided by this integration.""" TRIGGER_SCHEMA: vol.Schema