NEWS
persist timer
-
Hallo,
mit setStateDelayed(id,value,delay) kann man ja eine verzögerte Veränderung eines Datenpunkts relativ zur Ist Zeit programmieren.
Wenn man jetzt aber iobroker neu startet, wird dieser Timer vergessen.Hat jemand schon eine Lösung, wie man diesen Timer wiederherstellen kann?
Es sollte so sein, dass dieser wiederhergestellte Timer genau am selben Zeitpunkt triggert, wie vorher. Also nicht relativ zum aktuellen Zeitpunkt. Und wenn dieser Zeitpunkt abgelaufen ist, dann sollte kein Trigger mehr aufgerufen werden.Der derzeitige Workaround, den ich benutze, ist, dass ich mir aus der Verzögerungen den Zeitpunkt des Triggers berechne und dann mit der neuen Funktion "scheduleById" einen Trigger auslöse. Das erscheint mir aber ziemlich umständlich. Am Liebsten hätte ich eine Funktion, die
setStateDelay_pers(id,value,delay),
clearStateDelayed_pers(id) und eine Funktion
setStateDelayed_restore(id) die ich aufrufe, wenn das Script neu gestartet wird. -
Hallo,
mit setStateDelayed(id,value,delay) kann man ja eine verzögerte Veränderung eines Datenpunkts relativ zur Ist Zeit programmieren.
Wenn man jetzt aber iobroker neu startet, wird dieser Timer vergessen.Hat jemand schon eine Lösung, wie man diesen Timer wiederherstellen kann?
Es sollte so sein, dass dieser wiederhergestellte Timer genau am selben Zeitpunkt triggert, wie vorher. Also nicht relativ zum aktuellen Zeitpunkt. Und wenn dieser Zeitpunkt abgelaufen ist, dann sollte kein Trigger mehr aufgerufen werden.Der derzeitige Workaround, den ich benutze, ist, dass ich mir aus der Verzögerungen den Zeitpunkt des Triggers berechne und dann mit der neuen Funktion "scheduleById" einen Trigger auslöse. Das erscheint mir aber ziemlich umständlich. Am Liebsten hätte ich eine Funktion, die
setStateDelay_pers(id,value,delay),
clearStateDelayed_pers(id) und eine Funktion
setStateDelayed_restore(id) die ich aufrufe, wenn das Script neu gestartet wird.Ich brauche das zwar nicht, weil ich selbst die delays berechne, selbst schalte und beim Neustart einen funktionierenden Default habe. Jedoch wenn ich das machen würde, würde ich mir ein Json in einen State schreiben mit id und endzeitpunkt und beim Start des Skripts das einlesen und ausführen. Natürlich im laufenden Betrieb immer wieder aktualisieren.
-
Hallo,
mit setStateDelayed(id,value,delay) kann man ja eine verzögerte Veränderung eines Datenpunkts relativ zur Ist Zeit programmieren.
Wenn man jetzt aber iobroker neu startet, wird dieser Timer vergessen.Hat jemand schon eine Lösung, wie man diesen Timer wiederherstellen kann?
Es sollte so sein, dass dieser wiederhergestellte Timer genau am selben Zeitpunkt triggert, wie vorher. Also nicht relativ zum aktuellen Zeitpunkt. Und wenn dieser Zeitpunkt abgelaufen ist, dann sollte kein Trigger mehr aufgerufen werden.Der derzeitige Workaround, den ich benutze, ist, dass ich mir aus der Verzögerungen den Zeitpunkt des Triggers berechne und dann mit der neuen Funktion "scheduleById" einen Trigger auslöse. Das erscheint mir aber ziemlich umständlich. Am Liebsten hätte ich eine Funktion, die
setStateDelay_pers(id,value,delay),
clearStateDelayed_pers(id) und eine Funktion
setStateDelayed_restore(id) die ich aufrufe, wenn das Script neu gestartet wird. -
@marty56 sagte in persist timer:
setStateDelayed(
Ich denke, dass mit diesem Kommando etwas anderes bezweckt wird, nämlich das spätere Schreiben eines Datenpunktes und nicht das zeitlich gesteuerte. Oder liege ich da falsch?
Ich habe mir jetzt folgendes gebastelt.
Damit übersteht das verzögerte Schalten auch nach Neutstart von ioBrokerfunction clearStateDelayed_persist(id) { clearStateDelayed(id) setState(id+"_timer",JSON.stringify([])) } function setStateDelayed_persist(id,val,delay,clearRunning) { setStateDelayed(id,val,delay,clearRunning) var timer = getStateDelayed(id) var persist = [] for (var i = 0;i < timer.length;i++) { var timestamp = new Date(new Date().getTime() + timer[i].delay) var date = timestamp.toISOString() persist.push({"date":date,"val":val,"clearRunning":clearRunning}) } setState(id+"_timer",JSON.stringify(persist)) } function restore_setStateDelayed(id) { clearStateDelayed(id) var timer = JSON.parse(get(id + "_timer")) for (var i = 0;i < timer.length;i++) { var persist = timer[i] var delay = new Date(persist.date).getTime() - new Date().getTime() if (delay > 0) setStateDelayed(id,persist.val,delay,persist.clearRunning) } } /* Damit das Bespiel läuft muss der Datenpunkt 1. '0_userdata.0.Test.test_boolean' und 2. '0_userdata.0.Test.test_boolean_timer' vorhanden sein. */ var id = '0_userdata.0.Test.test_boolean' setStateDelayed_persist(id,false,2000) setStateDelayed_persist(id,false,3000,false) //clearStateDelayed_persist(id) setTimeout(function(){restore_setStateDelayed(id)},1000) on({ id: id, change: "any"}, function (obj) { log("getriggert") })
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden