diff --git a/homeassistant/components/light/trigger.py b/homeassistant/components/light/trigger.py index ffe33e84302..7e7a0dc29fd 100644 --- a/homeassistant/components/light/trigger.py +++ b/homeassistant/components/light/trigger.py @@ -11,7 +11,13 @@ from homeassistant.const import ( STATE_OFF, STATE_ON, ) -from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback +from homeassistant.core import ( + CALLBACK_TYPE, + HassJob, + HomeAssistant, + callback, + split_entity_id, +) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.event import process_state_match from homeassistant.helpers.target import ( @@ -28,7 +34,7 @@ BEHAVIOR_FIRST = "first" BEHAVIOR_LAST = "last" BEHAVIOR_ANY = "any" -STATE_PLATFORM_TYPE = f"state" +STATE_PLATFORM_TYPE = "state" STATE_TRIGGER_SCHEMA = vol.All( cv.TRIGGER_BASE_SCHEMA.extend( { @@ -132,8 +138,16 @@ class StateTrigger(Trigger): event.context, ) + def entity_filter(entities: set[str]) -> set[str]: + """Filter entities of this domain.""" + return { + entity_id + for entity_id in entities + if split_entity_id(entity_id)[0] == DOMAIN + } + return async_track_target_selector_state_change_event( - self.hass, self.config, state_change_listener + self.hass, self.config, state_change_listener, entity_filter ) diff --git a/homeassistant/helpers/target.py b/homeassistant/helpers/target.py index 0b902ea4d23..5286daaeef0 100644 --- a/homeassistant/helpers/target.py +++ b/homeassistant/helpers/target.py @@ -268,11 +268,13 @@ class TargetStateChangeTracker: hass: HomeAssistant, selector_data: TargetSelectorData, action: Callable[[TargetStateChangedData], Any], + entity_filter: Callable[[set[str]], set[str]], ) -> None: """Initialize the state change tracker.""" self._hass = hass self._selector_data = selector_data self._action = action + self._entity_filter = entity_filter self._state_change_unsub: CALLBACK_TYPE | None = None self._registry_unsubs: list[CALLBACK_TYPE] = [] @@ -289,7 +291,9 @@ class TargetStateChangeTracker: self._hass, self._selector_data, expand_group=False ) - tracked_entities = selected.referenced.union(selected.indirectly_referenced) + tracked_entities = self._entity_filter( + selected.referenced.union(selected.indirectly_referenced) + ) @callback def state_change_listener(event: Event[EventStateChangedData]) -> None: @@ -348,6 +352,7 @@ def async_track_target_selector_state_change_event( hass: HomeAssistant, target_selector_config: ConfigType, action: Callable[[TargetStateChangedData], Any], + entity_filter: Callable[[set[str]], set[str]] = lambda x: x, ) -> CALLBACK_TYPE: """Track state changes for entities referenced directly or indirectly in a target selector.""" selector_data = TargetSelectorData(target_selector_config) @@ -355,5 +360,5 @@ def async_track_target_selector_state_change_event( raise HomeAssistantError( f"Target selector {target_selector_config} does not have any selectors defined" ) - tracker = TargetStateChangeTracker(hass, selector_data, action) + tracker = TargetStateChangeTracker(hass, selector_data, action, entity_filter) return tracker.async_setup()