1
mirror of https://github.com/home-assistant/core synced 2024-07-30 21:18:57 +02:00

Use EventType for state changed [core] (#97115)

This commit is contained in:
Marc Mueller 2023-07-24 01:10:03 +02:00 committed by GitHub
parent 051929984d
commit 2618bfc073
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 145 additions and 84 deletions

View File

@ -28,7 +28,6 @@ from homeassistant.const import (
) )
from homeassistant.core import ( from homeassistant.core import (
CALLBACK_TYPE, CALLBACK_TYPE,
Event,
HomeAssistant, HomeAssistant,
ServiceCall, ServiceCall,
State, State,
@ -38,13 +37,16 @@ from homeassistant.core import (
from homeassistant.helpers import config_validation as cv, entity_registry as er, start from homeassistant.helpers import config_validation as cv, entity_registry as er, start
from homeassistant.helpers.entity import Entity, async_generate_entity_id from homeassistant.helpers.entity import Entity, async_generate_entity_id
from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.integration_platform import ( from homeassistant.helpers.integration_platform import (
async_process_integration_platform_for_component, async_process_integration_platform_for_component,
async_process_integration_platforms, async_process_integration_platforms,
) )
from homeassistant.helpers.reload import async_reload_integration_platforms from homeassistant.helpers.reload import async_reload_integration_platforms
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType, EventType
from homeassistant.loader import bind_hass from homeassistant.loader import bind_hass
from .const import CONF_HIDE_MEMBERS from .const import CONF_HIDE_MEMBERS
@ -737,7 +739,9 @@ class Group(Entity):
"""Handle removal from Home Assistant.""" """Handle removal from Home Assistant."""
self._async_stop() self._async_stop()
async def _async_state_changed_listener(self, event: Event) -> None: async def _async_state_changed_listener(
self, event: EventType[EventStateChangedData]
) -> None:
"""Respond to a member state changing. """Respond to a member state changing.
This method must be run in the event loop. This method must be run in the event loop.
@ -748,7 +752,7 @@ class Group(Entity):
self.async_set_context(event.context) self.async_set_context(event.context)
if (new_state := event.data.get("new_state")) is None: if (new_state := event.data["new_state"]) is None:
# The state was removed from the state machine # The state was removed from the state machine
self._reset_tracked_state() self._reset_tracked_state()

View File

@ -21,11 +21,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
@ -114,7 +117,9 @@ class BinarySensorGroup(GroupEntity, BinarySensorEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData],
) -> None:
"""Handle child updates.""" """Handle child updates."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_defer_or_update_ha_state() self.async_defer_or_update_ha_state()

View File

@ -38,11 +38,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, State, callback from homeassistant.core import HomeAssistant, State, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
from .util import attribute_equal, reduce_attribute from .util import attribute_equal, reduce_attribute
@ -126,10 +129,13 @@ class CoverGroup(GroupEntity, CoverEntity):
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
@callback @callback
def _update_supported_features_event(self, event: Event) -> None: def _update_supported_features_event(
self, event: EventType[EventStateChangedData]
) -> None:
self.async_set_context(event.context) self.async_set_context(event.context)
if (entity := event.data.get("entity_id")) is not None: self.async_update_supported_features(
self.async_update_supported_features(entity, event.data.get("new_state")) event.data["entity_id"], event.data["new_state"]
)
@callback @callback
def async_update_supported_features( def async_update_supported_features(

View File

@ -35,11 +35,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, State, callback from homeassistant.core import HomeAssistant, State, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
from .util import ( from .util import (
@ -142,10 +145,13 @@ class FanGroup(GroupEntity, FanEntity):
return self._oscillating return self._oscillating
@callback @callback
def _update_supported_features_event(self, event: Event) -> None: def _update_supported_features_event(
self, event: EventType[EventStateChangedData]
) -> None:
self.async_set_context(event.context) self.async_set_context(event.context)
if (entity := event.data.get("entity_id")) is not None: self.async_update_supported_features(
self.async_update_supported_features(entity, event.data.get("new_state")) event.data["entity_id"], event.data["new_state"]
)
@callback @callback
def async_update_supported_features( def async_update_supported_features(

View File

@ -44,11 +44,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
from .util import find_state_attributes, mean_tuple, reduce_attribute from .util import find_state_attributes, mean_tuple, reduce_attribute
@ -154,7 +157,9 @@ class LightGroup(GroupEntity, LightEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData],
) -> None:
"""Handle child updates.""" """Handle child updates."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_defer_or_update_ha_state() self.async_defer_or_update_ha_state()

View File

@ -28,11 +28,14 @@ from homeassistant.const import (
STATE_UNKNOWN, STATE_UNKNOWN,
STATE_UNLOCKING, STATE_UNLOCKING,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
@ -115,7 +118,9 @@ class LockGroup(GroupEntity, LockEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData],
) -> None:
"""Handle child updates.""" """Handle child updates."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_defer_or_update_ha_state() self.async_defer_or_update_ha_state()

View File

@ -44,11 +44,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, State, callback from homeassistant.core import HomeAssistant, State, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
KEY_ANNOUNCE = "announce" KEY_ANNOUNCE = "announce"
KEY_CLEAR_PLAYLIST = "clear_playlist" KEY_CLEAR_PLAYLIST = "clear_playlist"
@ -130,11 +133,11 @@ class MediaPlayerGroup(MediaPlayerEntity):
} }
@callback @callback
def async_on_state_change(self, event: Event) -> None: def async_on_state_change(self, event: EventType[EventStateChangedData]) -> None:
"""Update supported features and state when a new state is received.""" """Update supported features and state when a new state is received."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_update_supported_features( self.async_update_supported_features(
event.data.get("entity_id"), event.data.get("new_state") # type: ignore[arg-type] event.data["entity_id"], event.data["new_state"]
) )
self.async_update_state() self.async_update_state()

