Fix non-light domain entities on trigger

This commit is contained in:
abmantis
2025-08-05 18:07:42 +01:00
parent 43c228393c
commit 80cd461146
2 changed files with 24 additions and 5 deletions

View File

@@ -11,7 +11,13 @@ from homeassistant.const import (
STATE_OFF, STATE_OFF,
STATE_ON, 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 import config_validation as cv
from homeassistant.helpers.event import process_state_match from homeassistant.helpers.event import process_state_match
from homeassistant.helpers.target import ( from homeassistant.helpers.target import (
@@ -28,7 +34,7 @@ BEHAVIOR_FIRST = "first"
BEHAVIOR_LAST = "last" BEHAVIOR_LAST = "last"
BEHAVIOR_ANY = "any" BEHAVIOR_ANY = "any"
STATE_PLATFORM_TYPE = f"state" STATE_PLATFORM_TYPE = "state"
STATE_TRIGGER_SCHEMA = vol.All( STATE_TRIGGER_SCHEMA = vol.All(
cv.TRIGGER_BASE_SCHEMA.extend( cv.TRIGGER_BASE_SCHEMA.extend(
{ {
@@ -132,8 +138,16 @@ class StateTrigger(Trigger):
event.context, 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( return async_track_target_selector_state_change_event(
self.hass, self.config, state_change_listener self.hass, self.config, state_change_listener, entity_filter
) )

View File

@@ -268,11 +268,13 @@ class TargetStateChangeTracker:
hass: HomeAssistant, hass: HomeAssistant,
selector_data: TargetSelectorData, selector_data: TargetSelectorData,
action: Callable[[TargetStateChangedData], Any], action: Callable[[TargetStateChangedData], Any],
entity_filter: Callable[[set[str]], set[str]],
) -> None: ) -> None:
"""Initialize the state change tracker.""" """Initialize the state change tracker."""
self._hass = hass self._hass = hass
self._selector_data = selector_data self._selector_data = selector_data
self._action = action self._action = action
self._entity_filter = entity_filter
self._state_change_unsub: CALLBACK_TYPE | None = None self._state_change_unsub: CALLBACK_TYPE | None = None
self._registry_unsubs: list[CALLBACK_TYPE] = [] self._registry_unsubs: list[CALLBACK_TYPE] = []
@@ -289,7 +291,9 @@ class TargetStateChangeTracker:
self._hass, self._selector_data, expand_group=False 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 @callback
def state_change_listener(event: Event[EventStateChangedData]) -> None: def state_change_listener(event: Event[EventStateChangedData]) -> None:
@@ -348,6 +352,7 @@ def async_track_target_selector_state_change_event(
hass: HomeAssistant, hass: HomeAssistant,
target_selector_config: ConfigType, target_selector_config: ConfigType,
action: Callable[[TargetStateChangedData], Any], action: Callable[[TargetStateChangedData], Any],
entity_filter: Callable[[set[str]], set[str]] = lambda x: x,
) -> CALLBACK_TYPE: ) -> CALLBACK_TYPE:
"""Track state changes for entities referenced directly or indirectly in a target selector.""" """Track state changes for entities referenced directly or indirectly in a target selector."""
selector_data = TargetSelectorData(target_selector_config) selector_data = TargetSelectorData(target_selector_config)
@@ -355,5 +360,5 @@ def async_track_target_selector_state_change_event(
raise HomeAssistantError( raise HomeAssistantError(
f"Target selector {target_selector_config} does not have any selectors defined" 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() return tracker.async_setup()