wie Multipliziere ich einen angezeihten Wert

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

rebell21
Beiträge: 125
Registriert: 23. Aug 2024 09:34
Answers: 0

wie Multipliziere ich einen angezeihten Wert

Beitrag von rebell21 »

Ich möchte den Gasverbrauch meiner Heizung nicht in m³ sondern in kWh anzeigen. zwischen m³ und kWh ist grob der Faktor 10. Ich habe gefunden, wie ich die Einheit kWh statt m³ anzeige.. Aber ich habe nicht gefunden wie ich den Wert des Sensors mit 10 multipliziere um ihn anzuzeigen. Wo sollte ich das am besten machen?

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von nw378 »

Du könntest hierzu ein zweites kWh-Item angelegen, und bei Änderung am Zähler (in m³) dieses per Rule entsprechend umrechnen:

Code: Alles auswählen

rule "Gaszähler"
when 
    Item Gaszaehlerstand_m3 changed  
then 
    val Number gas_faktor = 9.672 // hier deinen Faktor anpassen
    var x = (Gaszaehlerstand_m3.state as Number) * gas_faktor
    Gaszaehler_kWh.postUpdate( x |kWh) // Zusatz |kWh, wenn Item Number:Energy angelegt ist
end 

Wenn Du den genauen Umrechnungsfaktor nutzen willst, hilft ein Blick in die Jahresabrechnung deines Versorgers. Dort steht inetwa sowas:
Zustandszahl* *Brennwert kWh/m? **
x 0,9458 x 10,134

** Zur exakten Abrechnung des Erdgasverbrauches wird die gemessene Menge nach einem vorgeschriebenen Verfahren mittels eines
Faktors von Kubikmeter (m?) in Kilowattstunden (kWh) umgerechnet. Dieser Faktor setzt sich aus den Bestandteilen "Zustandszahl"
und "Brennwert" (kWh/m?) zusammen.
Die Zustandszahl errechnet sich aus folgenden Faktoren:
Teff = die zugrunde gelegte Gastemperatur, Peff = der Überdruck im Gaszähler gegenüber dem Luftdruck, Pamb = der Mittelwert vom
atmosphärischen Druck in der Höhenzone
(DVGW-Arbeitsblatt G 685 "Gasabrechnung", Ausgabe 01/2009).
Zuletzt geändert von nw378 am 9. Feb 2025 13:40, insgesamt 1-mal geändert.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von Harka »

Moin,
alternativ ginge auch die Umrechnung in der Ausgabe via Page oder gleich am Eingang mit einer Transformation.
Beispiel für Page (hier mit 10)

Code: Alles auswählen

=(#'Verbrauch-Item-m3' * 10) + ' kWh'
Für die Transformation mit DSL passt imho dies sehr gut viewtopic.php?p=64161#p64161

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

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von udo1toni »

Also, "korrekt" wäre es, den Wert als QuantityType m³ in ein Transformation Script zu übergeben, welches dann mit 10 * kWh / m³ multipliziert. Dann käme als Ausgabe automatisch kWh mit dem korrekten Wert heraus.
Ja, openHAB UoM beherrscht das :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 125
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von rebell21 »

Hallo Udo,

kannst Du mir den Weg über das Transformationskript erklären
Wie sähe das Scripts aus ? Wie übergebe ich Input Werte an das Skript ?
Und wo hänge ich den Aufruf des Scriptes ein ?

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

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von udo1toni »

Welche Version von openHAB nutzt Du?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 125
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von rebell21 »

openhab 4.3.2

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

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von udo1toni »

Eine erste funktionierende (getestet) Variante:
Ein Channel, der liefert (angenommener Energiegehalt = 11,524 kWh/m³):

Code: Alles auswählen

Bridge mqtt:broker:mosquitto "Mosquitto" [
    host="192.168.178.66",
    clientID="openHAB4test",
] {
    Thing topic gas "Gaszähler" {
        Type number : ch1 "Zähler" [stateTopic="test/gas/count", unit="m³"]
    }
}
Zwei Items:

Code: Alles auswählen

Number:Volume Gaszaehlerstand "Zähler"  {channel="mqtt:topic:mosquitto:gas:ch1", unit="cm³", stateDescription=""[pattern="%.0f l"]}
Number:Energy GasEnergie      "Energie" {channel="mqtt:topic:mosquitto:gas:ch1"[profile="transform:JS", toItemScript="|(parseFloat(input) * 11.524) + \" kWh\""], unit="Ws", stateDescription=""[pattern="%.5f MWh"]}
Das erste Item zeigt die Gasmenge in Litern (!). Intern speichert es die Gasmenge in cm³ (weil es geht :D )
Das zweite Item verwendet ein JavaScript Script zur Konvertierung. Das Item selbst muss entsprechend vom Typ Number:Energy sein. Das Item speichert den Wert in Ws (weil es geht... :D ) und gibt den Wert in MWh mit fünf Nachkommastellen aus.

Die Konfiguration kann genauso auch über die UI vorgenommen werden, ich finde die "alte" Notation aber immer noch besser lesbar. :)

