rule für Berechnung Zeitdifferenz

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

rule für Berechnung Zeitdifferenz

Beitrag von jensilein »

Hallo,
ich möchte mit der folgenden rule die Differenz zwischen zwei Zeitpunkten in Minuten berechnen.

Code: Alles auswählen

rule "Timedifference"
when 
   Time cron 	 "0 0/1 * 1/1 * ? *"  
then	
val oldDate = new DateTime((Weather_LastUpdate.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
val newDate = new DateTime(now())
var double diff = (newDate.millis - oldDate.millis)/60000
TimeDifference.postUpdate(diff)
end
Leider bekomme ich da ständig diese Fehlermeldung. Würde mich sehr über Hilfe bei der Lösungsfindung freuen.

Code: Alles auswählen

2023-06-01 13:18:45.505 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'last_weather_update-1' failed: An error occurred during the script execution: null in last_weather_update
von udo1toni » 1. Jun 2023 15:59
Wie ist Weather_LastUpdate definiert?
Mein Vorschalg wäre folgender:

Code: Alles auswählen

rule "Timedifference"
when
    Time cron "0 * * * * ?" //einmal pro Minute, zur vollen Minute
then
    if(!(Weather_LastUpdate.state instanceof DateTimeType)) {
        logWarn("calcDiff","Weather_LastUpdate.state liefert falschen Datentyp: {}",Weather_LastUpdate.state)
        return;
    }
    val Long    lOld = (Weather_LastUpdate.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
    val Long    lNew = now().toInstant.toEpochMilli
    var Integer diff = ((lNew-lOld)/60000).intValue
    TimeDifference.postUpdate(diff)
end
Du musst nicht umständlich DateTime Objekte erzeugen, Dich interessiert ja nur die Differenz (in vollen Minuten), das ist dann ein Integer Wert - könnte man natürlich auch als Float berechnen, aber Bruchteile von Minuten werden gewöhnlich nicht als Dezimalzahl angegeben. Man könnte stattdessen TimeDifference als String definieren und die Differenz als Text in Minuten und Sekunden ausgeben.
Gehe zur vollständigen Antwort

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

Re: rule für Berechnung Zeitdifferenz

Beitrag von udo1toni »

Wie ist Weather_LastUpdate definiert?
Mein Vorschalg wäre folgender:

Code: Alles auswählen

rule "Timedifference"
when
    Time cron "0 * * * * ?" //einmal pro Minute, zur vollen Minute
then
    if(!(Weather_LastUpdate.state instanceof DateTimeType)) {
        logWarn("calcDiff","Weather_LastUpdate.state liefert falschen Datentyp: {}",Weather_LastUpdate.state)
        return;
    }
    val Long    lOld = (Weather_LastUpdate.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
    val Long    lNew = now().toInstant.toEpochMilli
    var Integer diff = ((lNew-lOld)/60000).intValue
    TimeDifference.postUpdate(diff)
end
Du musst nicht umständlich DateTime Objekte erzeugen, Dich interessiert ja nur die Differenz (in vollen Minuten), das ist dann ein Integer Wert - könnte man natürlich auch als Float berechnen, aber Bruchteile von Minuten werden gewöhnlich nicht als Dezimalzahl angegeben. Man könnte stattdessen TimeDifference als String definieren und die Differenz als Text in Minuten und Sekunden ausgeben.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: rule für Berechnung Zeitdifferenz

Beitrag von jensilein »

Hallo, das item Weather_LastUpdate ist folgendermaßen definiert:

DateTime Weather_LastUpdate "Zeitpunkt letztes Update Wetterdaten" {channel="openweathermap:weather-and-forecast:OWM_Bridge:local:current#time-stamp"}

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: rule für Berechnung Zeitdifferenz

Beitrag von jensilein »

Vielen Dank für die Anregung und Hilfe. Die rule funktioniert aus dem Stand genau so, wie ich es mir gewünscht hatte.

Antworten