Die Zauberworte heißen : Variablen, Termumstellung bzw. Umstellung und Validierung.
Denke immer daran, dass ein Item zu jedem Zeitpunkt NULL oder UNDEV liefern kann. Also immer den Typ prüfen, bevor Du einfach castest.
Dein Rechenterm lautet 100 - ((a * 1000 / b) * 100). openHAB beherrscht die mathematischen Grundregeln, Klammern haben höchste Priorität, ansonsten gilt Punkt vor Strich, wobei / eigentlich so geschrieben wird : also ebenfalls Punkte. Ansonsten können alle Teile mit * und + beliebig angeordnet werden, nur - und : dürfen in der Reihenfolge nicht vertauscht werden. Du kannst den Term also auch einfach umstellen zu 100 - 100 * 1000 * a / b (ganz ohne Klammern) und aus 100 * 1000 wird dann 100000, also 100 - 100000 * a / b. Mag sein, dass dass Du die Rechenanweisung in der anderen Form besser nachvollziehen kannst, wäre dann aber besser über einen Kommentar zu realisieren.
Bei ungültigen Werten muss die Rule irgendwie reagiren, ich habe das jetzt einfach mal als 0-Wert abgebildet, aber man könnte natürlich auch stattdessen die Abarbeitung der Rule abbrechen.
So ordentlich:
Code: Alles auswählen
rule "Berechne PV Nutzung"
when
Item hitchi_in_heute changed or
Item OpenDTU1_inv1_yieldday changed
then
var fHitchi = -1.1 // erzwingt Float
var fOpenDTU = -1.1
if(hitchi_in_heute.state instanceof Number)
fHitchi = (hitchi_in_heute.state as Number).floatValue
if(OpenDTU1_inv1_yieldday.state instanceof Number)
fOpenDTU = (OpenDTU1_inv1_yieldday.state as Number).floatValue
var fErg = 100 - 100000 * fHitchi / fOpenDTU
if(fHitchi < 0 || fOpenDTU < 5 || fErg < 0) // Falls Eckwerte nicht erfüllt oder Ergebnis negativ
fErg = 0
pv_usage_today.postUpdate(fErg)
end
Da die Werte mehrfach gebraucht werden, ist es sinnvoll, diese in Variablen zu speichern (Das auslesen des Status über den openHA(Bus) dauert, der Zugriff auf eine Variable dauert nicht.
