Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4 - JS Transformation

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4 - JS Transformation

Beitrag von freeks »

Hallo,

ich nutze OH mittlerweile seit ca. 3 Jahren. Bisher habe ich in den unterschiedlichen Foren immer eine Lösung und Skript Beispiele für meine Vorhaben gefunden. Jetzt stoße ich leider an meine Grenzen. Je mehr ich lese, desto weniger weiss ich eigentlich, wie dies umzusetzen ist in OH4.

Auf meiner eigentlichen LXC Maschine läuft aktuell OH 3.4 und Java 11. Hier gibt es aktuell keine Probleme. Die Things verbinde ich über das UI und alles andere realisiere ich über Skript Dateien (items, rules, sitemap, transform).

Als Vorbereitung auf das Update habe ich die "units" für die Items ergänzt.
Auf einer LXC Testmaschine habe ich das Update für Openhab 4 inkl. Java 17 und JS Scripting aufgespielt. Mein aktuelles Hauptproblem ist die Verbrauchsberechnung (Strom - Shelly3EM) pro Tag, Woche, Monat und Jahr. Diese funktioniert nicht mehr. Wenn ich es richtig verstehe, dann hat sich die Abfrage der Items hierfür geändert und vermutlich tragen die Einheiten der Items ebenfalls dazu bei. Ist nur eine Vermutung! Das Skript hierfür habe ich aus einem der Foren (vielleicht dieses hier) und es hat gut funktioniert, bis zum Update.

Code: Alles auswählen

//Verbrauchergruppen
Group:Number:SUM  Verbrauch_gesamt                  "Stromverbrauch gesamt [%.2f kWh]"    <energy>

//smartMeter
Number:Energy     Shelly3EMDeviceAccumulatedWTotal  "Energy consumption total [%.1f kWh]" <energy> (Verbrauch_gesamt) {channel="shelly:shellyem3:Shelly3EM:device#accumulatedWTotal", unit="kWh"}

//Berechnungen Verbrauch
Number Verbrauch_gesamt_Tag                          "Today [%.1f kWh]"                   <energy>
Number Verbrauch_gesamt_gestern                      "Yesterday [%.1f kWh]"               <energy>   
Number Verbrauch_gesamt_Woche                        "Week [%.1f kWh]"                    <energy>
Number Verbrauch_letzte_Woche                        "Last week [%.1f kWh]"               <energy>   
Number Verbrauch_gesamt_Monat                        "Month [%.1f kWh]"                   <energy>
Number Verbrauch_letzten_Monat                       "Last month [%.1f kWh]"              <energy>   
Number Verbrauch_gesamt_Jahr                         "Year [%.1f kWh]"                    <energy>

Code: Alles auswählen

rule "Verbrauchsberechnungen Zeitraeume"
    when
        Item Verbrauch_gesamt changed
    then
        val  ZonedDateTime   zdt = ZonedDateTime.now()
        var  ZonedDateTime   start_of_day = zdt.toLocalDate().atStartOfDay(zdt.getZone())
        var  ZonedDateTime   start_of_week = zdt.with(DayOfWeek.MONDAY).toLocalDate().atStartOfDay(zdt.getZone())
        var  ZonedDateTime   start_of_month = zdt.withDayOfMonth(1).toLocalDate().atStartOfDay(zdt.getZone())
        var  ZonedDateTime   start_of_year = zdt.withDayOfYear(1).toLocalDate().atStartOfDay(zdt.getZone())
        var  heute = Verbrauch_gesamt.deltaSince(start_of_day) as Number
        var  woche = Verbrauch_gesamt.deltaSince(start_of_week) as Number
        var  monat = Verbrauch_gesamt.deltaSince(start_of_month) as Number
        var  jahr = Verbrauch_gesamt.deltaSince(start_of_year) as Number
            Verbrauch_gesamt_Tag.postUpdate(heute)
            Verbrauch_gesamt_Woche.postUpdate(woche)
            Verbrauch_gesamt_Monat.postUpdate(monat)
            Verbrauch_gesamt_Jahr.postUpdate(jahr)
end 
Lässt sich diese rule auf OH4 anpassen? Vielleicht hat schon jemand ähnliches realisiert mit OH4.

