17 from threading
import Thread, Lock
19 from os.path
import isfile, join, expanduser
27 """Next scheduled time for repeating event. Guarantees that the 28 time is not in the past (but could skip interim events) 31 sched_time (float): Scheduled unix time for the event 32 repeat (float): Repeat period in seconds 34 Returns: (float) time for next event 36 next_time = sched_time + repeat
37 while next_time < time.time():
39 next_time = time.time() + abs(repeat)
44 def __init__(self, bus, schedule_file='schedule.json'):
46 Create an event scheduler thread. Will send messages at a 47 predetermined time to the registered targets. 50 bus: Mycroft messagebus (mycroft.messagebus) 51 schedule_file: File to store pending events to on shutdown 53 super(EventScheduler, self).
__init__()
54 data_dir = expanduser(Configuration.get()[
'data_dir'])
65 self.bus.on(
'mycroft.scheduler.schedule_event',
67 self.bus.on(
'mycroft.scheduler.remove_event',
69 self.bus.on(
'mycroft.scheduler.update_event',
71 self.bus.on(
'mycroft.scheduler.get_event',
77 Load json data with active events from json file. 83 json_data = json.load(f)
84 except Exception
as e:
86 current_time = time.time()
89 event_list = json_data[key]
91 self.
events[key] = [tuple(e)
for e
in event_list
92 if e[0] > current_time
or e[1]]
101 Check if an event should be triggered. 105 pending_messages = []
107 current_time = time.time()
110 passed = [(t, r, d)
for (t, r, d)
in e
if t <= current_time]
112 remaining = [(t, r, d)
for t, r, d
in e
if t > current_time]
114 for sched_time, repeat, data
in passed:
115 pending_messages.append(
Message(event, data))
119 remaining.append((next_time, repeat, data))
121 self.
events[event] = remaining
127 for msg
in pending_messages:
131 """ Add event to pending event schedule using thread safe queue. 134 event (str): Handler for the event 135 sched_time ([type]): [description] 136 repeat ([type], optional): Defaults to None. [description] 137 data ([type], optional): Defaults to None. [description] 142 event_list = self.events.get(event, [])
145 if repeat
and event
in self.
events:
146 LOG.debug(
'Repeating event {} is already scheduled, discarding' 150 event_list.append((sched_time, repeat, data))
151 self.
events[event] = event_list
155 Messagebus interface to the schedule_event method. 156 Required data in the message envelope is 158 time: time to emit the event 161 repeat: repeat interval 162 data: data to send along with the event 165 event = message.data.get(
'event')
166 sched_time = message.data.get(
'time')
167 repeat = message.data.get(
'repeat')
168 data = message.data.get(
'data')
169 if event
and sched_time:
172 LOG.error(
'Scheduled event name not provided')
174 LOG.error(
'Scheduled event time not provided')
179 self.events.pop(event)
182 """ Messagebus interface to the remove_event method. """ 183 event = message.data.get(
'event')
189 if len(self.events.get(event, [])) > 0:
190 time, repeat, _ = self.
events[event][0]
191 self.
events[event][0] = (time, repeat, data)
194 """ Messagebus interface to the update_event method. """ 195 event = message.data.get(
'event')
196 data = message.data.get(
'data')
201 Messagebus interface to get_event. 202 Emits another event sending event status 204 event_name = message.data.get(
"name")
207 if event_name
in self.
events:
208 event = self.
events[event_name]
209 emitter_name =
'mycroft.event_status.callback.{}'.format(event_name)
210 self.bus.emit(message.reply(emitter_name, data=event))
214 Write current schedule to disk. 222 Remove repeating events from events dict. 226 self.
events[e] = [i
for i
in self.
events[e]
if i[1]
is None]
230 Remove empty event entries from events dict 237 """ Stop the running thread. """ 240 self.bus.remove_all_listeners(
'mycroft.scheduler.schedule_event')
241 self.bus.remove_all_listeners(
'mycroft.scheduler.remove_event')
242 self.bus.remove_all_listeners(
'mycroft.scheduler.update_event')
def schedule_event_handler(self, message)
def __init__(self, bus, schedule_file='schedule.json')
def update_event(self, event, data)
def schedule_event(self, event, sched_time, repeat=None, data=None)
def get_event_handler(self, message)
def update_event_handler(self, message)
def clear_repeating(self)
def remove_event_handler(self, message)
def remove_event(self, event)
def repeat_time(sched_time, repeat)