NEWS
Exakt selben Zeitstempel bei mehreren States setzen?
-
Hallo!
Ich berechne mit einem Script im 5-Minuten-Takt die Mittelwerte mehrerer States, deren Daten eigentlich im Sekundentakt eintrudeln (da ich sie in dieser Zeitauflösung nicht lange in der MySQL halten möchte). Da Script wird also alle 5 Min ausgeführt, durchläuft eine Schleife durch die verschiedenen States, greift sich deren Werte der letzten 5 Min, berechnet und schreibt den jeweiligen Mittelwert dann mittels setSetate jeweils in einem zusätzlichen State weg.
Nun ist es es logischerweise so, dass das Skript ein paar Millisekunden benötigt, um die Schleife zu durchlaufen, entsprechend unterscheiden sich die Zeitstempel der neue erzeugten States um einige Millisekunden.
Das stört mich, da ich die Werte in Grafana gerne in einem gestapelten Diagramm anzeigen möchte. Durch die leicht abweichenden Zeitstempel klappt das nicht so, wie ich mir das wünsche.
Ist es möglich, bei setState den Zeitstempel für den geschriebenen State mitzugeben? Also quasi vorzugeben, dass bei allen Schleifendurchläufen bei setState der selbe Zeitstempel (der z.B. über Date.now() vor dem ersten Schleifendurchlauf erzeugt wird) verwendet wird?
-
@benefit sagte: Ist es möglich, bei setState den Zeitstempel für den geschriebenen State mitzugeben?
Nein, der Zeitstempel wird vom js-controller gesetzt.
-
@benefit Du schreibst das in einen State - der wiederum mit dem SQL-Adapter verbunden ist und die Werte aufzeichnet?
Schau mal in die Beschreibung des SQL-Adapters, du kannst auch direkt Werte mit Zeitstempel in die Datenbank schreiben:
https://github.com/ioBroker/ioBroker.sql#storestateDas siehst du dann zwar nicht mehr im Datenpunkt, ECharts & Co aber ja (also auch Grafana). Ich nutze das z.B. für die Vorhersage meiner Solaranlage.
Du nutzt InfluxDB? Kenne ich mich nicht mit aus, scheint es dort aber auch zu geben: https://github.com/ioBroker/ioBroker.influxdb#storestate
-
@benefit
Ich würde die Angleichung auf 5 Minuten im sql machen
da könntest du die Minuten mit folgender Formel angleichen (aus javascript, aber gibts bestimmt auch für grafanaMath.floor(minuten/5)*5
Problematisch wird es, wenn die Werte genau an der 5 Minutengrenze geschrieben wird
12:04:59
12:05:01
Dann fällt der eine Wert in das eine Raster und der andere in den nächsten Raster. -
@benefit sagte: das Skript ein paar Millisekunden benötigt, um die Schleife zu durchlaufen, entsprechend unterscheiden sich die Zeitstempel der neue erzeugten States um einige Millisekunden.
Schreibe das Ergebnis der Schleifen in Variablen und führe zum Schluss alle setState() unmittelbar hintereinander aus. Dann liegen die Zeitstempel nur wenige ms auseinander.
-
Vielen Dank für die vielen hilfreichen Antworten!
Habe es nun tatsächlich so gelöst wie von @BananaJoe vorgeschlagen. Da ich die States im ioBroker sonst nicht benötige, schreibe ich sie mit storeState von sql-Adapter direkt in die MySQL:
sendTo('sql.0', 'storeState', { id: newStateName, state: {ts: timeStamp, val: averageValue, ack: false, from: 'newStateName'} });
Funktioniert klasse!