2015-01-16 07:32:27 +00:00
|
|
|
"""
|
|
|
|
homeassistant.components.automation.time
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Offers time listening automation rules.
|
|
|
|
"""
|
2015-09-14 05:25:42 +00:00
|
|
|
import logging
|
|
|
|
|
2015-01-16 07:32:27 +00:00
|
|
|
from homeassistant.util import convert
|
2015-09-14 05:25:42 +00:00
|
|
|
import homeassistant.util.dt as dt_util
|
2015-08-03 15:08:13 +00:00
|
|
|
from homeassistant.helpers.event import track_time_change
|
2015-01-16 07:32:27 +00:00
|
|
|
|
2015-09-15 05:05:40 +00:00
|
|
|
CONF_HOURS = "hours"
|
|
|
|
CONF_MINUTES = "minutes"
|
|
|
|
CONF_SECONDS = "seconds"
|
2015-09-14 05:25:42 +00:00
|
|
|
CONF_BEFORE = "before"
|
|
|
|
CONF_AFTER = "after"
|
|
|
|
CONF_WEEKDAY = "weekday"
|
|
|
|
|
|
|
|
WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
2015-01-16 07:32:27 +00:00
|
|
|
|
2015-09-17 06:24:06 +00:00
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
2015-01-16 07:32:27 +00:00
|
|
|
|
2015-09-14 05:25:42 +00:00
|
|
|
def trigger(hass, config, action):
|
2015-01-16 07:32:27 +00:00
|
|
|
""" Listen for state changes based on `config`. """
|
2015-09-15 15:56:06 +00:00
|
|
|
if CONF_AFTER in config:
|
|
|
|
after = dt_util.parse_time_str(config[CONF_AFTER])
|
|
|
|
if after is None:
|
2015-09-17 06:24:06 +00:00
|
|
|
_LOGGER.error(
|
2015-09-15 15:56:06 +00:00
|
|
|
'Received invalid after value: %s', config[CONF_AFTER])
|
|
|
|
return False
|
|
|
|
hours, minutes, seconds = after.hour, after.minute, after.second
|
2015-09-17 06:24:06 +00:00
|
|
|
elif CONF_HOURS in config or CONF_MINUTES in config \
|
|
|
|
or CONF_SECONDS in config:
|
|
|
|
hours = convert(config.get(CONF_HOURS), int)
|
|
|
|
minutes = convert(config.get(CONF_MINUTES), int)
|
|
|
|
seconds = convert(config.get(CONF_SECONDS), int)
|
|
|
|
else:
|
|
|
|
_LOGGER.error('One of %s, %s, %s OR %s needs to be specified',
|
|
|
|
CONF_HOURS, CONF_MINUTES, CONF_SECONDS, CONF_AFTER)
|
|
|
|
return False
|
2015-09-15 15:56:06 +00:00
|
|
|
|
2015-01-16 07:32:27 +00:00
|
|
|
def time_automation_listener(now):
|
|
|
|
""" Listens for time changes and calls action. """
|
|
|
|
action()
|
|
|
|
|
2015-08-03 15:08:13 +00:00
|
|
|
track_time_change(hass, time_automation_listener,
|
|
|
|
hour=hours, minute=minutes, second=seconds)
|
2015-01-16 07:32:27 +00:00
|
|
|
|
|
|
|
return True
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
|
2015-09-15 05:51:28 +00:00
|
|
|
def if_action(hass, config):
|
2015-09-14 05:25:42 +00:00
|
|
|
""" Wraps action method with time based condition. """
|
|
|
|
before = config.get(CONF_BEFORE)
|
|
|
|
after = config.get(CONF_AFTER)
|
|
|
|
weekday = config.get(CONF_WEEKDAY)
|
|
|
|
|
|
|
|
if before is None and after is None and weekday is None:
|
|
|
|
logging.getLogger(__name__).error(
|
|
|
|
"Missing if-condition configuration key %s, %s or %s",
|
|
|
|
CONF_BEFORE, CONF_AFTER, CONF_WEEKDAY)
|
2015-09-15 05:51:28 +00:00
|
|
|
return None
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
def time_if():
|
|
|
|
""" Validate time based if-condition """
|
|
|
|
now = dt_util.now()
|
|
|
|
if before is not None:
|
2015-09-15 15:56:06 +00:00
|
|
|
time = dt_util.parse_time_str(before)
|
|
|
|
if time is None:
|
|
|
|
return False
|
2015-09-14 05:25:42 +00:00
|
|
|
|
2015-09-15 15:56:06 +00:00
|
|
|
before_point = now.replace(hour=time.hour, minute=time.minute)
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
if now > before_point:
|
2015-09-15 05:51:28 +00:00
|
|
|
return False
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
if after is not None:
|
2015-09-15 15:56:06 +00:00
|
|
|
time = dt_util.parse_time_str(after)
|
|
|
|
if time is None:
|
|
|
|
return False
|
2015-09-14 05:25:42 +00:00
|
|
|
|
2015-09-15 15:56:06 +00:00
|
|
|
after_point = now.replace(hour=time.hour, minute=time.minute)
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
if now < after_point:
|
2015-09-15 05:51:28 +00:00
|
|
|
return False
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
if weekday is not None:
|
|
|
|
now_weekday = WEEKDAYS[now.weekday()]
|
|
|
|
|
|
|
|
if isinstance(weekday, str) and weekday != now_weekday or \
|
|
|
|
now_weekday not in weekday:
|
2015-09-15 05:51:28 +00:00
|
|
|
return False
|
2015-09-14 05:25:42 +00:00
|
|
|
|
2015-09-15 05:51:28 +00:00
|
|
|
return True
|
2015-09-14 05:25:42 +00:00
|
|
|
|
|
|
|
return time_if
|