Eine erste funktionierende (getestet) Variante:
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³"]
}
}
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

)
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
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