Re: Berechnung in einer rule
Verfasst: 28. Nov 2025 16:05
Nein.
Ein State ist ein State. Du willst mit Zahlen arbeiten.
Entsprechend sollte der Code immer so aussehen:
Das Problem ist hier allerdings, dass durch das Casting ein Fehler auftreten kann, falls der Datentyp nicht stimmt (das gälte allerdings beim Vergleich ebenfalls) Entsprechend ist es essenziell, die Daten vorher zu prüfen:
Selbstverständlich kannst Du auch statt des Abbruchs in anderer Form auf den Fehler reagieren. Wichtig ist nur, dass der anschließende Vergleich mit dem Casting unterlassen wird. Es ist übrigens nicht hinreichend, einfach einen Dummy Wert in das Item zuschreiben, weil openHAB asynchron arbeitet, es gibt also keine Garantie, dass nach dem postUpdate der Wert auch "sofort" wieder aus dem Item gelesen werden kann.
Deshalb kann es sinnvoll sein, mit lokalen Variablen zu arbeiten:
Der letzte Vergleich funktioniert hier, denn es wird lediglich auf Gleichheit (bzw. Ungleichheit) geprüft. Dazu bedarf es keines Castings, die Typkonvertierung wird dabei automatisch korrekt ausgeführt.
Ein State ist ein State. Du willst mit Zahlen arbeiten.
Entsprechend sollte der Code immer so aussehen:
Code: Alles auswählen
if((number1.state as Number) > (number2.state as Number))
number2.postUpdate(number1.state as Number)
Code: Alles auswählen
if(!(number1.state instanceof Number)) {
logWarn("vergleich","number1.state enthält keine gültige Zahl! ()",number1.state)
return;
}
if(!(number2.state instanceof Number)) {
logWarn("vergleich","number2.state enthält keine gültige Zahl! ()",number2.state)
return;
}
if((number1.state as Number) > (number2.state as Number))
number2.postUpdate(number1.state as Number)
Deshalb kann es sinnvoll sein, mit lokalen Variablen zu arbeiten:
Code: Alles auswählen
var Number nZahl1 = 0 // default Wert
var Number nZahl2 = 0 // default Wert
if(number1.state instanceof Number) nZahl1 = number1.state as Number
if(number2.state instanceof Number) nZahl2 = number2.state as Number
if(nZahl1 > nZahl2) nZahl2 = nZahl1
if(number2.state != nZahl2)
number2.postUpdate(nZahl2)