[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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

woher weiß man sowas??? :shock: :shock: :shock:
Was macht man beruflich um so fit zu sein???

Jetzt hängt die Rules hier:

Code: Alles auswählen

        if (new Interval(new DateTime(Buderus_hm1_Start_DT.state.toString),new DateTime(Buderus_hm1_Stop_DT.state.toString)).contains(now))
            {
                sendCommand(Buderus_hm1_Urlaub_aktiv,ON)
                sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist,2.0)
            }
        else
            {
                sendCommand(Buderus_hm1_Urlaub_aktiv,OFF)
            }
Interval und natärlich bei new DateTime...
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Das brauchst Du gar nicht... Es ist ohnehin keine gute Idee, aus einem Item, welches gerade erst geschrieben wurde den Status zu lesen. Es ist durchaus möglich, dass zu dem Zeitpunkt noch der alte Status vorliegt.
Nimm lieber die zuvor definierten lokalen Konstanten.
Du kannst entweder direkt den String nach JavaTime umwandeln oder eben das DateTimeType Objekt.
Gegeben die Strings von oben:

Code: Alles auswählen

val hm1TimeSplitStart = Buderus_hm1_StartStop.state.toString.split('/').get(0)+"T00:00:00.000Z"
val hm1TimeSplitStop  = Buderus_hm1_StartStop.state.toString.split('/').get(1)+"T00:00:00.000Z"
val hm1ZdtStart       = ZonedDateTime.parse(hm1TimeSplitStart).withZoneSameInstant(ZoneId.systemDefault())
val hm1ZdtStop        = ZonedDateTime.parse(hm1TimeSplitStop ).withZoneSameInstant(ZoneId.systemDefault())
Ob now() zwischen den beiden Zeitpunkten liegt, findest Du einfach so raus:

Code: Alles auswählen

if(hm1ZdtStart <= now && now <= hm1ZdtStop)
Speziell die Umrechnung der verschiedenen Datums-Datentypen ist sehr gut im englischen Forum erklärt: https://community.openhab.org/t/datetim ... 3-x/107197
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: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammen,

war ein wenig von diesem Thema abgekommen und konnte mich erst heute wieder dieses Problems annehmen.

@ udo1toni
hat funktioniert.
Danke für die Unterstützung.

Danke und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammen,

ich habe noch mal ein Problem bezüglich JavaTime.
Ich habe vergessen meinen Stromzählerstand am 30.11.2022 um 24 Uhr abzulesen.
Da der Zählerstand in rrd4j gesichert wird wollte ich nun eine Rule schreiben die mir in ein Item schreibt wieviele KW ich vom 01.12.2022T00:00:00 bis jetzt verbraucht habe.
Leider reichen auch hierfür meine Kenntnisse nicht aus.
Ein Beispiel meiner versuche...
Rul-Versuch 17 von 30

Code: Alles auswählen

rule "Berechnung kWh vom 01.01.2022 bis heute"
    when
        Time cron "*/30 * * * * ?"
    then
        var DateTimeType MyDateTimeTypeFromString = new DateTimeType("2022-12-01T00:00:00+00:00")
        val Number n22_11_30Delta = Zaehlerstand_Strom_1_0_1_8_0.deltaSince(MyDateTimeTypeFromString) as Number
        Zaehlerstnad_Strom_2022_11_30.postUpdate(n22_11_30Delta / 1000.0 * 100.0)
end
Oder gibt es eine Möglichkeit wie mir rrd4j den Wert aus der Nacht vom 30.11.2022 auf den 01.12.2022 raus schmeißt?

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

Re: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Lass Dir den historicState ausgeben:

Code: Alles auswählen

rule "Berechnung Zählerstand 30.11.2022"
 when
    Item <irgendeinItem> changed
 then
    val theDate = LocalDateTime.of(2022,12,1,0,0) // 1.12.22, 00:00:00 Uhr ist das gleiche wie 30.11.2022, 24:00:00 Uhr
    val nZstand = Zaehlerstand_Strom_1_0_1_8_0.historicState(theDate).state as Number
    Zaehlerstnad_Strom_2022_11_30.postUpdate(nZstand)
end
Ungetestet, ich bin mir nicht sicher, ob LocalDateTime funktioniert. Das ist aber nicht die einzige Möglichkeit :)

Falls rrd4j nicht Deine Default Persistence ist, musst Du es mit angeben:

