From e0db00e089d70f7366724356a5565f3d7b40e30c Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:52:27 +0100 Subject: [PATCH] Allow the creation of multi-domain triggers (#164628) --- .../components/alarm_control_panel/trigger.py | 2 +- .../components/binary_sensor/trigger.py | 2 +- homeassistant/components/button/trigger.py | 2 +- homeassistant/components/climate/trigger.py | 2 +- homeassistant/components/light/trigger.py | 4 ++-- homeassistant/components/scene/trigger.py | 2 +- homeassistant/components/text/trigger.py | 2 +- homeassistant/helpers/trigger.py | 18 +++++++++--------- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/trigger.py b/homeassistant/components/alarm_control_panel/trigger.py index d970ea9ec6b..1334709ab8c 100644 --- a/homeassistant/components/alarm_control_panel/trigger.py +++ b/homeassistant/components/alarm_control_panel/trigger.py @@ -44,7 +44,7 @@ def make_entity_state_trigger_required_features( class CustomTrigger(EntityStateTriggerRequiredFeatures): """Trigger for entity state changes.""" - _domain = domain + _domains = {domain} _to_states = {to_state} _required_features = required_features diff --git a/homeassistant/components/binary_sensor/trigger.py b/homeassistant/components/binary_sensor/trigger.py index 4dfee30b2c2..fe93d1a265a 100644 --- a/homeassistant/components/binary_sensor/trigger.py +++ b/homeassistant/components/binary_sensor/trigger.py @@ -24,7 +24,7 @@ class BinarySensorOnOffTrigger(EntityTargetStateTriggerBase): """Class for binary sensor on/off triggers.""" _device_class: BinarySensorDeviceClass | None - _domain: str = DOMAIN + _domains = {DOMAIN} def entity_filter(self, entities: set[str]) -> set[str]: """Filter entities of this domain.""" diff --git a/homeassistant/components/button/trigger.py b/homeassistant/components/button/trigger.py index 5b9e2904dd1..679e579284b 100644 --- a/homeassistant/components/button/trigger.py +++ b/homeassistant/components/button/trigger.py @@ -14,7 +14,7 @@ from . import DOMAIN class ButtonPressedTrigger(EntityTriggerBase): """Trigger for button entity presses.""" - _domain = DOMAIN + _domains = {DOMAIN} _schema = ENTITY_STATE_TRIGGER_SCHEMA def is_valid_transition(self, from_state: State, to_state: State) -> bool: diff --git a/homeassistant/components/climate/trigger.py b/homeassistant/components/climate/trigger.py index 10f40cad661..61a78829bb1 100644 --- a/homeassistant/components/climate/trigger.py +++ b/homeassistant/components/climate/trigger.py @@ -43,7 +43,7 @@ HVAC_MODE_CHANGED_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA_FIRST_LAST.extend class HVACModeChangedTrigger(EntityTargetStateTriggerBase): """Trigger for entity state changes.""" - _domain = DOMAIN + _domains = {DOMAIN} _schema = HVAC_MODE_CHANGED_TRIGGER_SCHEMA def __init__(self, hass: HomeAssistant, config: TriggerConfig) -> None: diff --git a/homeassistant/components/light/trigger.py b/homeassistant/components/light/trigger.py index 2e087b00397..61f90142d34 100644 --- a/homeassistant/components/light/trigger.py +++ b/homeassistant/components/light/trigger.py @@ -23,7 +23,7 @@ def _convert_uint8_to_percentage(value: Any) -> float: class BrightnessChangedTrigger(EntityNumericalStateAttributeChangedTriggerBase): """Trigger for brightness changed.""" - _domain = DOMAIN + _domains = {DOMAIN} _attribute = ATTR_BRIGHTNESS _converter = staticmethod(_convert_uint8_to_percentage) @@ -34,7 +34,7 @@ class BrightnessCrossedThresholdTrigger( ): """Trigger for brightness crossed threshold.""" - _domain = DOMAIN + _domains = {DOMAIN} _attribute = ATTR_BRIGHTNESS _converter = staticmethod(_convert_uint8_to_percentage) diff --git a/homeassistant/components/scene/trigger.py b/homeassistant/components/scene/trigger.py index c5537b15812..05a930f8ea4 100644 --- a/homeassistant/components/scene/trigger.py +++ b/homeassistant/components/scene/trigger.py @@ -14,7 +14,7 @@ from . import DOMAIN class SceneActivatedTrigger(EntityTriggerBase): """Trigger for scene entity activations.""" - _domain = DOMAIN + _domains = {DOMAIN} _schema = ENTITY_STATE_TRIGGER_SCHEMA def is_valid_transition(self, from_state: State, to_state: State) -> bool: diff --git a/homeassistant/components/text/trigger.py b/homeassistant/components/text/trigger.py index d662a8c978c..7866eaf9af7 100644 --- a/homeassistant/components/text/trigger.py +++ b/homeassistant/components/text/trigger.py @@ -14,7 +14,7 @@ from .const import DOMAIN class TextChangedTrigger(EntityTriggerBase): """Trigger for text entity when its content changes.""" - _domain = DOMAIN + _domains = {DOMAIN} _schema = ENTITY_STATE_TRIGGER_SCHEMA def is_valid_state(self, state: State) -> bool: diff --git a/homeassistant/helpers/trigger.py b/homeassistant/helpers/trigger.py index 188859149ba..26ee693af0e 100644 --- a/homeassistant/helpers/trigger.py +++ b/homeassistant/helpers/trigger.py @@ -336,7 +336,7 @@ ENTITY_STATE_TRIGGER_SCHEMA_FIRST_LAST = ENTITY_STATE_TRIGGER_SCHEMA.extend( class EntityTriggerBase(Trigger): """Trigger for entity state changes.""" - _domain: str + _domains: set[str] _schema: vol.Schema = ENTITY_STATE_TRIGGER_SCHEMA_FIRST_LAST @override @@ -386,11 +386,11 @@ class EntityTriggerBase(Trigger): ) def entity_filter(self, entities: set[str]) -> set[str]: - """Filter entities of this domain.""" + """Filter entities of these domains.""" return { entity_id for entity_id in entities - if split_entity_id(entity_id)[0] == self._domain + if split_entity_id(entity_id)[0] in self._domains } @override @@ -792,7 +792,7 @@ def make_entity_target_state_trigger( class CustomTrigger(EntityTargetStateTriggerBase): """Trigger for entity state changes.""" - _domain = domain + _domains = {domain} _to_states = to_states_set return CustomTrigger @@ -806,7 +806,7 @@ def make_entity_transition_trigger( class CustomTrigger(EntityTransitionTriggerBase): """Trigger for conditional entity state changes.""" - _domain = domain + _domains = {domain} _from_states = from_states _to_states = to_states @@ -821,7 +821,7 @@ def make_entity_origin_state_trigger( class CustomTrigger(EntityOriginStateTriggerBase): """Trigger for entity "from state" changes.""" - _domain = domain + _domains = {domain} _from_state = from_state return CustomTrigger @@ -835,7 +835,7 @@ def make_entity_numerical_state_attribute_changed_trigger( class CustomTrigger(EntityNumericalStateAttributeChangedTriggerBase): """Trigger for numerical state attribute changes.""" - _domain = domain + _domains = {domain} _attribute = attribute return CustomTrigger @@ -849,7 +849,7 @@ def make_entity_numerical_state_attribute_crossed_threshold_trigger( class CustomTrigger(EntityNumericalStateAttributeCrossedThresholdTriggerBase): """Trigger for numerical state attribute changes.""" - _domain = domain + _domains = {domain} _attribute = attribute return CustomTrigger @@ -863,7 +863,7 @@ def make_entity_target_state_attribute_trigger( class CustomTrigger(EntityTargetStateAttributeTriggerBase): """Trigger for entity state changes.""" - _domain = domain + _domains = {domain} _attribute = attribute _attribute_to_state = to_state