mirror of
https://github.com/home-assistant/core.git
synced 2025-09-08 06:11:31 +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_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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user