View File

@ -33,11 +33,19 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, State, callback from homeassistant.core import HomeAssistant, State, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import (
ConfigType,
DiscoveryInfoType,
EventType,
StateType,
)
from . import GroupEntity from . import GroupEntity
from .const import CONF_IGNORE_NON_NUMERIC from .const import CONF_IGNORE_NON_NUMERIC
@ -299,7 +307,9 @@ class SensorGroup(GroupEntity, SensorEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData],
) -> None:
"""Handle child updates.""" """Handle child updates."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_defer_or_update_ha_state() self.async_defer_or_update_ha_state()

View File

@ -19,11 +19,14 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from . import GroupEntity from . import GroupEntity
@ -113,7 +116,9 @@ class SwitchGroup(GroupEntity, SwitchEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData],
) -> None:
"""Handle child updates.""" """Handle child updates."""
self.async_set_context(event.context) self.async_set_context(event.context)
self.async_defer_or_update_ha_state() self.async_defer_or_update_ha_state()

View File

@ -30,10 +30,12 @@ from homeassistant.core import (
valid_entity_id, valid_entity_id,
) )
from homeassistant.helpers.event import ( from homeassistant.helpers.event import (
EventStateChangedData,
async_track_point_in_utc_time, async_track_point_in_utc_time,
async_track_state_change_event, async_track_state_change_event,
) )
from homeassistant.helpers.json import JSON_DUMP from homeassistant.helpers.json import JSON_DUMP
from homeassistant.helpers.typing import EventType
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import EVENT_COALESCE_TIME, MAX_PENDING_HISTORY_STATES from .const import EVENT_COALESCE_TIME, MAX_PENDING_HISTORY_STATES
@ -373,14 +375,12 @@ def _async_subscribe_events(
assert is_callback(target), "target must be a callback" assert is_callback(target), "target must be a callback"
@callback @callback
def _forward_state_events_filtered(event: Event) -> None: def _forward_state_events_filtered(event: EventType[EventStateChangedData]) -> None:
"""Filter state events and forward them.""" """Filter state events and forward them."""
if (new_state := event.data.get("new_state")) is None or ( if (new_state := event.data["new_state"]) is None or (
old_state := event.data.get("old_state") old_state := event.data["old_state"]
) is None: ) is None:
return return
assert isinstance(new_state, State)
assert isinstance(old_state, State)
if ( if (
(significant_changes_only or minimal_response) (significant_changes_only or minimal_response)
and new_state.state == old_state.state and new_state.state == old_state.state

View File

@ -23,7 +23,11 @@ from homeassistant.core import (
split_entity_id, split_entity_id,
) )
from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import EventType
from .const import ALWAYS_CONTINUOUS_DOMAINS, AUTOMATION_EVENTS, BUILT_IN_EVENTS, DOMAIN from .const import ALWAYS_CONTINUOUS_DOMAINS, AUTOMATION_EVENTS, BUILT_IN_EVENTS, DOMAIN
from .models import LogbookConfig from .models import LogbookConfig
@ -184,11 +188,11 @@ def async_subscribe_events(
return return
@callback @callback
def _forward_state_events_filtered(event: Event) -> None: def _forward_state_events_filtered(event: EventType[EventStateChangedData]) -> None:
if event.data.get("old_state") is None or event.data.get("new_state") is None: if (old_state := event.data["old_state"]) is None or (
new_state := event.data["new_state"]
) is None:
return return
new_state: State = event.data["new_state"]
old_state: State = event.data["old_state"]
if _is_state_filtered(ent_reg, new_state, old_state) or ( if _is_state_filtered(ent_reg, new_state, old_state) or (
entities_filter and not entities_filter(new_state.entity_id) entities_filter and not entities_filter(new_state.entity_id)
): ):
@ -207,7 +211,7 @@ def async_subscribe_events(
subscriptions.append( subscriptions.append(
hass.bus.async_listen( hass.bus.async_listen(
EVENT_STATE_CHANGED, EVENT_STATE_CHANGED,
_forward_state_events_filtered, _forward_state_events_filtered, # type: ignore[arg-type]
run_immediately=True, run_immediately=True,
) )
) )

View File

@ -15,12 +15,15 @@ from homeassistant.const import (
STATE_ON, STATE_ON,
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, EventType
from .const import DOMAIN as SWITCH_DOMAIN from .const import DOMAIN as SWITCH_DOMAIN
@ -93,7 +96,9 @@ class LightSwitch(LightEntity):
"""Register callbacks.""" """Register callbacks."""
@callback @callback
def async_state_changed_listener(event: Event | None = None) -> None: def async_state_changed_listener(
event: EventType[EventStateChangedData] | None = None,
) -> None:
"""Handle child updates.""" """Handle child updates."""
if ( if (
state := self.hass.states.get(self._switch_entity_id) state := self.hass.states.get(self._switch_entity_id)

View File

@ -14,10 +14,8 @@ from homeassistant.const import (
) )
from homeassistant.core import ( from homeassistant.core import (
CALLBACK_TYPE, CALLBACK_TYPE,
Event,
HassJob, HassJob,
HomeAssistant, HomeAssistant,
State,
callback, callback,
) )
from homeassistant.helpers import ( from homeassistant.helpers import (
@ -26,9 +24,12 @@ from homeassistant.helpers import (
entity_registry as er, entity_registry as er,
location, location,
) )
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import (
EventStateChangedData,
async_track_state_change_event,
)
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType, EventType
EVENT_ENTER = "enter" EVENT_ENTER = "enter"
EVENT_LEAVE = "leave" EVENT_LEAVE = "leave"
@ -78,11 +79,11 @@ async def async_attach_trigger(
job = HassJob(action) job = HassJob(action)
@callback @callback
def zone_automation_listener(zone_event: Event) -> None: def zone_automation_listener(zone_event: EventType[EventStateChangedData]) -> None:
"""Listen for state changes and calls action.""" """Listen for state changes and calls action."""
entity = zone_event.data.get("entity_id") entity = zone_event.data["entity_id"]
from_s: State | None = zone_event.data.get("old_state") from_s = zone_event.data["old_state"]
to_s: State | None = zone_event.data.get("new_state") to_s = zone_event.data["new_state"]
if ( if (
from_s from_s

View File

@ -21,6 +21,7 @@ from homeassistant.exceptions import TemplateError
from homeassistant.helpers.device_registry import EVENT_DEVICE_REGISTRY_UPDATED from homeassistant.helpers.device_registry import EVENT_DEVICE_REGISTRY_UPDATED
from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED
from homeassistant.helpers.event import ( from homeassistant.helpers.event import (
EventStateChangedData,
TrackStates, TrackStates,
TrackTemplate, TrackTemplate,
TrackTemplateResult, TrackTemplateResult,
@ -45,6 +46,7 @@ from homeassistant.helpers.event import (
track_point_in_utc_time, track_point_in_utc_time,
) )
from homeassistant.helpers.template import Template, result_as_boolean from homeassistant.helpers.template import Template, result_as_boolean
from homeassistant.helpers.typing import EventType
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
@ -434,21 +436,21 @@ async def test_async_track_state_change_event(hass: HomeAssistant) -> None:
multiple_entity_id_tracker = [] multiple_entity_id_tracker = []
@ha.callback @ha.callback
def single_run_callback(event): def single_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
single_entity_id_tracker.append((old_state, new_state)) single_entity_id_tracker.append((old_state, new_state))
@ha.callback @ha.callback
def multiple_run_callback(event): def multiple_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
multiple_entity_id_tracker.append((old_state, new_state)) multiple_entity_id_tracker.append((old_state, new_state))
@ha.callback @ha.callback
def callback_that_throws(event): def callback_that_throws(event: EventType[EventStateChangedData]) -> None:
raise ValueError raise ValueError
unsub_single = async_track_state_change_event( unsub_single = async_track_state_change_event(
@ -4302,16 +4304,16 @@ async def test_track_state_change_event_chain_multple_entity(
tracker_unsub = [] tracker_unsub = []
@ha.callback @ha.callback
def chained_single_run_callback(event): def chained_single_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
chained_tracker_called.append((old_state, new_state)) chained_tracker_called.append((old_state, new_state))
@ha.callback @ha.callback
def single_run_callback(event): def single_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
tracker_called.append((old_state, new_state)) tracker_called.append((old_state, new_state))
@ -4356,16 +4358,16 @@ async def test_track_state_change_event_chain_single_entity(
tracker_unsub = [] tracker_unsub = []
@ha.callback @ha.callback
def chained_single_run_callback(event): def chained_single_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
chained_tracker_called.append((old_state, new_state)) chained_tracker_called.append((old_state, new_state))
@ha.callback @ha.callback
def single_run_callback(event): def single_run_callback(event: EventType[EventStateChangedData]) -> None:
old_state = event.data.get("old_state") old_state = event.data["old_state"]
new_state = event.data.get("new_state") new_state = event.data["new_state"]
tracker_called.append((old_state, new_state)) tracker_called.append((old_state, new_state))