wie Multipliziere ich einen angezeihten Wert
-
- Beiträge: 125
- Registriert: 23. Aug 2024 09:34
wie Multipliziere ich einen angezeihten Wert
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?
-
- Beiträge: 295
- Registriert: 22. Sep 2018 10:38
Re: wie Multipliziere ich einen angezeihten Wert
Du könntest hierzu ein zweites kWh-Item angelegen, und bei Änderung am Zähler (in m³) dieses per Rule entsprechend umrechnen:
Wenn Du den genauen Umrechnungsfaktor nutzen willst, hilft ein Blick in die Jahresabrechnung deines Versorgers. Dort steht inetwa sowas:
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
-
- Beiträge: 487
- Registriert: 30. Apr 2021 13:13
Re: wie Multipliziere ich einen angezeihten Wert
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) Für die Transformation mit DSL passt imho dies sehr gut viewtopic.php?p=64161#p64161
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'
- udo1toni
- Beiträge: 15240
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: wie Multipliziere ich einen angezeihten Wert
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
Ja, openHAB UoM beherrscht das

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 125
- Registriert: 23. Aug 2024 09:34
Re: wie Multipliziere ich einen angezeihten Wert
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 ?
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 ?
- udo1toni
- Beiträge: 15240
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: wie Multipliziere ich einen angezeihten Wert
Welche Version von openHAB nutzt Du?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 125
- Registriert: 23. Aug 2024 09:34
Re: wie Multipliziere ich einen angezeihten Wert
openhab 4.3.2
- udo1toni
- Beiträge: 15240
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: wie Multipliziere ich einen angezeihten Wert
Eine erste funktionierende (getestet) Variante:
Ein Channel, der m³ liefert (angenommener Energiegehalt = 11,524 kWh/m³):
Zwei Items:
Das erste Item zeigt die Gasmenge in Litern (!). Intern speichert es die Gasmenge in cm³ (weil es geht
)
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...
) 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 m³ 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 (m³) ü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
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:
Das inline JavaScript Script rechnet nun mit QuantityType und multipliziert dabei korrekt die Einheiten aus.
Danke an @Harka
Ein Channel, der m³ 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³"]
}
}
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 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...

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 m³ 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 (m³) ü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
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"]}

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 487
- Registriert: 30. Apr 2021 13:13
Re: wie Multipliziere ich einen angezeihten Wert
[Klugscheißermodus][/Klugscheißermodus]
Code: Alles auswählen
ergebnis = Quantity(input).multiply(Quantity('11.524 kWh/m³'));
- udo1toni
- Beiträge: 15240
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: wie Multipliziere ich einen angezeihten Wert
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