Seite 2 von 2

Re: Umrechnung von Unixzeit

Verfasst: 30. Sep 2019 18:09
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

Re: Umrechnung von Unixzeit

Verfasst: 30. Sep 2019 21:59
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.

Re: Umrechnung von Unixzeit

Verfasst: 3. Okt 2019 16:53
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

Re: Umrechnung von Unixzeit

Verfasst: 3. Okt 2019 19:12
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...)

Re: Umrechnung von Unixzeit

Verfasst: 3. Okt 2019 20:54
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.....

Re: Umrechnung von Unixzeit

Verfasst: 4. Okt 2019 13:39
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

Re: Umrechnung von Unixzeit

Verfasst: 16. Okt 2019 19:28
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

Re: Umrechnung von Unixzeit

Verfasst: 16. Okt 2019 23:54
von udo1toni
Prima :)