Umrechnung von Unixzeit

Moderatoren: seppy, udo1toni

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

Re: Umrechnung von Unixzeit

Beitrag von wesseli » 30. Sep 2019 18:09

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: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni » 30. Sep 2019 21:59

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: 6
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli » 3. Okt 2019 16:53

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: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni » 3. Okt 2019 19:12

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: 6
Registriert: 25. Sep 2019 18:40

Re: Umrechnung von Unixzeit

Beitrag von wesseli » 3. Okt 2019 20:54

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: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Umrechnung von Unixzeit

Beitrag von udo1toni » 4. Okt 2019 13:39

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste