Seite 1 von 2

Berechnung in einer rule

Verfasst: 8. Nov 2025 14:19
von goerdi
Hi !

Ich möchte einen Wert getilt durch 1000 in eine anndere Variable schreiben.
Ich hab schon verschiedene rules getestet... entweder meckert openhab schon beim anlegen oder es kommt ein Fehler beim ausführen...
Could not cast 751 to void; line 8 (das ist vom letzten Versuch...

Code: Alles auswählen

rule "calc used energy to kWh"

when
    Item opendtu_used_energy changed
then
//      var nkWh = opendtu_used_energy / 1000
      opendtu_used_energy_kwh.postUpdate((opendtu_used_energy.state as number) / (1000) )
end
mit der Variable zwischendrin hab ich es auch schon probiert... ging auch nicht ..
beide Items sind als "number" angelegt....

Gruss Gerd

Re: Berechnung in einer rule

Verfasst: 8. Nov 2025 17:56
von nw378
versuch's mal mit:

Code: Alles auswählen

opendtu_used_energy_kwh.postUpdate((opendtu_used_energy.state as number).floatValue / (1000) )

Re: Berechnung in einer rule

Verfasst: 8. Nov 2025 23:28
von udo1toni
Stopp!

Warum willst Du überhaupt selbst teilen?
Woher bekommt das Item seinen Status (welches Binding...)? Wie ist das Item definiert? Wie ist der Channel definiert?

openHAB beherrscht Units of Measurement. Bei den meisten Bindings ist das inzwischen mit eingebaut, so dass man "nur" Channel und Item korrekt definieren muss, um auch korrekte Messwerte geliefert zu bekommen.
Bei bestimmten Bindings kann es etwas tricky sein, den Wert samt korrekter Einheit zu übergeben, wenn man das aber mal eingerichtet hat, musst Du nur noch angeben, in welcher Einheit Du die Anzeige haben willst.
Hier ist es wohl so, dass Wh im Item landen. Es handelt sich also um ein Number:Energy Item. Wenn Du im Channel konfigurierst, dass der Wert mit Wh als Einheit empfangen wird, reicht es, beim Item als gewünschte Einheit kWh hinzuschreiben und der Wert wird direkt korrekt angezeigt.

Ach so... Per Rule :)

Gegeben, dass Du das Item nicht als Number:Energy Item anlegen kannst, wäre der korrekte Ausdruck:

Code: Alles auswählen

opendtu_used_energy_kwh.postUpdate((opendtu_used_energy.state as Number).floatValue/1000)
Beachte die Groß-/Kleinschreibung, number gibt es nicht, wohl aber Number.

Re: Berechnung in einer rule

Verfasst: 9. Nov 2025 13:36
von goerdi
Hi !

Ich will einen Wert der in kWh ist mit dem Wh Wert verrechnen.... dazu muss ich ja beides auf dem gleichen level haben...
das Mit der Anzeige ist mir schon klar...

Gruss Gerd

Re: Berechnung in einer rule

Verfasst: 9. Nov 2025 16:45
von udo1toni
Nein. :)
Der Punkt mit UoM ist, dass der Wert mit Einheit da steht. Du kannst die beiden Werte ganz einfach miteinander verrechnen.

Allerdings: Du musst openHAB hier einen kleinen Hinweis geben, dass es sich um QuantityType handelt.

Code: Alles auswählen

val mySum = (Item1.state as QuantityType<Energy>) + (Item2.state as QuantityType<Energy>)
sollte in mySum dann die Summe enthalten, ebenfalls als QuantityType<Energy>, wobei die Werte korrekt nach Wert verrechnet werden.

Auch Multiplikation sollte funktionieren, und zwar so richtig... also die Multiplikation Number:ElectricPotential * Number:ElectricCurrent * Number:Time sollte als Ergebnis Number:Energy liefern (wobei einem klar sein muss, dass das nur näherungsweise stimmen kann, und auch nur, wenn es sich bei Spannung und Strom um echte Mittelwerte über die gesamte Zeitspanne handelt)

Re: Berechnung in einer rule

Verfasst: 11. Nov 2025 20:22
von goerdi
Hi !

Also Wert a ist 1,5 kWh und Wert 2 sind 500 wh das oll gehen ? Woher weiss das System dass der zweite Wert keine 500 kWh sind sondern nur 500 Wh ?

Gruss Gerd

Re: Berechnung in einer rule

Verfasst: 11. Nov 2025 22:48
von udo1toni
Das geht, weil die Einheit mit übergeben wird. Du musst lediglich die Werte als QuantityType<Energy> verwenden, nicht als Number.floatValue.
Probiere es einfach aus, Du wirst (positiv) überrascht sein.

Re: Berechnung in einer rule

Verfasst: 26. Nov 2025 12:41
von goerdi
Hi !

Ok soweit verstanden... ich hab eine Item (Number) das liefert mir die Zahl z.B. 4,25 (4.25) will ich jetzt diese Item in ein anderes "kopieren" (auch number) da bekomm ich immer einen Fehler....

Gruss Gerd

Re: Berechnung in einer rule

Verfasst: 26. Nov 2025 22:32
von udo1toni
Bissi arg theoretisch :)

Aber ganz einfach:

Code: Alles auswählen

item2.postUpdate(item1.state)
überträgt den Wert von item1 nach item2. Gewöhnlich sollte das bei gleichem Itemtyp funktionieren. Es gibt natürlich Ausnahmen :)
Die "überkorrekte" Variante:

Code: Alles auswählen

if(item1.state instanceof Number)
    item2.postUpdate(item1.state as Number)
else
    item2.postUpdate(NULL)
Oder etwas kompakter mit ternärem Operator notiert:

Code: Alles auswählen

item2.postUpdate(if(item1.state instanceof Number) (item1.state as Number) else NULL)
Aber in Deinem Beispiel von weiter oben geht es ja gerade nicht um Number Items, sondern um Number:Energy Items, das ist ein Unterschied.
Nehmen wir an, wir haben drei Items vom Typ Number:Energy,, nämlich Energie1, Energie2 und EnergieSumme, der Status von Energie1 ist 5005 Wh, der Status von Energie2 ist 11.5 kWh, dann ergibt das mittels

Code: Alles auswählen

EnergieSumme.postUpdate((Energie1.state as QuantityType<Energy>) + Energie2.state as QuantityType<Energy>))
in EnergieSumme den Status 16505 Wh (oder 16.505 kWh oder 0.016505 MWh, ganz nach Belieben).
Wie der Wert im Item gespeichert wird und wie der Wert angezeigt wird, kannst Du frei definieren (Ersteres über den Metadaten Parameter unit, Letzteres über den Metadaten Parameter stateDescription->pattern.
Die Unit sollte nur einmal gesetzt werden, da die Persistence nicht unit aware ist, sie orientiert sich an diesem Parameter. Wenn man nun den Parameter verstellt, werden alle bisher persistieren Werte falsch dargestellt.
Die State Description hingegen kannst Du beliebig ändern, sie beeinflusst ja nur, wie der aktuelle Status dargestellt wird. Die angegeben Einheiten sollten allerdings immer zum gewählten Itemtyp passen, also z.B. kJ, MWs, kcal oder mWh für Energie bzw. geleistete Arbeit.

Die Unit, in der das Item den Status hält, die Anzeige-Unit und die Unit, in der der Channel die Daten ins Item ablegt, sind voneinander unabhängig, sie müssen lediglich für die gleiche Größe stehen.
Z.B. liefert ein Temperatursensor über mqtt eine ganze Zahl 200. Du weißt, der Wert wird in zehntel Grad Celsius übertragen.
Du möchtest den Wert in Kelvin speichern, weil Du Wissenschaftler bist, aber die Anzeige sollte in °F erfolgen, und zwar mit einer Nachkommastelle, für die amerikanische Freundin der Tochter, die gerade zu Besuch ist :).

Definition von Channel und Item in Textform:

Code: Alles auswählen

Channel:
Type number : temp "Temeratur" [stateTopic="...", unit="d°C"] // Dezigrad Celsius

// Item:
Number:Temperature Temperatur "Temperatur" {channel="mqtt:...",unit="K",stateDescription=""[pattern="%.1f °F"]}
Wenn Du nun den Status des Items als Number abfragst:

Code: Alles auswählen

logInfo("temp,"Temperatur als Zahl: {}",(Temperatur.state as Number).floatValue)
bekommst Du bei einem Eingangswert von 200 als Rückgabe 293,15 (weil der numerische Wert im Item in Kelvin gehalten wird).
In der Itemliste in der Main UI wird ebenfalls der Wert in K ausgegeben, bei glatten Werten auch mit sichtbarem K als Einheit.
In der Anzeige des einzelnen Items erhältst Du hingegen 68,0 °F., weil hier die State Description angewendet wird.

Die Units of Measurement sind ein extrem mächtiges Werkzeug :)

Re: Berechnung in einer rule

Verfasst: 27. Nov 2025 22:30
von goerdi
Hi !

Vergessen wir das mit der Energy.... ich will es für mich nicht weiter verkomplizieren, weil das nicht allgemein gültig ist (man kann auch mit 2 energywerten was ganz anderes ausrechnen. Es ist quasi nur Zufall das diese Werte ösolche sind.
Also sollte theoretisch folgendes gehen

Code: Alles auswählen

  if  (number1.state > number2.state)
        number2.postUpdate(number1.state as Number)
Quasi um den Max Wert zu speichern

Gruss Gerd