Improve precision of timer ticks (#16598)

pull/16618/head
Anders Melchiorsen 2018-09-14 12:28:09 +02:00 committed by Paulus Schoutsen
parent 481f6e09fa
commit e82e75baf3
2 changed files with 22 additions and 7 deletions

View File

@ -1256,4 +1256,5 @@ def _async_create_timer(hass: HomeAssistant) -> None:
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_timer)
_LOGGER.info("Timer:starting")
fire_time_event(monotonic())
slp_seconds = 1 - (dt_util.utcnow().microsecond / 10**6)
hass.loop.call_later(slp_seconds, lambda: fire_time_event(monotonic()))

View File

@ -862,21 +862,29 @@ def test_create_timer(mock_monotonic, loop):
with patch.object(ha, 'callback', mock_callback), \
patch('homeassistant.core.dt_util.utcnow',
return_value=sentinel.mock_date):
return_value=datetime(2018, 12, 31, 3, 4, 5, 333333)):
ha._async_create_timer(hass)
assert len(hass.loop.call_later.mock_calls) == 1
slp_seconds, action = hass.loop.call_later.mock_calls[0][1]
assert abs(slp_seconds - 0.666667) < 0.001
with patch('homeassistant.core.dt_util.utcnow',
return_value=sentinel.mock_date):
action()
assert len(funcs) == 2
fire_time_event, stop_timer = funcs
assert len(hass.bus.async_listen_once.mock_calls) == 1
assert len(hass.bus.async_fire.mock_calls) == 1
assert len(hass.loop.call_later.mock_calls) == 1
assert len(hass.loop.call_later.mock_calls) == 2
event_type, callback = hass.bus.async_listen_once.mock_calls[0][1]
assert event_type == EVENT_HOMEASSISTANT_STOP
assert callback is stop_timer
slp_seconds, callback, nxt = hass.loop.call_later.mock_calls[0][1]
slp_seconds, callback, nxt = hass.loop.call_later.mock_calls[1][1]
assert abs(slp_seconds - 0.9) < 0.001
assert callback is fire_time_event
assert abs(nxt - 11.2) < 0.001
@ -901,15 +909,21 @@ def test_timer_out_of_sync(mock_monotonic, loop):
with patch.object(ha, 'callback', mock_callback), \
patch('homeassistant.core.dt_util.utcnow',
return_value=sentinel.mock_date):
return_value=datetime(2018, 12, 31, 3, 4, 5, 333333)):
ha._async_create_timer(hass)
_, action = hass.loop.call_later.mock_calls[0][1]
with patch('homeassistant.core.dt_util.utcnow',
return_value=sentinel.mock_date):
action()
assert len(funcs) == 2
fire_time_event, stop_timer = funcs
assert len(hass.loop.call_later.mock_calls) == 1
assert len(hass.loop.call_later.mock_calls) == 2
slp_seconds, callback, nxt = hass.loop.call_later.mock_calls[0][1]
slp_seconds, callback, nxt = hass.loop.call_later.mock_calls[1][1]
assert slp_seconds == 1
assert callback is fire_time_event
assert abs(nxt - 12.3) < 0.001