mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 22:37:11 +00:00
Fire an event when timer gets out of sync (#17398)
This commit is contained in:
parent
31981fde7e
commit
0bf10b0b09
@ -168,6 +168,7 @@ EVENT_SERVICE_REGISTERED = 'service_registered'
|
|||||||
EVENT_SERVICE_REMOVED = 'service_removed'
|
EVENT_SERVICE_REMOVED = 'service_removed'
|
||||||
EVENT_LOGBOOK_ENTRY = 'logbook_entry'
|
EVENT_LOGBOOK_ENTRY = 'logbook_entry'
|
||||||
EVENT_THEMES_UPDATED = 'themes_updated'
|
EVENT_THEMES_UPDATED = 'themes_updated'
|
||||||
|
EVENT_TIMER_OUT_OF_SYNC = 'timer_out_of_sync'
|
||||||
|
|
||||||
# #### DEVICE CLASSES ####
|
# #### DEVICE CLASSES ####
|
||||||
DEVICE_CLASS_BATTERY = 'battery'
|
DEVICE_CLASS_BATTERY = 'battery'
|
||||||
@ -216,6 +217,7 @@ ATTR_CREDENTIALS = 'credentials'
|
|||||||
ATTR_NOW = 'now'
|
ATTR_NOW = 'now'
|
||||||
ATTR_DATE = 'date'
|
ATTR_DATE = 'date'
|
||||||
ATTR_TIME = 'time'
|
ATTR_TIME = 'time'
|
||||||
|
ATTR_SECONDS = 'seconds'
|
||||||
|
|
||||||
# Contains domain, service for a SERVICE_CALL event
|
# Contains domain, service for a SERVICE_CALL event
|
||||||
ATTR_DOMAIN = 'domain'
|
ATTR_DOMAIN = 'domain'
|
||||||
|
@ -29,11 +29,11 @@ from voluptuous.humanize import humanize_error
|
|||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_DOMAIN, ATTR_FRIENDLY_NAME, ATTR_NOW, ATTR_SERVICE,
|
ATTR_DOMAIN, ATTR_FRIENDLY_NAME, ATTR_NOW, ATTR_SERVICE,
|
||||||
ATTR_SERVICE_CALL_ID, ATTR_SERVICE_DATA, EVENT_CALL_SERVICE,
|
ATTR_SERVICE_CALL_ID, ATTR_SERVICE_DATA, ATTR_SECONDS, EVENT_CALL_SERVICE,
|
||||||
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP,
|
||||||
|
EVENT_HOMEASSISTANT_CLOSE, EVENT_SERVICE_REMOVED,
|
||||||
EVENT_SERVICE_EXECUTED, EVENT_SERVICE_REGISTERED, EVENT_STATE_CHANGED,
|
EVENT_SERVICE_EXECUTED, EVENT_SERVICE_REGISTERED, EVENT_STATE_CHANGED,
|
||||||
EVENT_TIME_CHANGED, MATCH_ALL, EVENT_HOMEASSISTANT_CLOSE,
|
EVENT_TIME_CHANGED, EVENT_TIMER_OUT_OF_SYNC, MATCH_ALL, __version__)
|
||||||
EVENT_SERVICE_REMOVED, __version__)
|
|
||||||
from homeassistant import loader
|
from homeassistant import loader
|
||||||
from homeassistant.exceptions import (
|
from homeassistant.exceptions import (
|
||||||
HomeAssistantError, InvalidEntityFormatError, InvalidStateError)
|
HomeAssistantError, InvalidEntityFormatError, InvalidStateError)
|
||||||
@ -1297,8 +1297,11 @@ def _async_create_timer(hass: HomeAssistant) -> None:
|
|||||||
hass.bus.async_fire(EVENT_TIME_CHANGED,
|
hass.bus.async_fire(EVENT_TIME_CHANGED,
|
||||||
{ATTR_NOW: now})
|
{ATTR_NOW: now})
|
||||||
|
|
||||||
if monotonic() > target + 1:
|
# If we are more than a second late, a tick was missed
|
||||||
_LOGGER.error('Timer got out of sync. Resetting')
|
late = monotonic() - target
|
||||||
|
if late > 1:
|
||||||
|
hass.bus.async_fire(EVENT_TIMER_OUT_OF_SYNC,
|
||||||
|
{ATTR_SECONDS: late})
|
||||||
|
|
||||||
schedule_tick(now)
|
schedule_tick(now)
|
||||||
|
|
||||||
|
@ -19,9 +19,9 @@ import homeassistant.util.dt as dt_util
|
|||||||
from homeassistant.util.unit_system import (METRIC_SYSTEM)
|
from homeassistant.util.unit_system import (METRIC_SYSTEM)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
__version__, EVENT_STATE_CHANGED, ATTR_FRIENDLY_NAME, CONF_UNIT_SYSTEM,
|
__version__, EVENT_STATE_CHANGED, ATTR_FRIENDLY_NAME, CONF_UNIT_SYSTEM,
|
||||||
ATTR_NOW, EVENT_TIME_CHANGED, EVENT_HOMEASSISTANT_STOP,
|
ATTR_NOW, EVENT_TIME_CHANGED, EVENT_TIMER_OUT_OF_SYNC, ATTR_SECONDS,
|
||||||
EVENT_HOMEASSISTANT_CLOSE, EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED,
|
EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_CLOSE,
|
||||||
EVENT_SERVICE_EXECUTED)
|
EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED, EVENT_SERVICE_EXECUTED)
|
||||||
|
|
||||||
from tests.common import get_test_home_assistant, async_mock_service
|
from tests.common import get_test_home_assistant, async_mock_service
|
||||||
|
|
||||||
@ -916,12 +916,13 @@ def test_timer_out_of_sync(mock_monotonic, loop):
|
|||||||
|
|
||||||
delay, callback, target = hass.loop.call_later.mock_calls[0][1]
|
delay, callback, target = hass.loop.call_later.mock_calls[0][1]
|
||||||
|
|
||||||
with patch.object(ha, '_LOGGER', MagicMock()) as mock_logger, \
|
with patch('homeassistant.core.dt_util.utcnow',
|
||||||
patch('homeassistant.core.dt_util.utcnow',
|
return_value=datetime(2018, 12, 31, 3, 4, 8, 200000)):
|
||||||
return_value=datetime(2018, 12, 31, 3, 4, 8, 200000)):
|
|
||||||
callback(target)
|
callback(target)
|
||||||
|
|
||||||
assert len(mock_logger.error.mock_calls) == 1
|
event_type, event_data = hass.bus.async_fire.mock_calls[1][1]
|
||||||
|
assert event_type == EVENT_TIMER_OUT_OF_SYNC
|
||||||
|
assert abs(event_data[ATTR_SECONDS] - 2.433333) < 0.001
|
||||||
|
|
||||||
assert len(funcs) == 2
|
assert len(funcs) == 2
|
||||||
fire_time_event, stop_timer = funcs
|
fire_time_event, stop_timer = funcs
|
||||||
|
Loading…
x
Reference in New Issue
Block a user