Write timer entity state before firing events (#115151)
This commit is contained in:
parent
f96c5a2905
commit
d007b175c5
2 changed files with 18 additions and 11 deletions
|
@ -325,12 +325,12 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
|
|
||||||
self._end = start + self._remaining
|
self._end = start + self._remaining
|
||||||
|
|
||||||
|
self.async_write_ha_state()
|
||||||
self.hass.bus.async_fire(event, {ATTR_ENTITY_ID: self.entity_id})
|
self.hass.bus.async_fire(event, {ATTR_ENTITY_ID: self.entity_id})
|
||||||
|
|
||||||
self._listener = async_track_point_in_utc_time(
|
self._listener = async_track_point_in_utc_time(
|
||||||
self.hass, self._async_finished, self._end
|
self.hass, self._async_finished, self._end
|
||||||
)
|
)
|
||||||
self.async_write_ha_state()
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_change(self, duration: timedelta) -> None:
|
def async_change(self, duration: timedelta) -> None:
|
||||||
|
@ -351,11 +351,11 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
self._listener()
|
self._listener()
|
||||||
self._end += duration
|
self._end += duration
|
||||||
self._remaining = self._end - dt_util.utcnow().replace(microsecond=0)
|
self._remaining = self._end - dt_util.utcnow().replace(microsecond=0)
|
||||||
|
self.async_write_ha_state()
|
||||||
self.hass.bus.async_fire(EVENT_TIMER_CHANGED, {ATTR_ENTITY_ID: self.entity_id})
|
self.hass.bus.async_fire(EVENT_TIMER_CHANGED, {ATTR_ENTITY_ID: self.entity_id})
|
||||||
self._listener = async_track_point_in_utc_time(
|
self._listener = async_track_point_in_utc_time(
|
||||||
self.hass, self._async_finished, self._end
|
self.hass, self._async_finished, self._end
|
||||||
)
|
)
|
||||||
self.async_write_ha_state()
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_pause(self) -> None:
|
def async_pause(self) -> None:
|
||||||
|
@ -368,8 +368,8 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
self._remaining = self._end - dt_util.utcnow().replace(microsecond=0)
|
self._remaining = self._end - dt_util.utcnow().replace(microsecond=0)
|
||||||
self._state = STATUS_PAUSED
|
self._state = STATUS_PAUSED
|
||||||
self._end = None
|
self._end = None
|
||||||
self.hass.bus.async_fire(EVENT_TIMER_PAUSED, {ATTR_ENTITY_ID: self.entity_id})
|
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
self.hass.bus.async_fire(EVENT_TIMER_PAUSED, {ATTR_ENTITY_ID: self.entity_id})
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_cancel(self) -> None:
|
def async_cancel(self) -> None:
|
||||||
|
@ -381,10 +381,10 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
self._end = None
|
self._end = None
|
||||||
self._remaining = None
|
self._remaining = None
|
||||||
self._running_duration = self._configured_duration
|
self._running_duration = self._configured_duration
|
||||||
|
self.async_write_ha_state()
|
||||||
self.hass.bus.async_fire(
|
self.hass.bus.async_fire(
|
||||||
EVENT_TIMER_CANCELLED, {ATTR_ENTITY_ID: self.entity_id}
|
EVENT_TIMER_CANCELLED, {ATTR_ENTITY_ID: self.entity_id}
|
||||||
)
|
)
|
||||||
self.async_write_ha_state()
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_finish(self) -> None:
|
def async_finish(self) -> None:
|
||||||
|
@ -400,11 +400,11 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
self._end = None
|
self._end = None
|
||||||
self._remaining = None
|
self._remaining = None
|
||||||
self._running_duration = self._configured_duration
|
self._running_duration = self._configured_duration
|
||||||
|
self.async_write_ha_state()
|
||||||
self.hass.bus.async_fire(
|
self.hass.bus.async_fire(
|
||||||
EVENT_TIMER_FINISHED,
|
EVENT_TIMER_FINISHED,
|
||||||
{ATTR_ENTITY_ID: self.entity_id, ATTR_FINISHED_AT: end.isoformat()},
|
{ATTR_ENTITY_ID: self.entity_id, ATTR_FINISHED_AT: end.isoformat()},
|
||||||
)
|
)
|
||||||
self.async_write_ha_state()
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_finished(self, time: datetime) -> None:
|
def _async_finished(self, time: datetime) -> None:
|
||||||
|
@ -418,11 +418,11 @@ class Timer(collection.CollectionEntity, RestoreEntity):
|
||||||
self._end = None
|
self._end = None
|
||||||
self._remaining = None
|
self._remaining = None
|
||||||
self._running_duration = self._configured_duration
|
self._running_duration = self._configured_duration
|
||||||
|
self.async_write_ha_state()
|
||||||
self.hass.bus.async_fire(
|
self.hass.bus.async_fire(
|
||||||
EVENT_TIMER_FINISHED,
|
EVENT_TIMER_FINISHED,
|
||||||
{ATTR_ENTITY_ID: self.entity_id, ATTR_FINISHED_AT: end.isoformat()},
|
{ATTR_ENTITY_ID: self.entity_id, ATTR_FINISHED_AT: end.isoformat()},
|
||||||
)
|
)
|
||||||
self.async_write_ha_state()
|
|
||||||
|
|
||||||
async def async_update_config(self, config: ConfigType) -> None:
|
async def async_update_config(self, config: ConfigType) -> None:
|
||||||
"""Handle when the config is updated."""
|
"""Handle when the config is updated."""
|
||||||
|
|
|
@ -45,7 +45,7 @@ from homeassistant.const import (
|
||||||
EVENT_STATE_CHANGED,
|
EVENT_STATE_CHANGED,
|
||||||
SERVICE_RELOAD,
|
SERVICE_RELOAD,
|
||||||
)
|
)
|
||||||
from homeassistant.core import Context, CoreState, HomeAssistant, State
|
from homeassistant.core import Context, CoreState, Event, HomeAssistant, State, callback
|
||||||
from homeassistant.exceptions import HomeAssistantError, Unauthorized
|
from homeassistant.exceptions import HomeAssistantError, Unauthorized
|
||||||
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.restore_state import StoredState, async_get
|
from homeassistant.helpers.restore_state import StoredState, async_get
|
||||||
|
@ -156,11 +156,12 @@ async def test_methods_and_events(hass: HomeAssistant) -> None:
|
||||||
assert state
|
assert state
|
||||||
assert state.state == STATUS_IDLE
|
assert state.state == STATUS_IDLE
|
||||||
|
|
||||||
results = []
|
results: list[tuple[Event, str]] = []
|
||||||
|
|
||||||
def fake_event_listener(event):
|
@callback
|
||||||
|
def fake_event_listener(event: Event):
|
||||||
"""Fake event listener for trigger."""
|
"""Fake event listener for trigger."""
|
||||||
results.append(event)
|
results.append((event, hass.states.get("timer.test1").state))
|
||||||
|
|
||||||
hass.bus.async_listen(EVENT_TIMER_STARTED, fake_event_listener)
|
hass.bus.async_listen(EVENT_TIMER_STARTED, fake_event_listener)
|
||||||
hass.bus.async_listen(EVENT_TIMER_RESTARTED, fake_event_listener)
|
hass.bus.async_listen(EVENT_TIMER_RESTARTED, fake_event_listener)
|
||||||
|
@ -262,7 +263,10 @@ async def test_methods_and_events(hass: HomeAssistant) -> None:
|
||||||
|
|
||||||
if step["event"] is not None:
|
if step["event"] is not None:
|
||||||
expected_events += 1
|
expected_events += 1
|
||||||
assert results[-1].event_type == step["event"]
|
last_result = results[-1]
|
||||||
|
event, state = last_result
|
||||||
|
assert event.event_type == step["event"]
|
||||||
|
assert state == step["state"]
|
||||||
assert len(results) == expected_events
|
assert len(results) == expected_events
|
||||||
|
|
||||||
|
|
||||||
|
@ -404,6 +408,7 @@ async def test_wait_till_timer_expires(hass: HomeAssistant) -> None:
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
|
@callback
|
||||||
def fake_event_listener(event):
|
def fake_event_listener(event):
|
||||||
"""Fake event listener for trigger."""
|
"""Fake event listener for trigger."""
|
||||||
results.append(event)
|
results.append(event)
|
||||||
|
@ -580,6 +585,7 @@ async def test_timer_restarted_event(hass: HomeAssistant) -> None:
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
|
@callback
|
||||||
def fake_event_listener(event):
|
def fake_event_listener(event):
|
||||||
"""Fake event listener for trigger."""
|
"""Fake event listener for trigger."""
|
||||||
results.append(event)
|
results.append(event)
|
||||||
|
@ -647,6 +653,7 @@ async def test_state_changed_when_timer_restarted(hass: HomeAssistant) -> None:
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
|
@callback
|
||||||
def fake_event_listener(event):
|
def fake_event_listener(event):
|
||||||
"""Fake event listener for trigger."""
|
"""Fake event listener for trigger."""
|
||||||
results.append(event)
|
results.append(event)
|
||||||
|
|
Loading…
Add table
Reference in a new issue