Hallo,
ich steuere meine Weihnachtsbeleuchtung über crontab. Zusätzlich würde die nächsten Schaltzeitpunkte gerne in meiner Visu anzeigen. Dies funktioniert aber nur mit einem Zeitpunkt, da sh.py nur den nächsten Zeitpunkt in einer Variable vorhält.
Siehe
Ich habe die scheduler.py erweitert so dass für alle cron und cycle Elemente jeweils der nächste Zeitpunkt ermittelt wird und dieser mit dem entsprechenden Value in einem Dict vorgehalten wird.
Das Dict muss vor der Ausgabe sortiert werden. Alternativ kann ein OrderedDict aus collections verwendet werden wovon ich hier aber abgesehen habe.
Das Diff sieht wie folgt aus:
Genutzt werden kann es wie folgt:
Es würde mich freuen wenn dies oder eine ähnliche Funktionalität in ihren Weg in den Dev Branch finden würde. Direkt einchecken wollte ich es nicht, da Änderungen an der lib ja nicht ganz unkritisch sind.
LG
Mode
ich steuere meine Weihnachtsbeleuchtung über crontab. Zusätzlich würde die nächsten Schaltzeitpunkte gerne in meiner Visu anzeigen. Dies funktioniert aber nur mit einem Zeitpunkt, da sh.py nur den nächsten Zeitpunkt in einer Variable vorhält.
Siehe
Code:
sh.scheduler._scheduler['Logi_Weihnachtsbeleuchtung']['next']
Das Dict muss vor der Ausgabe sortiert werden. Alternativ kann ein OrderedDict aus collections verwendet werden wovon ich hier aber abgesehen habe.
Das Diff sieht wie folgt aus:
Code:
diff --git a/lib/scheduler.py b/lib/scheduler.py index b48f829..d025a32 100755 --- a/lib/scheduler.py +++ b/lib/scheduler.py @@ -80,6 +80,7 @@ class Scheduler(threading.Thread): _scheduler = {} _runq = PriorityQueue() _triggerq = PriorityQueue() + knowntriggertime = {} def __init__(self, smarthome): threading.Thread.__init__(self, name='Scheduler') @@ -271,6 +272,7 @@ class Scheduler(threading.Thread): logger.warning("Could not change {0}. No logic/method with this name found.".format(name)) def _next_time(self, name, offset=None): + self.knowntriggertime[name] = {} job = self._scheduler[name] if None == job['cron'] == job['cycle']: self._scheduler[name]['next'] = None @@ -285,9 +287,11 @@ class Scheduler(threading.Thread): if offset is None: offset = cycle next_time = now + datetime.timedelta(seconds=offset) + self.knowntriggertime[name][next_time] = value if job['cron'] is not None: for entry in job['cron']: ct = self._crontab(entry) + self.knowntriggertime[name][ct] = job['cron'][entry] if next_time is not None: if ct < next_time: next_time = ct
Code:
>>> for a in sorted(sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung']): ... a ... sh.scheduler.knowntriggertime['Logi_Weihnachtsbeleuchtung'][a] ... datetime.datetime(2013, 12, 14, 15, 25, 41, 473853, tzinfo=tzutc()) 'on' datetime.datetime(2013, 12, 15, 0, 30, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin')) 'off' datetime.datetime(2013, 12, 15, 6, 0, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin')) 'on' datetime.datetime(2013, 12, 15, 8, 47, 19, 139512, tzinfo=tzutc()) 'off' datetime.datetime(2013, 12, 15, 23, 0, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin')) 'off'
LG
Mode
Kommentar