Im mqtt Channel ist die Unit mit angegeben, openHAB interpretiert den gelieferten Zahlenwert also als Kubikmeter.
Im ersten Item ist die unit mit cm³ angegeben, entsprechend multipliziert openHAB den Wert mit 1000000 (100 cm x 100 cm x 100 cm = 1 m³).
Als Ausgabeformat ist aber das Pattern %.0f l angegeben, der Wert wird hier also durch 1000 geteilt (1 l = 1 dm³ = 10 cm x 10 cm x 10 cm).
Das interessantere zweite Item nutzt das transform:JS Profile. Der Code ist so kompakt, dass man ihn leicht inline angeben kann.
Hier sind zwei Aspekte wichtig:
1. Der Wert wird immer als String übergeben, auf die Schnelle ist das Entfernen der Einheit () über parseFloat() die einfachste Methode. Anschließend kann man mit einer beliebigen Zahl multiplizieren (hier 11.524).
2. Weil wir als Ausgabe die neue Einheit mit übergeben müssen, hängen wir diese als String hinten an. JavaScript kümmert sich selbst um die notwendige Typkonvertierung (Float zu String).
Da das Item nun einen String in der Form "123.456 kWh" empfängt, kann UoM wieder ganz normal arbeiten, also den Wert mit 3600000 multiplizieren, um von kWh auf Ws zu kommen, und für die Ausgabe durch 3600000000 teilen, um auf MWh zu kommen.

Natürlich kannst Du beliebige Einheiten verwenden, solange diese zum gelieferten Wert und dem jeweiligen Itemtyp passen (also z.B. Joule oder Kalorie wäre auch eine gebräuchliche Einheit für die Energie), der unit-Parameter im Channel muss zum gelieferten Wert passen (logisch...) und die unit, in der das Item den Wert intern speichert, darf nur einmal festgelegt werden.
Bzw. es hat Konsequenzen, wenn Du die unit nachträglich anpasst - diese gilt nämlich auch für die Persistence, und da einmal persistierte Werte nicht mehr angefasst werden, die Einheit aber nicht mit persistiert wird, werden alte Werte dann nicht korrekt dargestellt (es sei denn, der Umrechnungsfaktor zwischen alter und neuer Einheit beträgt 1, also z.B. 1 Ws = 1 J, oder 1 dm³ = 1 l).

Die Anzeige (das Pattern) kannst Du nach Belieben anpassen, die Einheit muss nur, wie erwähnt, zum Itemtyp passen.

Leider habe ich es bisher nicht hinbekommen, dass die Unit korrekt im Script verwendet wird, also in der Form

Code: Alles auswählen

ergebnis = input * 11.524 kWh / m³ // input liefert m³, ergebnis liefert kWh
aber angeblich soll das funktionieren. Ich habe nur die entsprechenden Beispiele nicht gefunden, und natürlich funktioniert es NICHT so, wie im Codeblock angegeben...

EDIT:
Aktualisierung des fraglichen Items:

Code: Alles auswählen

Number:Energy GasEnergie      "Energie" {channel="mqtt:topic:mosquitto:gas:ch1"[profile="transform:JS", toItemScript="|String(Quantity(input).multiply(Quantity('11.524 kWh/m³')))"], unit="Ws", stateDescription=""[pattern="%.5f MWh"]}
Das inline JavaScript Script rechnet nun mit QuantityType und multipliziert dabei korrekt die Einheiten aus. :) Danke an @Harka
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von Harka »

[Klugscheißermodus]

Code: Alles auswählen

ergebnis = Quantity(input).multiply(Quantity('11.524 kWh/m³'));
[/Klugscheißermodus]

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

Re: wie Multipliziere ich einen angezeihten Wert

Beitrag von udo1toni »

Leider nein, obwohl das schon sehr vielversprechend aussieht.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten