Replacing `async_track_state_change` with `async_track_state_change_event`
 · One min read
async_track_state_change is deprecated and will be removed in Home Assistant 2025.5. async_track_state_change_event should be used instead.
async_track_state_change always creates a top-level listener for EVENT_STATE_CHANGED, which would have to reject all state changes that did not match the desired entities. This design presented a performance problem when there were many integrations using async_track_state_change. async_track_state_change has been phased out in core since the introduction of async_track_state_change_event, with the last instance being removed in 2024.5.
Example with async_track_state_change:
from homeassistant.core import State, callback
from homeassistant.helper.event import async_track_state_change
@callback
def _async_on_change(entity_id: str, old_state: State | None, new_state: State | None) -> None:
    ...
unsub = async_track_state_change(hass, "sensor.one", _async_on_change)
unsub()
Example replacement with async_track_state_change_event:
from homeassistant.core import Event, EventStateChangedData, callback
from homeassistant.helper.event import async_track_state_change_event
@callback
def _async_on_change(event: Event[EventStateChangedData]) -> None:
    entity_id = event.data["entity_id"]
    old_state = event.data["old_state"]
    new_state = event.data["new_state"]
    ...
unsub = async_track_state_change_event(hass, "sensor.one", _async_on_change)
unsub()