Danke für eventuelle Vorschläge!!!
Zuletzt geändert von freeks am 11. Sep 2023 16:44, insgesamt 2-mal geändert.
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

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

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von udo1toni »

Handelt es sich um UoM Items (Units of Measurement -> es wird im Status eine Einheit angezeigt, auch im events.log)? Sind die Units überall korrekt gesetzt? (je nach Datenquelle liefert der Channel direkt eine Unit, oder man muss diese manuell hinzufügen, z.B. in mqtt und http. Die Einheit muss auch im Item passend gesetzt werden (dieser Parameter bestimmt, wie der Wert persistiert wird), außerdem muss die passende Unit auch noch in der state Description eingetragen werden. Der Number-Untertyp muss zur Einheit passen (z.B. Number:Energy für die umgesetzte Energie, Einheit ist dann z.B. Kilowattstunden , Wattsekunden, Joule, Kalorien usw.)

Bist Du sicher, dass die Persistence auc hgültige Werte für den gesamten Zeitraum enthält (die Daten müssen mindestens bis zum Jahresbeginn zurückreichen, damit die Rule vollständig ausgeführt wird, ansonsten bricht sie spätestens bei der letzten Variablendefinition ab (NullPointer Exception... schau deswegen mal ins Log von openHAB)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von freeks »

Ich habe den ersten Beitrag um die Definition der Items erweitert.

Der Shelly3EM ist über das shelly binding integriert. Das Item für den Verbrauch des shelly sollte ein UoM Item sein. Im events.log wird die Einheit mit kWh korrekt angezeigt. Bei "Verbrauch_gesamt" handelt es sich um ein Group Item, welches erstmal keine Einheit hat. War eigentlich für die Ermittlung der Summe mehrerer Items gedacht, da ich anfangs dachte die Summe für die drei Phasen bilden zu müssen.

Code: Alles auswählen

2023-09-07 07:06:14.637 [INFO ] [hab.event.GroupItemStateChangedEvent] - Item 'Verbrauch_gesamt' changed from 3650.098 to 3650.102 through Shelly3EMDeviceAccumulatedWTotal
2023-09-07 07:06:14.620 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shelly3EMDeviceAccumulatedWTotal' changed from 3650.098 kWh to 3650.102 kWh
Im openhab.log konnte ich keine Hinweise auf einen Eintrag hinsichtlich "NullPointer Exception" finden.

Ich hab den Stromverbrauch als Balken-Diagramme abgebildet.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

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

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von udo1toni »

Ja, ich bin mir nicht sicher, wie sich das Group Item hier verhält.
Wenn es nicht unbedingt notwendig ist, möchte ich empfehlen, es wegzulassen und lieber den "echten" Wert des Items zu nutzen.

Ich habe gerade etwas rumgespielt und das für meinen Stromzähler als Anzeige realisiert (bisher nur für den aktuellen Tagesverbrauch), ich bin folgendermaßen vorgegangen:
Items:

Code: Alles auswählen

Number:Energy VZ181 "1.8.1" (gStrom) ["Measurement","Energy"] {channel="mqtt:topic:mosquitto:vz:ch3", unit="kWh", stateDescription=""[pattern="%.1f kWh"]} // Bezug
Number:Energy VZ181_Day "1.8.1 heute" {unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Rule:

Code: Alles auswählen

rule "Stromzähler changed"
when
    Item VZ181 changed 
then
    val sumDayIn  = VZ181.deltaSince(now.with(LocalTime.MIDNIGHT))
    logInfo("counter","sumDayIn: {}",sumDayIn)
    VZ181_Day.postUpdate(sumDayIn)
end
Und es landet das korrekte Delta in VZ181_Day, mitsamt korrekter Einheit.
Der Witz, wenn man es so definiert: Z.B. bei der Jahresstrommenge möchte man das evtl. als MWh anzeigen lassen, dann ändert man einfach das Pattern (nicht die unit!) des Items ab.
Die Log-Zeile habe ich lediglich zum Debuggen eingebaut, hier sehe ich bei meinem Log, dass die Einheit nicht in der lokalen Konstanten steht, dennoch wird der Wert korrekt übernommen (dafür ist dann aber zwingend notwendig, dass die units der Items identisch gesetzt sind).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von freeks »

Das werde ich mal testen!!!
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von freeks »

Hallo Udo,
es hat etwas gedauert, da ich aktuell nicht nur Openhab sondern auch Proxmox updaten musste und mit Openhab von einer älteren Ubuntu LXC auf das aktuelle Debian LXC umgezogen bin.

Ich habe mal deinen Code ausprobiert. Ich glaube da fehlte noch ein "as Number", kann das sein? Ich hab sonst im log (failed: The argument 'state' must not be null) einen Error gehabt.

rule:

Code: Alles auswählen

rule "Stromzähler changed"
when
    Item VZ181 changed 
then
    val sumDayIn  = VZ181.deltaSince(now.with(LocalTime.MIDNIGHT)) as Number
    logInfo("counter","sumDayIn: {}",sumDayIn)
    VZ181_Day.postUpdate(sumDayIn)
end
VZ181_Day wird vermutlich erst ab Mitternacht den ersten Wert ausgeben.

Das Problem mir meiner rule hatte ich vor meinem Umzug auf das aktuelle Debian. Was soll ich sagen, die gleiche rule (ohne etwas angepasst zu haben) läuft jetzt scheinbar auch unter OH4. Was wäre der Vorteil, wenn ich alles analog zu deinem Vorschlag anpassen würde? Könntest du mir dann die komplette rule für Tag, Woche, Monat und Jahr abbilden?

Nur in der Darstellung als Balkendiagramm ist mir ein Unterschied von OH3.4 zu OH4 aufgefallen. Der Wert für die erste Stunde nach Mitternacht war vorher 0 und entspricht nun dem negativen Verbrauch des Vortages. Alle anderen Werte über den Tag sind gleich. Der gesamte Tages- und Monatsverbrauch ist auch gleich. Ich denke/hoffe es ist ein reines Darstellungsproblem in der Erstellung des Charts über die UI.
Hourly Energy Consumption.png
Hourly Energy ConsumptionOH4.png
Ich verwende die gleich Rule für die Berechnung meiner Wallbox mit dem Unterschied, dass ich die Werte über das Modbus Binding abfrage. Hierfür habe ich jedoch einige JS Transformationen über die UI des Items z.B. mit JS(divide10.js) erstellt. Da die Wallbox die Werte für low und high bytes ausgibt, müssen diese umgerechnet (JS Transformation) und anschließend addiert (groupItem:SUM) werden. Hat auch funktioniert. Bei OH4 wurde die JS Transformation meines Wissens entfernt. Wie kann ich die Transformation nun durchführen, oder sollte die Umrechnung besser über eine rule gelöst werden?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

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

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von udo1toni »

freeks hat geschrieben: 8. Sep 2023 16:28Ich glaube da fehlte noch ein "as Number", kann das sein?
Bei mir funktioniert es ohne. :)
freeks hat geschrieben: 8. Sep 2023 16:28VZ181_Day wird vermutlich erst ab Mitternacht den ersten Wert ausgeben.
Du musst die Itemnamen natürlich auf Deine Items ändern. Mein Item VZ181_Day liefert direkt die aktuelle Tagessumme, sobald sich der Zählerstand geändert hat.
Die einzige Voraussetzung: Es gibt einen Messwert vor Mitternacht, der um Mitternacht noch gültig ist, so dass .deltaSince() zwei gültige Messwerte hat, die voneinander subtrahiert werden können.
freeks hat geschrieben: 8. Sep 2023 16:28Könntest du mir dann die komplette rule für Tag, Woche, Monat und Jahr abbilden?
Meine Rule ist ja nicht so viel anders als Deine. Die Typisierung ist meist unnötig, solange sich der Typ aus dem zugewiesenen Wert ergibt.
freeks hat geschrieben: 8. Sep 2023 16:28Bei OH4 wurde die JS Transformation meines Wissens entfernt.
Jain.
Korrekt: Es gibt keinen separat zu installierenden JS Transformation Service.
Es gibt aber auch die JavaScript Scripting Engine, die die Aufgabe der Transformation mit übernimmt.
Der Witz dabei: Es gibt auch noch andere Scripting Engines für openHAB.
Bisher konnte man lediglich mit JavaScript Transformations scripten, unter OH4 kann man mit jeder installierten Scripting Engine Transformations schreiben. Deshalb gibt es keine separate JS Transformation mehr. :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von freeks »

Du musst die Itemnamen natürlich auf Deine Items ändern. Mein Item VZ181_Day liefert direkt die aktuelle Tagessumme, sobald sich der Zählerstand geändert hat.
Die einzige Voraussetzung: Es gibt einen Messwert vor Mitternacht, der um Mitternacht noch gültig ist, so dass .deltaSince() zwei gültige Messwerte hat, die voneinander subtrahiert werden können.
das habe ich gemacht und dem Item VZ181_Day (für mein Test Item natürlich] den Wert 1 zugewiesen. Der Tagesverbrauch zählt aber tatsächlich erst ab Mitternacht bei mir, irgendwas habe ich dann doch nicht ganz richtig gemacht. Aber deine Rule funktioniert natürlich!!!
freeks hat geschrieben: ↑Gestern 16:28
Bei OH4 wurde die JS Transformation meines Wissens entfernt.
Jain.
Korrekt: Es gibt keinen separat zu installierenden JS Transformation Service.
Es gibt aber auch die JavaScript Scripting Engine, die die Aufgabe der Transformation mit übernimmt.
Der Witz dabei: Es gibt auch noch andere Scripting Engines für openHAB.
Bisher konnte man lediglich mit JavaScript Transformations scripten, unter OH4 kann man mit jeder installierten Scripting Engine Transformations schreiben. Deshalb gibt es keine separate JS Transformation mehr. :)
Das JavaScript Scripting unter OH4 habe ich natürlich installiert. Habe aber an den Transformationen an sich (z.B. JS(divide10.js)) nichts geändert.
Das Lesen und Schreiben der Werte über das ModbusBinding scheint weiterhin mit den transformierten Werten zu funktionieren. Ich bekomme lediglich einen Hinweis im Log, aber nur einmal nach dem Start von OH4.

Code: Alles auswählen

2023-09-09 08:05:45.114 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.146 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.192 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.249 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.273 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.295 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.318 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.450 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 08:05:45.493 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
JS.JPG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

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

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von udo1toni »

Eventuell ist die Schreibweise verkehrt. Leider finde ich in der Doku kein Beispiel für eine Transformation im Channel. Du könntest aber die Transformation auch im Link zwischen Channel und Item vornehmen, dort muss der verwendete Service per Klick ausgewählt werden...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

freeks
Beiträge: 8
Registriert: 6. Sep 2023 20:24
Answers: 0

Re: Verbrauch Tag, Woche, Monat, Jahr nach Update auf Openhab 4

Beitrag von freeks »

ja, vielleicht ist das so. Bei der Gelegenheit habe ich jetzt die Transformationen in die Konfigurationsdatei der Items verschoben. Habe ich schon öfters versucht, jedoch bisher ohne Erfolg.

Code: Alles auswählen

Number ModbusWallboxDataID2A016Number "Energy since PowerOn: LowByte [%.0f kWh]"   {channel="modbus:data:1795f2b182:772cc87a0e:number" [profile="transform:JS", toItemScript="divide1000.js"], unit="kWh"}
So funktioniert es jetzt. Vielleicht ist das für den einen oder anderen auch interessant.
In dem Zusammenhang bekomme ich weiterhin eine Meldung hinsichtlich JS. Ich weiß auch nicht, was ich ändern kann/soll. Es funktioniert aber und mir werden die transformierten Werte in dem Item richtig dargestellt, so dass die Rule zur Verbrauchsberechnung die richtigen Werte verarbeiten kann.

Vielleicht nicht ganz zufriedenstellend, aber es funktioniert!

Code: Alles auswählen

2023-09-09 17:46:09.256 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 17:46:09.282 [WARN ] [s.internal.SingleValueTransformation] - couldn't transform response because transformationService of type 'JS' is unavailable
2023-09-09 17:46:09.318 [WARN ] [.thing.internal.CommunicationManager] - No ProfileFactory found which supports profile 'transform:JS' for link 'ModbusWallboxDataID2A018Number -> modbus:data:1795f2b182:997484055e:number'
openHAB4.0.1 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet

Antworten