Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
in develop und ab 1.0 kann man init noch +/- integer mitgeben. Per default werden 'Init'-Logiken nach 5 Sekunden ausgeführt.
init-1 zieht die Ausführung eine Sekunde vor.
init+2 verzögert sie um zwei Sekunden.
Davon abgesehen gibt es, schon länger, die Funktion changed_by().
Diese liefert 'init' zurück wenn das Item noch nicht geändert wurde. Oder cache wenn es aus dem Cache aktualisiert wurde.
...
Daher habe ich versucht nach dieser Anleitung eine Zeitschaltuhr in meiner Installation umzusetzen.
...
Was ist denn in SmartVISU noch zu tun, damit es wie im oberen Beispiel aussieht?
Bei mir sieht es bislang so aus: ...
Hallo,
sorry für die späte Antwort. Ich bin nur sporadisch hier unterwegs. Daher kommentiere ich meine Beiträge immer nur als "Vorschläge" oder "Proof of Konzept", weil ich keinen Support zusichern kann.
Zu deinem Versuch:
Aussehen tut das genau so wie erwartet. Was Du brauchst, damit das im Ansatz funktioniert, ist der o.g. Patch (oder das Update auf develope) und die Logik zeitschaltuhr aus dem ersten Post.
Hast Du das alles kopiert? Funktionierts? Was Steht im Debug-Log, wenn du auf (set) klickst und wenn die crontab getriggert wird? Wie sieht deine items.conf aus?
aus dem anderen Thread kommt die Frage, wie der Zustand der variablen crontab-Einträge über einen Neustart zu retten wäre. Was auf die Frage hinaus läuft, wie die Initialisierung abläuft, wenn ein Item mit cache = on gespeichert wird:
(Antwort: let the source be with you... Ist hier ein dokumentiertes Verhalten gesichert?)
Jetzt müsste man nur noch den crontab beim Start richtig initialisieren. (logic mit crontab=init starten und entsprechend abfangen / ist dann Zeitschaltuhr schon aus dem cache initialisiert? / kann man das ggf forcieren? ... so viele Fragen )
Hallo Zusammen,
der Ansatz einen konfigurierbaren Scheduler zu bauen habe ich für mich als sehr ansprechend gefunden, zumal ich den Google-Kalender nicht benutzen möchte.
Daher habe ich versucht nach dieser Anleitung eine Zeitschaltuhr in meiner Installation umzusetzen.
Ich bin erst vor kurzem in diese Materie eingestiegen und das einfache Nachbauen mag mir einfach nicht gelingen. (Ist hier auch mein erster Beitrag)
Wie ist denn die Seite in SmartVISU zu konfigurieren?
ich habe eine Zeile wie folgt eingebaut:
{{ basic.crontab('zeitschaltuhr','aussen.vorn.licht2. zeitschaltuhr','Testschalter') }}
Was ist denn in SmartVISU noch zu tun, damit es wie im oberen Beispiel aussieht?
def change(self, name, **kwargs):
if name in self._scheduler:
for key in kwargs:
if key in self._scheduler[name]:
if key == 'cron':
if isinstance(kwargs[key], str):
_cron = {}
for entry in kwargs[key].split('|'):
desc, __, _value = entry.partition('=')
desc = desc.strip()
if _value == '':
_value = None
else:
_value = _value.strip()
_cron[desc] = _value
if _cron == {}:
kwargs[key] = None
else:
kwargs[key] = _cron
elif key == 'active':
if kwargs['active'] and not self._scheduler[name]['active']:
logger.info("Activating logic: {0}".format(name))
elif not kwargs['active'] and self._scheduler[name]['active']:
logger.info("Deactivating logic: {0}".format(name))
self._scheduler[name][key] = kwargs[key]
else:
logger.warning("Attribute {0} for {1} not specified. Could not change it.".format(key, name))
if self._scheduler[name]['active'] is True:
if 'cycle' in kwargs or 'cron' in kwargs:
self._next_time(name)
else:
self._scheduler[name]['next'] = None
else:
logger.warning("Could not change {0}. No logic/method with this name found.".format(name))
2013-12-07 23:54:42,874 DEBUG Main Triggering zeitschaltuhr - by: Visu source: 192.168.178.23:57646 dest: None value: aussen.vorn.licht2.zeitschaltuhr -- scheduler.py:trigger:162
2013-12-07 23:54:42,880 INFO zeitschaltuhr Zeitschaltuhr Value :aussen.vorn.licht2.zeitschaltuhr -- zeitschaltuhr.py:<module>:4
2013-12-07 23:54:42,885 INFO zeitschaltuhr Zeitschaltuhr EIN/AUS :* * 1 * = 1 | 25 * * * = 0 -- zeitschaltuhr.py:<module>:15
2013-12-07 23:54:42,891 DEBUG zeitschaltuhr ................job[cron]:['* * 1 * = 1 ', ' 25 * * * = 0'] -- scheduler.py:_next_time:278
2013-12-07 23:54:42,896 ERROR zeitschaltuhr Error parsing crontab: * * 1 * = 1 -- scheduler.py:_crontab:364
2013-12-07 23:54:42,913 ERROR zeitschaltuhr Logic: zeitschaltuhr, File: /usr/smarthome/lib/scheduler.py, Line: 287, Method: _next_time, Exception: list indices must be integers, not str -- scheduler.py:_task:336
Traceback (most recent call last):
File "/usr/smarthome/lib/scheduler.py", line 329, in _task
exec(obj.bytecode)
File "/usr/smarthome/logics/zeitschaltuhr.py", line 18, in <module>
sh.scheduler.change(item.id(), cron=new_crontab)
File "/usr/smarthome/lib/scheduler.py", line 255, in change
self._next_time(name)
File "/usr/smarthome/lib/scheduler.py", line 287, in _next_time
value = job['cron'][entry]
TypeError: list indices must be integers, not str
an dieser Stelle habe ich geDEBUGt:
Code:
def _next_time(self, name, offset=None):
job = self._scheduler[name]
if None == job['cron'] == job['cycle']:
self._scheduler[name]['next'] = None
return
next_time = None
value = None
now = self._sh.now()
now = now.replace(microsecond=0)
if job['cycle'] is not None:
cycle = list(job['cycle'].keys())[0]
value = job['cycle'][cycle]
if offset is None:
offset = cycle
next_time = now + datetime.timedelta(seconds=offset)
if job['cron'] is not None:
logger.debug("................job[cron]:{0}".format(job['cron']))
for entry in job['cron']:
ct = self._crontab(entry)
if next_time is not None:
if ct < next_time:
next_time = ct
value = job['cron'][entry]
else:
next_time = ct
value = job['cron'][entry]
self._scheduler[name]['next'] = next_time
self._scheduler[name]['value'] = value
if name not in ['Connections', 'series', 'SQLite dump']:
logger.debug("{0} next time: {1}".format(name, next_time))
offenbar sollte job['cron'] hier ein dict sein, ist aber ein list?!?
was haltet Ihr von folgendem:
- ein Schalter item als Zeitschaltuhr läßt sich über die VISU einstellen
- in der VISU stelle ich die Felder für zwei crontabs für den Ein- und Ausschaltzeitpunkt ein
- über eine Logic modifiziere ich dann die crontab des item
Könnte etwa so aussehen:
im Item ein Unter-Item für die Zeitschaltuhr hinzufügen. Dieses verwaltet den CronTab String:
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: