Make track_point_in_utc_time more async (#3428)
* Make track_point_in_utc_time more async * Make track_point_in_time async friendly
This commit is contained in:
parent
aca375c312
commit
325220e009
1 changed files with 13 additions and 7 deletions
|
@ -6,6 +6,7 @@ from datetime import timedelta
|
||||||
from ..const import (
|
from ..const import (
|
||||||
ATTR_NOW, EVENT_STATE_CHANGED, EVENT_TIME_CHANGED, MATCH_ALL)
|
ATTR_NOW, EVENT_STATE_CHANGED, EVENT_TIME_CHANGED, MATCH_ALL)
|
||||||
from ..util import dt as dt_util
|
from ..util import dt as dt_util
|
||||||
|
from ..util.async import run_callback_threadsafe
|
||||||
|
|
||||||
|
|
||||||
def track_state_change(hass, entity_ids, action, from_state=None,
|
def track_state_change(hass, entity_ids, action, from_state=None,
|
||||||
|
@ -59,9 +60,10 @@ def track_point_in_time(hass, action, point_in_time):
|
||||||
utc_point_in_time = dt_util.as_utc(point_in_time)
|
utc_point_in_time = dt_util.as_utc(point_in_time)
|
||||||
|
|
||||||
@ft.wraps(action)
|
@ft.wraps(action)
|
||||||
|
@asyncio.coroutine
|
||||||
def utc_converter(utc_now):
|
def utc_converter(utc_now):
|
||||||
"""Convert passed in UTC now to local now."""
|
"""Convert passed in UTC now to local now."""
|
||||||
action(dt_util.as_local(utc_now))
|
hass.async_add_job(action, dt_util.as_local(utc_now))
|
||||||
|
|
||||||
return track_point_in_utc_time(hass, utc_converter, utc_point_in_time)
|
return track_point_in_utc_time(hass, utc_converter, utc_point_in_time)
|
||||||
|
|
||||||
|
@ -86,15 +88,19 @@ def track_point_in_utc_time(hass, action, point_in_time):
|
||||||
# listener gets lined up twice to be executed. This will make
|
# listener gets lined up twice to be executed. This will make
|
||||||
# sure the second time it does nothing.
|
# sure the second time it does nothing.
|
||||||
point_in_time_listener.run = True
|
point_in_time_listener.run = True
|
||||||
|
async_remove()
|
||||||
|
|
||||||
def fire_action():
|
hass.async_add_job(action, now)
|
||||||
"""Run the point in time listener action."""
|
|
||||||
remove()
|
|
||||||
action(now)
|
|
||||||
|
|
||||||
hass.add_job(fire_action)
|
future = run_callback_threadsafe(
|
||||||
|
hass.loop, hass.bus.async_listen, EVENT_TIME_CHANGED,
|
||||||
|
point_in_time_listener)
|
||||||
|
async_remove = future.result()
|
||||||
|
|
||||||
|
def remove():
|
||||||
|
"""Remove listener."""
|
||||||
|
run_callback_threadsafe(hass.loop, async_remove).result()
|
||||||
|
|
||||||
remove = hass.bus.listen(EVENT_TIME_CHANGED, point_in_time_listener)
|
|
||||||
return remove
|
return remove
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue