Seite 1 von 1

Prozentwert Rechnung

Verfasst: 19. Jun 2023 08:28
von PeterA
Hi,

folgende Rule kann auch einen negativen Wert ausgeben:

Code: Alles auswählen

rule "Berechne PV Nutzung"

when  

    Item hitchi_in_heute changed or
    Item OpenDTU1_inv1_yieldday changed

then 

    if ((hitchi_in_heute.state as Number).floatValue >= 0 &&
        ((OpenDTU1_inv1_yieldday.state as Number).floatValue) >= 5) {
          pv_usage_today.postUpdate(100 - (((hitchi_in_heute.state as Number).floatValue * 1000 / (OpenDTU1_inv1_yieldday.state as Number).floatValue) * 100))
        } else {
          pv_usage_today.postUpdate(0)
        }

end
Kann man das das Abfangen ?
Als nur wenn das Ergebnis >=0 ist als Ergebnis zulassen ?

Gruß

Re: Prozentwert Rechnung

Verfasst: 19. Jun 2023 15:06
von udo1toni
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. :)

Re: Prozentwert Rechnung

Verfasst: 19. Jun 2023 15:45
von PeterA
Irgendwie haben wir unterschiedliche Gehirne :-)
Aber ja ich kanns Nachvollziehen.

Vielen Dank Udo!

Re: Prozentwert Rechnung

Verfasst: 20. Jun 2023 05:17
von udo1toni
Gerne :)