NEWS
Zeitversatz zwischen State-Zeit und der Zeit einer Messung
-
Hallo zusammen,
angenommen, ich habe einen Sensor, der mir JSON Daten zu Messungen liefert. Im JSON Dokument selbst steht dann ein Zeitstempel, wann diese Messung tatsächlich erfolgte. Wenn nun das Publizieren des JSON Dokumentes aufgrund Netzwerkschwäche etc. verzögert erfolgt, würde der Zeitstempel der Messung vom Zeitstempel des States abweichen. Hier mal ein Beispiel, welche Felder ich meine, auch wenn hier gerade kein Delay in den beiden Zeitstempeln zu sehen ist:
Um das auszutarieren hätte ich mir zum Beispiel für Skripte eine überladene setState Funktion gewünscht, in der man den Time stamp für den State setzen könnte. Scheinbar geht aber das nicht und auch sonst finde ich keine Option, den State Zeotpunkt auf den aus dem JSON Dokument zu setzen.
Hintergrund: Ist ein ziemlicher Edge-Case aber ich habe eine Anwendung, bei der ich die Messwerte Sekundengenau historisiert brauche. In der Historie wird dann aber jeweils der State-Zeitstempel genutzt, der im Zweifel nicht passt. Das würde dann bedeuten, ich muss mir eine aufwändigere Historisierung als die mit Hausmitteln bauen.
Es sei denn ich habe etwas übersehen oder ihr habt noch andere Tipps
-
@stev-io der Screenshot ist leider an der entscheidenden Stelle abgeschnitten.
steht da noch ein Z?
-
@homoran sagte in Zeitversatz zwischen State-Zeit und der Zeit einer Messung:
@stev-io der Screenshot ist leider an der entscheidenden Stelle abgeschnitten.
steht da noch ein Z?
Bin mir fast sicher das es so ist, das Format ist auf jeden Fall das: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON
-
@homoran sagte: steht da noch ein Z?
Wir haben noch Sommerzeit, also müsste die Differenz zu UTC 2 Stunden betragen.
const time = '2023-10-02T15:56:12.000Z' log(formatDate(time, 'hh:mm:ss')); // 17:56:12
-
@homoran sagte in Zeitversatz zwischen State-Zeit und der Zeit einer Messung:
steht da noch ein Z?
Dass da die Zeitzone nicht stimmt, ist offensichtlich.
Er sagt aber ja auch:
auch wenn hier gerade kein Delay in den beiden Zeitstempeln zu sehen ist
@stev-io
Du könntest das automatische Historisieren abschalten und den Wert manuell in die Logging-DB schreiben. Da kannst Du ja dann als Zeitstempel das mitgeben was im JSON steht.Alternative wäre noch, den Logging-Adapter aktiv zu lassen und nach der Änderung eines Wertes den ts des geloggten Wertes zu ändern.
Das hier funktioniert jedenfalls nicht:
const obj = getObject('0_userdata.0.test'); obj.ts = new Date().getTime(); setObject('0_userdata.0.test', obj, function (err) { if (err) log('Cannot write object: ' + err); });
Wäre auch unsinnig, da der Wert zu dem Zeitpunkt längst vom Logging-Adapter in die DB geschrieben wurde.
-
@codierknecht sagte: Das hier funktioniert jedenfalls nicht:
Kann es auch nicht, denn obj.ts enthält den Zeitpunkt vom Erstellen des Objektes und nicht den aktuellen Zeitstempel. Der aktuelle Zeitstempel wird ausschließlich vom js-controller gesetzt.
-
@paul53
Sowas in der Art hatte ich noch im Hinterkopf. Aber: Versuch macht klug -
@paul53 sagte in Zeitversatz zwischen State-Zeit und der Zeit einer Messung:
@codierknecht sagte: Das hier funktioniert jedenfalls nicht:
Kann es auch nicht, denn obj.ts enthält den Zeitpunkt vom Erstellen des Objektes und nicht den aktuellen Zeitstempel. Der aktuelle Zeitstempel wird ausschließlich vom js-controller gesetzt.
Vielleicht verstehe ich das falsch aber einen Zeitstempel kann man setzten:
const d = new Date().getTime() - 300000 setState('0_userdata.0.Test', {val:5, ack:false, ts:d})
In diesem Fall hier, müssten man die States spiegel und die Zeit selbst setzten.
18:07
-
@ticaki sagte: Zeitstempel kann man setzten:
Das war mir nicht bewusst. Wieder was gelernt
An die Objekt-Version von setState() habe ich nicht mehr gedacht (zu lange her). -
@ticaki Wenn das funktioniert, ist es exakt das, was ich gesucht habe. Danke! Habe ich so aus der Doku nicht herausgelesen. Der Source scheint dies aber zu bestätigen. Werde ich dann testen. Danke!