Seite 1 von 1

UnixZeit umrechnen aus JSON

Verfasst: 10. Apr 2023 18:50
von togi99
Hallo zusammen,
ich benötige eure Hilfe.
Aktuell bin ich noch auf der OpenHab 2.5.12 Version. (Keine Sorge, Update ist geplant und teilweise auch schon realisiert.)

Ich greife per HTTP Binding ein JSON ab. Die Datumsangaben sind in Unix Zeit und ich möchte diese natürlich konvertieren.
Ich war der Meinung, dass ich den Wert direkt bei der Zuordnung zum Item konvertieren könnte; bekomme es allerdings nicht hin bzw. es funktioniert nicht.

Mein Item:
DateTime Watermeter_Last_Update "Update [JS(TimeFormat.js):%s]" <time> { http="<[watermeter:3600000:JSONPATH($.actual.date)]" }

(function(i) {
var date = new Date(parseInt(i) * 1000);
return date;
})(input)

Da ich aktuell keinerlei Fehler bekomme, weiß ich nicht einmal ob mein Script überhaupt getriggert wird.
Eine Konvertierung findet jedoch nicht statt.

Bin für jeden Input dankbar.

Grüße,
Tobi

Re: UnixZeit umrechnen aus JSON

Verfasst: 10. Apr 2023 21:20
von udo1toni
Das Problem ist ein Denkfehler Deinerseits :)

Code: Alles auswählen

DateTime Watermeter_Last_Update "Update [JS(TimeFormat.js):%s]" <time> { http="<[watermeter:3600000:JSONPATH($.actual.date)]" }
                                         ^2^2^2^2^2^2^2^2^2^^                                       ^1^1^1^1^1^1^1^1^1^1^1^^
Du willst zwei Konvertierungen ausführen.
Konvertierung 1 ist JSONPATH, Konvertierung 2 ist JavaScript, so weit, so gut.
Nur musst Du dazu gezwungenermaßen zwei unterschiedliche Stellen der Konfiguration nutzen.
Stelle 1 beeinflusst dabei, welcher Wert an das Item übergeben wird. Es handelt sich dabei aber nicht um DateTime, sondern um Integer. Das Item müsste also, um mit diesem Wert überhaupt etwas anfangen zu können, zwingend vom Typ Number (oder String) sein!
Stelle 2 beeinflusst nicht den Status des Items, sondern lediglich dessen Anzeigeformat.

So, wie Du Dir das wünschst, geht es also leider nicht (in openHAB2).

Unter openHAB2 hast Du (grob) zwei Möglichkeiten:
Erstens: Du liest den Wert aus und nimmst Dabei die erste Stufe der Konvertierung vor. Das Ergebnis speicherst Du in einem Number Item.
Jedes Mal, wenn das Number Item einen andern Wert zugewiesen bekommt, startest Du eine Rule, die den Status des Items in eine transform() Action lädt, in der Du das JavaScript Script unterbringst. Das Ergebnis der Transformation schreibst Du in ein zweites Item, diesmal vom Typ DateTime.

Zweitens: Du schreibst ein erweitertes JavaScript Script, welches sich zusätzlich auch um JSONPATH kümmert. Der Input des JavaScript Scripts ist also das komplette JSON Objekt, der Output das fertige Datum.

Nachteil bei zweitens: Du brauchst für jeden JSONPATH ein eigenes Script, weil man leider keine Parameter übergeben kann. Vorteil: Du brauchst nur ein Item, statt zwei.

Unter openHAB3 (auch schon unter openHAB2, dafür müsstest Du aber die Beta Version des http2 Bindings nutzen, statt das http1 Binding) kannst Du einfach beide Transformations im Channel miteinander verketten.
Falls Du es noch unter openHAB2 "gleich richtig" machen willst, ich habe hier die Beta http2.5.8 noch rumliegen, die hat unter 2.5.12 bei mir zuverlässig funktioniert. Das bedeutet dann, dass Du das http schon als Thing konfigurierst (das wirst Du beim Umstieg auf openHAB3.4.2 ohnehin machen müssen).
Das Binding wurde unter openHAB2 nie offiziell angeboten, im englischen Forum müsste der Thread allerdings auch noch zu finden sein (ich hab nur keine Ahnung, ob das entsprechende Repository mit der .jar noch verfügbar ist - deshalb der Hinweis oben).

Lass Dir nicht zu viel Zeit mit dem Umstieg, im Juni wird openHAB4.0.0 stable werden, dann kannst Du openHAB3.4.2 nicht mehr auf regulärem Weg aufsetzen. Anders als bei openHAB2 gehe ich davon aus, dass es keine "alte" openHAB3-Version zum Download geben wird.
Hintergrund: openHAB2 steht nur deshalb noch zur Verfügung, weil es einzelne Bindings gibt, die nur für openHAB1 zur Verfügung stehen. Diese laufen auch unter openHAB2 (mit dem Compatibility Layer), weshalb als Workaround für die wenigen betroffenen Anwender eine zweite openHAB-Instanz mit openhAB2.5.12 empfohlen wird.
Die Verbindung der beiden Instanzen läuft dann über das openHAB Binding, welches die konfigurierten Items per API-Zugriff abholt bzw. setzt.

Re: UnixZeit umrechnen aus JSON

Verfasst: 10. Apr 2023 21:25
von J-N-K
Ich nutze das selbst nicht und es ist in OH3/4 wegen des neuen Bindings auch etwas anders, aber was ich normalerweise mache ist, ein String Item ohne jede Transformation linken. Dann sieht man schonmal, ob der HTTP Request überhaupt so geht wie vorgesehen. Als nächste füge ich dann schrittweise Transformations hinzu und gucke, ob die Antwort wie erwartet ausfällt.

Wenn das ein Unix Timestamp ist, glaube ich nicht, dass ein DateTime Item den direkt akzeptiert, du wirst einen passenden String erzeugen müssen, den openHAB parsen kann. Konkret denke ich, dass Du die JSONPATH Transformation hier garnicht brauchst, Du kannst das JSON direkt in der JS Transformation handeln.

Re: UnixZeit umrechnen aus JSON

Verfasst: 12. Apr 2023 17:53
von togi99
Vielen Dank Udo für die sehr gute Erklärung.