Code: Alles auswählen

.historicState(theDate,"rrd4j").state 
Wichtig: historicState liefert nicht den Status, sondern ein komplettes Status-Objekt mit Zeitstempel, weshalb man das .state noch anhängen muss.

Es gibt auch ein Tool, um rrd4j Dateien auszulesen und sogar zu bearbeiten https://community.openhab.org/t/rrd4j-a ... les/4655/3 hat hier nähere Informationen, allerdings musst Du aufpassen, Du darfst meines Wissens nicht die aktuelle Version nehmen, sondern musst eine bestimmte Version nutzen, damit es funktioniert. Ist aber in dem Thread beschrieben...
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: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammen,
hallo Udo,

leider funktioniert es nicht und ich komme nicht auf den Fehler...

Auszug aus openbhab.log:
2022-12-17 18:32:30.262 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'medienversorgung-14' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.persistence.extensions.PersistenceExtensions.historicState(org.openhab.core.items.Item,java.time.ZonedDateTime,java.lang.String) on instance: null in medienversorgung

medieversorgung ist der Name der rule...
Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Ja, ich hab mir schon fast gedacht, dass LocalDateTime hier falsch ist... :)

Probiere es bitte mal so:

Code: Alles auswählen

rule "Berechnung Zählerstand 30.11.2022"
 when
    Item <irgendeinItem> changed
 then
    val theDate = ZonedDateTime.of(2022,12,1,0,0,0,0,"Europe/Berlin") 
    val nZstand = Zaehlerstand_Strom_1_0_1_8_0.historicState(theDate).state as Number
    Zaehlerstnad_Strom_2022_11_30.postUpdate(nZstand)
end
ZonedDateTime.of erwartet zusätzlich zu Jahr, Monat, Tag, Stunde und Minute zusätzlich noch Sekunde und Nanosekunde sowie die Zone. "Z+1" sollte ebenfalls als Zone funktionieren.
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: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Zusammne,
hallo Udo,

danke für die Hilfestellung.
Mir ist grade aufgefallen, dass ich die Daten nicht mit rrd4j sicher sonder über InfluxDB. Allerdings ist rrd4j bei mir Systemstandard.
Ist die Rule dann so korrekt?
Muss ich klein-GROß-Schreibung beachten?

Code: Alles auswählen

rule "Berechnung Zählerstand 30.11.2022"
 when
    Time cron "*/30 * * * * ?"
 then
    val theDate = ZonedDateTime.of(2022,12,1,0,0,0,0,"Europe/Berlin") 
    val nZstand = Zaehlerstand_Strom_1_0_1_8_0.historicState(theDate,"InfluxDB").state  as Number
    Zaehlerstnad_Strom_2022_11_30.postUpdate(nZstand)
end
Ich habe InfluxDB 1 eingestellt und das iTem in einer Gruppe gesichert.

Item:

Code: Alles auswählen

Number  Zaehlerstand_Strom_1_0_1_8_0    "Zählerstand Strom 1_0_1_8_0 [%.1f kW]"     <stromzahl>   (gInfluxdb)       {channel="smartmeter:meter:Hauptstromzaehler_Schmiede:1-0_1-8-0"}
Persistence:

Code: Alles auswählen

Strategies
{
    everyMinute     :   "0 * * * * ?"
    everyHour       :   "0 0 * * * ?"
    everyDay        :   "0 0 0 * * ?"
    default = everyChange
}

Items
{
    gInfluxdb*      : strategy = everyMinute, restoreOnStartup
}
Müsste eigendlich passen...
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

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

Re: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von udo1toni »

Mein Tipp wäre, dass es in diesem Fall "influxdb" heißen muss, so wie auch die persist-Datei genannt wird.

Jepp, in der Doku: Example
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: [gelöst] Differenz zwischen zwei Daten in Tagen

Beitrag von Florian.Reinartz »

Moin Udo,

habe es leider nicht hin bekommen ABER…
Ich habe festgestellt, wenn ich in der UI auf das entsprechende Item gehe kann ich über den Button >analyze< den Datenverlauf ansehen.
Mit dem Cursor kann ich das entsprechende Datum mit Uhrzeit anfahren und mir wird der Wert zu diesem Zeitpunkt angezeigt!
Habe ihn jetzt per rule in das entsprechende Item geschrieben…

Danke für die Unterstützung.

Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Antworten