mirror of
https://github.com/home-assistant/core.git
synced 2025-09-07 05:41:32 +02:00
Fix non-light domain entities on trigger
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user