Umrechnung von Unixzeit

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

wesseli
Beiträge: 7
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli »

Hallo,

ich benötige Hilfe bei der Umrechnung der Unixzeit.

Ich hole und speichere die Unix-Zeit in dem nachfolgenden String

Code: Alles auswählen

String  VU_Sendung_Verbleibend "Verbleibende Sendungszeit [%s]" <receiver> (gVUBox_Allgemein) { http="<[http://192.168.2.XX:80/web/getcurrent:3000:REGEX(.*?<e2eventremaining>(.*?)</e2eventremaining>.*)]" }
Das funktioniert sehr gut. Dort wird z.B. der Wert "1362" abgelegt und angezeigt.

Nun möchte ich diesen Wert in einer weiteren Variablen über eine Rule ins Format "HH:MM:SS" umwandeln und in der nachfolgenden Variablen ablegen.

Code: Alles auswählen

DateTime VU_Sendung_Verbleibend_Upd "Verbleibende Sendungszeit [%1$tH:%1$tM]" <receiver> (gVUBox_Allgemein)
Leider funktioniert es mit der nachfolgenden Rule nicht.

Code: Alles auswählen

rule "Update verbleibende Sendezeit"
when
    Item VU_Sendung_Verbleibend received update
then
    import org.joda.time.*    
    var DateTime time = new DateTime(Long::parseLong(VU_Sendung_Verbleibend) * 1000L)
    VU_Sendung_Verbleibend_Upd.postUpdate(new DateTimeType(time))
end
Über jeden Hinweis bin ich sehr dankbar.

wesseli

Benutzeravatar
udo1toni
Beiträge: 2589
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni »

Erst mal geht damit los, dass imports innerhalb einer Rule in dieser Form unzulässig sind.
Solltest Du openHAB2 im Einsatz haben, ist ein import mit * ebenfalls unzulässig.
Allerdings ist der import auch unnötig (auch schon unter OH1 ab Version ~OH1.6).

Dann nimmst Du Bezug auf ein Item, Du möchtest aber auf den Status des Items zugreifen.
Ich bin mir auch ziemlich sicher, dass die Markierung der 1000 als Long ebenfalls nicht zulässig ist.
Unsicher bin ich mir beim DateTimeType, und ich hab gerade kein Testsystem zur Hand. Ich gehe jetzt einfach mal davon aus, dass das korrekt ist.

Die Rule sollte dann also so aussehen:

Code: Alles auswählen

rule "Update verbleibende Sendezeit"
when
    Item VU_Sendung_Verbleibend received update
then
    var DateTime dtTime = new DateTime(Long::parseLong(VU_Sendung_Verbleibend.state) * 1000)
    VU_Sendung_Verbleibend_Upd.postUpdate(new DateTimeType(dtTime))
end
Es wäre sinnvoll, den Trigger auf changed zu ändern. Ich bin mir gerade nicht sicher, wie Du verhindern kannst, dass die Rule in eine null-Pointer Exeption läuft, falls der String keine gültige Zahl enthält.

wesseli
Beiträge: 7
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli »

Hallo @udo1toni,

vielen Dank für die Erläuterungen und die Änderungen zur neuen Version. Ich habe die Rule übernommen.

Leider bekomme ich folgenden Fehler:

Code: Alles auswählen

2019-10-03 16:45:23.479 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Update verbleibende Sendezeit': An error occurred during the script execution: Could not invoke method: java.lang.Long.parseLong(java.lang.String) on instance: null
Den Trigger habe ich auf "changed" gestellt. Die nachfolgende Rule habe ich mit den zuvor genannten Variablen genutzt.

Code: Alles auswählen

rule "Update verbleibende Sendezeit"
when
    Item VU_Sendung_Verbleibend changed
then
    var DateTime dtTime = new DateTime(Long::parseLong(VU_Sendung_Verbleibend.state) * 1000)
    VU_Sendung_Verbleibend_Upd.postUpdate(new DateTimeType(dtTime))
end

Benutzeravatar
udo1toni
Beiträge: 2589
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni »

Ja, das ist die erwähnte Exception.

Ein bisschen Logging...

Code: Alles auswählen

rule "Update verbleibende Sendezeit"
when
    Item VU_Sendung_Verbleibend changed
then
    logInfo("sendezeit","verbleibend: {}",VU_Sendung_Verbleibend.state)
    var DateTime dtTime = new DateTime(Long::parseLong(VU_Sendung_Verbleibend.state) * 1000)
    logInfo("sendezeit","nach dme parsen: {}",dtDime)
    VU_Sendung_Verbleibend_Upd.postUpdate(new DateTimeType(dtTime))
end
Mal schauen, wie es dann aussieht (insbesondere die Zeile vor dem Fehler...)

wesseli
Beiträge: 7
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli »

Folgende Log-Einträge:

Code: Alles auswählen

20:50:53.106 [DEBUG] [untime.internal.engine.RuleEngineImpl] - Executing rule 'Update verbleibende Sendezeit'
20:50:53.108 [INFO ] [smarthome.event.ItemStateEvent       ] - VU_Sendung_Verbleibend updated to 3248
20:50:53.110 [INFO ] [smarthome.event.ItemStateChangedEvent] - VU_Sendung_Verbleibend changed from 3251 to 3248
20:50:53.117 [INFO ] [ipse.smarthome.model.script.sendezeit] - verbleibend: 3248
20:50:53.123 [ERROR] [untime.internal.engine.RuleEngineImpl] - Rule 'Update verbleibende Sendezeit': An error occurred during the script execution: Could not invoke method: java.lang.Long.parseLong(java.lang.String) on instance: null
20:50:53.136 [DEBUG] [hab.binding.http.internal.HttpBinding] - transformed response is '1570126500'
Danach nichts mehr.....

Benutzeravatar
udo1toni
Beiträge: 2589
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni »

Gut, brechen wir es weiter runter (der Fehler ist ja nun eingegrenzt auf die Variablenzuweisung):

Code: Alles auswählen

rule "Update verbleibende Sendezeit"
when
    Item VU_Sendung_Verbleibend changed
then
    logInfo("sendezeit","verbleibend: {}",VU_Sendung_Verbleibend.state)
    val Number nLaenge = Int::parseInt(VU_Sendung_Verbleibend.state.toString)
    logInfo("sendezeit","als Integer: {}",nLaenge)
    var DateTime dtTime = new DateTime(nLaenge * 1000)
    logInfo("sendezeit","dtTime: {}",dtDime)
    VU_Sendung_Verbleibend_Upd.postUpdate(new DateTimeType(dtTime))
end

wesseli
Beiträge: 7
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli »

Ich habe es geschafft ...

Code: Alles auswählen

rule "Update Sendungsdauer"
when
    Item VU_Sendung_Dauer changed
then
    var DateTime dtTime = new DateTime((VU_Sendung_Dauer.state as Number).longValue * 1000)
    VU_Sendung_Dauer_Upd.postUpdate(new DateTimeType(dtTime.toString))
end
@udo1toni
Danke für die Hilfe und Hinweise für die Fehlereingrenzung

Benutzeravatar
udo1toni
Beiträge: 2589
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni »

Prima :)

Antworten