Prozentwert Rechnung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Prozentwert Rechnung

Beitrag 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ß
von udo1toni » 19. Jun 2023 15:06
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. :)
Gehe zur vollständigen Antwort
- OpenHab 2.4
#PWRUP

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Prozentwert Rechnung

Beitrag 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. :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert Rechnung

Beitrag von PeterA »

Irgendwie haben wir unterschiedliche Gehirne :-)
Aber ja ich kanns Nachvollziehen.

Vielen Dank Udo!
- OpenHab 2.4
#PWRUP

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Prozentwert Rechnung

Beitrag von udo1toni »

Gerne :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten