[gelöst] Differenz zwischen zwei Daten in Tagen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

[gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammen,
ich quale mich seit Tagen mit einem - bestimmt banalen - Problem.
Ich habe - gefühlt - auch schon alle Ansätze aus allen Foren dieser Welt versucht. Das Thema ist ja alles andere als neu aber bei funktioniert es irgenwie nicht.
Bei mir läuft openHAB 2.5.12.
Ich habe mehrere Tasmota POW im einsatz die den Stromverbrauch des angeschlossenen Geräte messen und aufzeichenen.
Nun möchte ich, dass mir die Dauer der Messung in Tagen angezeigt wird.
Dazu gibt Tasmota einen MQTT-String aus:

Code: Alles auswählen

2022-04-07T18:22:28
Um ihn "schöner" aussehen zu lassen wird er für die Ausgabe in openHAB wie folgt verarbeitet:

Code: Alles auswählen

rule "Beginn der Messung Tasmota 042"
    when
        Time cron "*/30 * * * * ?" or	//nur während der Testphase
        Item Tasmota042_Dunstabzug_Messbeginn_RAW received update or
        Item Tasmota042_Dunstabzug_Messbeginn_RAW changed
    then
        val DateTimeType Tasmota042_Dunstabzug_Messbeginn_DateTime = DateTimeType.valueOf(Tasmota042_Dunstabzug_Messbeginn_RAW.state + ".000+0200")                     //umwandeln in DateTime
        Tasmota042_Dunstabzug_Messbeginn.postUpdate(Tasmota042_Dunstabzug_Messbeginn_DateTime.format("%1$tA, %1$td. %1$tB %1$tY, %1$tH:%1$tM Uhr"))                     //lesbares Format für die Anzeige in openHAB
end
Die Ausgabe sieht dann so aus:

Code: Alles auswählen

Donnerstag, 07. April 2022, 18:22 Uhr
Nun möchte ich aber zusätzlich die Differenz zwischen "Jetzt" und dem Messbeginn in Tagen ausgeben.
Alle bisherigen Versuche sind leider ohne Erfolg gewesen.
Keine Ahnung ob ein Import fehlt oder ich einfach die falschen Funktionen ansetzte.
Teilweise versuche ich einfach nur schon mal eine Differenz in Millisekunden zu erhalten.
Dazu habe ich erstmal die Systemzeit in ein DateTime-Item gelegt:

Code: Alles auswählen

//Jetzt minütlich in DateTime SystemZeit_Jetzt speichern
rule "Jetzt als Variable"
    when
        Time cron "0 * * * * ?"
    then
        val DateTimeType DateTime_Jetzt = (new DateTimeType())
        SystemZeit_Jetzt_1Min.postUpdate(DateTime_Jetzt)
end
Ist vielleicht etwas umständlich aber so kann ich prüfen bei welchem der einzelnen Schritte es hakt.
Nun habe ich folgendes getestet:

Code: Alles auswählen

        val Tasmota042_start = Tasmota042_Dunstabzug_Messbeginn_DateTime.zonedDateTime
        val Tasmota042_end = SystemZeit_Jetzt_1Min.previousState(true,"influxdb").timestamp
        Tasmota042_Dunstabzug_Messdauer.postUpdate(Duration.between(Tasmota042_start, Tasmota042_end).toMillis())

Code: Alles auswählen

        val date_1 = Tasmota042_Dunstabzug_Messbeginn_DateTime.zonedDateTime
        val date_2 = SystemZeit_Jetzt_1Min.zonedDateTime
        //val seconds_between = date_1.until(date_2, ChronoUnit.SECONDS)
        //val minutes_between = date_1.until(date_2, ChronoUnit.MINUTES)
        val days_between = date_1.until(date_2, ChronoUnit.DAYS)
        //val weeks_between = date_1.until(date_2, ChronoUnit.WEEKS)
        //val months_between = date_1.until(date_2, ChronoUnit.MONTHS)
        //val years_between = date_1.until(date_2, ChronoUnit.MONTHS)
        Tasmota042_Dunstabzug_Messdauer.postUpdate(days_between)

Code: Alles auswählen

        val date_1 = Tasmota042_Dunstabzug_Messbeginn_DateTime.getStateAs(DateTimeType).zonedDateTime
        val date_2 = SystemZeit_Jetzt_1Min.getStateAs(DateTimeType).zonedDateTime
        //val seconds_between = date_1.until(date_2, ChronoUnit.SECONDS)
        //val minutes_between = date_1.until(date_2, ChronoUnit.MINUTES)
        val days_between = date_1.until(date_2, ChronoUnit.DAYS)
        //val weeks_between = date_1.until(date_2, ChronoUnit.WEEKS)
        //val months_between = date_1.until(date_2, ChronoUnit.MONTHS)
        //val years_between = date_1.until(date_2, ChronoUnit.MONTHS)
        Tasmota042_Dunstabzug_Messdauer.postUpdate(days_between)
mit import java.time.temporal.ChronoUnit...
und:

Code: Alles auswählen

        val Date1 = new DateTime((Tasmota042_Dunstabzug_Messbeginn_DateTime).zonedDateTime.toInstant.toEpochMilli)
        val Date2 = new DateTime((SystemZeit_Jetzt_1Min).zonedDateTime.toInstant.toEpochMilli)
        var double diff = (Date2.millis - Date1.millis)/1000
        Tasmota042_Dunstabzug_Messdauer.postUpdate(diff)
aber nicht funktioniert :cry:

Erkennt jemand meinen Fehler und kann helfen?
Danke und Gruß
Florian
Zuletzt geändert von Florian.Reinartz am 12. Sep 2022 10:16, insgesamt 4-mal geändert.
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Soll er nur volle Tage anzeigen, oder Stunden-, Minuten- und Sekundenanteil als Bruchteil eines Tages?

Grundsätzlich solltest Du vermeiden, mit DateTimeType zu rechnen, das ist einfach nur umständlich.
Rechne stattdessen das Unix Timestamp Äquivalent des Startzeitpunkts aus und ziehe es von now.millis ab.

Code: Alles auswählen

val dtStart  = new DateTime((Tasmota042_Dunstabzug_Messbeginn.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
val Diff     = now.millis - dtStart
val iDays    = (Diff/1000/60/60/24).intValue                              // volle Tage
val iHours   = (Diff/1000/60/60/24).intValue - iDays * 24                 // Reststunden
val iMinutes = (Diff/1000/60/60).intValue - iHours * 60 - iDays * 24 * 60 // RestMinuten
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammen,
hallo udo1toni,

die Rule bleibt in dieser Zeile Hängen:

Code: Alles auswählen

val dtStart  = new DateTime((Tasmota042_Dunstabzug_Messbeginn_DateTime.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)         //String, Inhalt: >>Donnerstag, 07. April 2022, 18:22 Uhr<<
openhab.log:

Code: Alles auswählen

2022-04-11 19:22:02.002 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'Tasmota_Time.rules'
2022-04-11 19:22:30.025 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Beginn der Messung Tasmota 042': Could not cast Donnerstag, 07. April 2022, 18:22 Uhr to org.eclipse.smarthome.core.library.types.DateTimeType; line 18, column 38, length 54
Ich habe dann folgende Variante versucht:

Code: Alles auswählen

val dtStart  = new DateTime((Tasmota042_Dunstabzug_Messbeginn_RAW.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)          //String, Inhalt: >>2022-04-07T18:22:28<<
openhab.log:

Code: Alles auswählen

2022-04-11 19:23:26.806 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'Tasmota_Time.rules'
2022-04-11 19:23:37.893 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Beginn der Messung Tasmota 042': Could not cast 2022-04-07T18:22:28 to org.eclipse.smarthome.core.library.types.DateTimeType; line 18, column 38, length 58
und nun noch folgende Variante versucht:

Code: Alles auswählen

val dtStart  = new DateTime((Tasmota042_Dunstabzug_Messbeginn_DateTime).zonedDateTime.toInstant.toEpochMilli)          //DateTime, Inhalt: >>2022-04-07T18:22:28.000+0200<<
openhab.log:

Code: Alles auswählen

2022-04-11 19:25:08.161 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Beginn der Messung Tasmota 042': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.LongExtensions.operator_minus(long,byte) on instance: null
Nun weiß ich auch nicht weiter...

:?:
Bin über weitere Tips sehr dankbar.
Danke und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Kann es vielleicht sein, dass Tasmota042_Dunstabzug_Messbeginn ein String Item ist?

WARUM?

Es gibt für Datum und Uhrzeit DateTime Items. Man kann mit Strings nicht rechnen und es ist nicht sinnvoll, Datum und Uhrzeit als String zu speichern.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Item                                                                      |     Type       |      Inhalt
------------------------------------------------------------------------------------------------------------------------------------
Tasmota042_Dunstabzug_Messbeginn_RAW             | String        | 2022-04-07T18:22:28
Tasmota042_Dunstabzug_Messbeginn_DateTime      | DateTime  | 2022-04-07T18:22:28.000+0200
Tasmota042_Dunstabzug_Messbeginn                      | String       | Donnerstag, 07. April 2022, 18:22 Uhr


Tasmota042_Dunstabzug_Messbeginn_DateTime habe ich selber "gebastelt" durch:

Code: Alles auswählen

val DateTimeType Tasmota042_Dunstabzug_Messbeginn_DateTime = DateTimeType.valueOf(Tasmota042_Dunstabzug_Messbeginn_RAW.state + ".000+0200")
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Na, dann musst Du halt Tasmota042_Dunstabzug_Messbeginn_DateTime als Input für DateTime() verwenden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Danke für die Frage "Warum ist Tasmota042_Dunstabzug_Messbeginn kein DateTime Item"
Ich hatte das Item als Sting über MQTT eingelesen.
Nun wird es als DateTime eingelesen und das Item Tasmota042_Dunstabzug_Messbeginn ist direkt aus MQTT ein DateTime Item.

So???

Code: Alles auswählen

val dtStart  = new DateTime((Tasmota042_Dunstabzug_Messbeginn).zonedDateTime.toInstant.toEpochMilli)
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Genau.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

jetzt hängt er an dieser Stelle:

Code: Alles auswählen

val Diff     = now.millis - dtStart
openhab.log:

Code: Alles auswählen

2022-04-12 01:18:28.017 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'Tasmota_Time.rules'
2022-04-12 01:18:31.394 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Beginn der Messung Tasmota 042': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.LongExtensions.operator_minus(long,byte) on instance: null
2022-04-12 01:18:45.696 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Beginn der Messung Tasmota 042': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.LongExtensions.operator_minus(long,byte) on instance: null
Muss ich noch irgendwelche Bibliotheken importieren?
Danke und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Ah, sorry... dtStart.millis muss da natürlich stehen... dtStart ist ja eine DateTime Konstante...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten