core/homeassistant/components/scheduler/time.py

71 lines
2.2 KiB
Python
Raw Normal View History

"""
2015-05-13 06:17:38 +00:00
homeassistant.components.scheduler.time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
An event in the scheduler component that will call the service
every specified day at the time specified.
A time event need to have the type 'time', which service to call and at
which time.
{
"type": "time",
"service": "switch.turn_off",
2014-12-28 10:29:26 +00:00
"time": "22:00:00"
}
"""
from datetime import timedelta
import logging
import homeassistant.util.dt as dt_util
from homeassistant.helpers.event import track_point_in_time
from homeassistant.components.scheduler import ServiceEventListener
_LOGGER = logging.getLogger(__name__)
def create_event_listener(schedule, event_listener_data):
2015-05-13 17:18:30 +00:00
""" Create a TimeEvent based on the description. """
2014-12-03 19:29:15 +00:00
service = event_listener_data['service']
2014-12-28 10:29:26 +00:00
(hour, minute, second) = [int(x) for x in
2014-12-28 23:59:22 +00:00
event_listener_data['time'].split(':')]
2014-12-28 10:29:26 +00:00
return TimeEventListener(schedule, service, hour, minute, second)
2014-12-28 23:59:22 +00:00
# pylint: disable=too-few-public-methods
class TimeEventListener(ServiceEventListener):
2015-05-13 17:18:30 +00:00
""" The time event that the scheduler uses. """
2014-12-28 23:59:22 +00:00
# pylint: disable=too-many-arguments
2014-12-28 10:29:26 +00:00
def __init__(self, schedule, service, hour, minute, second):
ServiceEventListener.__init__(self, schedule, service)
2014-12-28 23:59:22 +00:00
self.hour = hour
self.minute = minute
self.second = second
2014-12-03 19:29:15 +00:00
def schedule(self, hass):
2015-05-13 17:18:30 +00:00
""" Schedule this event so that it will be called. """
next_time = dt_util.now().replace(
hour=self.hour, minute=self.minute, second=self.second)
# Calculate the next time the event should be executed.
# That is the next day that the schedule is configured to run
while next_time < dt_util.now() or \
2014-12-28 23:59:22 +00:00
next_time.weekday() not in self.my_schedule.days:
next_time = next_time + timedelta(days=1)
# pylint: disable=unused-argument
def execute(now):
""" Call the execute method """
2014-12-03 19:29:15 +00:00
self.execute(hass)
track_point_in_time(hass, execute, next_time)
2014-12-03 19:29:15 +00:00
_LOGGER.info(
'TimeEventListener scheduled for %s, will call service %s.%s',
next_time, self.domain, self.service)