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. -
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.
-
@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") })