NEWS
Scheduling / Timing in Java Script
-
Hallo zusammen,
ich habe mal eine Frage im Zusammenhang mit dem Scheduling / Timing in Java Script.
Vielleicht kann mir jemand einmal einen Schubs geben.Ich habe eine Funktion "abfrageTasmota", die alle 6 Sekunden ausgeführt wird und nach einer Minute (also nach 10 Aufrufen) ein Ergebnis liefert. So wie unten dargestellt klappt das auch problemlos per Scheduler.
schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
Ich würde allerdings gerne das Ergebnis immer zur (bzw. kurz vor) jeder vollen Minute erhalten, unabhängig davon, wann das Script mal gestartet wurde. Daher würde ich das gerne mit dem Scheduler einmal in der Minute starten und dann alle 6 Sekunden erneut ausführen. Leider klappt das nicht so, wie ich mir das vorgestellt habe:
schedule('59 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen setTimeout(abfrageTasmota, 6000)
Welchen Denkfehler mache ich und wie kann ich das Problem lösen?
Vielen Dank und Gruß
-
@opöl sagte: Ergebnis immer zur (bzw. kurz vor) jeder vollen Minute erhalten
function abfrageTasmota() { // Abfrage if(new Date().getSeconds() == 59) { // Auswertung } } schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
-
@paul53 ,
Danke, das wäre ein denkbarer Ansatz, dazu müsste ich aber das Script umbauen. Sonst passen die Berechnungen nicht mehr zur Ausgabe. Die stehen erst nach den 10 Durchläufen zur Verfügung. Wenn ich Deinen Ansatz richtig verstehe, dann verhält sich die Ausgabe dazu asynchron. Ich würde lieber bei einem Aufruf per Scheduler und einem Delay mit sleep oder Timeout arbeiten.
Vielleicht hat jemand dazu eine Idee?Gruß
-
@opöl sagte: verhält sich die Ausgabe dazu asynchron.
Nein, die Auswertung der 10 zuvor abgefragten Werte erfolgt in der 59. Sekunde synchron.
Asynchron wäre die Auswertung zur 59. Sekunde mit einem Abfrage-Intervall von 6 s. -
@paul53 ,
mein Script sammelt bei jeder Runde Werte ein, bildet daraus durch Addition und Division durch 10 die Mittelwerte und führt noch weitere Berechnungen aus und zählt einen Zähler von 1 bis 10 hoch. Damit das stimmt, müssen alle 10 Durchläufe zur 59. Sekunde abgeschlossen sein.
Bei dem gegebenen Zeitplan (59,05....) ist aber nicht sichergestellt, dass zur 59 Sekunde alle Durchläufe erfolgt sind. Was ist, wenn das Script z.B. zur 30. Sekunde gestartet wird?Gruß
-
@opöl sagte: Was ist, wenn das Script z.B. zur 30. Sekunde gestartet wird?
Dann werden beim ersten Durchlauf nur 5 Werte eingesammelt, danach aber jede Minute 10 Werte. Das kann man prüfen.
var cnt = 0; var sum = 0; function abfrageTasmota() { // Abfrage sum += wert; cnt++; if(new Date().getSeconds() == 59) { if(cnt == 10) { // Auswertung } cnt = 0; sum = 0; } } schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
-
@paul53 ,
hat geklappt. Danke.
Ich musste noch ein paar Variablen umbauen und mit Denkfehlern kämpfen, aber jetzt funktioniert alles so wie es soll.Gruß