Seite 1 von 1

Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 12:13
von Ramme
Hallo allerseits.
Ich habe in meinen Regeln eine Berechnung,bei der eine Negative Zahl raus kommt, wenn im Haus mehr Strom verbraucht als erzeugt wird. Diese Zahl soll dann als null dargestellt werden.
Ich habe überlegt, ein 2. Item anzulegen und dann über eine Regel eine negative Zahl als 0 darstellen zu lassen. Ist halt wieder ein Mehr an Daten in der Datenbank die man sich vieleicht sparen kann.
Gibt es auch eine Möglichkeit direkt in der Berechnungsregel negative Ergebnisse als 0 darzustellen?
Hier die Berechnungsregel wie sie aktuell ist:

rule "Einspeisung_Netz_Aktuell"
when
Item Einspeisung received update
then
Einspeisung_Netz_Aktuell.
postUpdate((Einspeisung_Aktuell.state as DecimalType) - (Hausverbrauch_Aktuell.state as DecimalType))
end

Irgendwie bekomm ichs nicht hin.
Danke für eure Ideen :)

Re: Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 13:46
von KellerK1nd
Würde das selber tatsächlich über ein Proxyitem realisieren und nur das stellst du dann auch da.

Item:

Code: Alles auswählen

Number Einspeisung_Netz_Aktuell_Proxy "Einspeisung"
Regel:

Code: Alles auswählen

rule "Einspeisung_Netz_Aktuell in Proxyitem speichern"
when
Item Einspeisung_Netz_Aktuell changed
then
if((Item Einspeisung_Netz_Aktuell.state as Number) >= 0){
Einspeisung_Netz_Aktuell_Proxy.
postUpdate(Einspeisung_Aktuell.state as Number)
}
if((Item Einspeisung_Netz_Aktuell.state as Number) <=0){
Einspeisung_Netz_Aktuell_Proxy.postUpdate(0)
}
end
Es gilt aber zu beachten, das dein Item Einspeisung_Netz_Aktuell ohne Einheit sein darf, ansonsten gilt:

Regel:

Code: Alles auswählen

rule "Einspeisung_Netz_Aktuell in Proxyitem speichern"
when
Item Einspeisung_Netz_Aktuell changed
then
if((Item Einspeisung_Netz_Aktuell.state as Number).floatValue >= 0){
Einspeisung_Netz_Aktuell_Proxy.
postUpdate((Einspeisung_Aktuell.state as Number).floatValue)
}
if((Item Einspeisung_Netz_Aktuell.state as Number).floatValue <=0){
Einspeisung_Netz_Aktuell_Proxy.postUpdate(0)
}
end

Re: Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 14:30
von Ramme
Hallo Kellerk1nd,
danke für deine Antwort. Diese Lösung hatte ich schon überlegt, es geht mir allerdings darum, ob man sich ein zusätzliches Item, und damit zusätzliche Datenbankeinträge, sparen kann.

Re: Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 14:34
von KellerK1nd
Das eine Item macht das Kraut nicht fett. ;) Ich glaube schlecht geschriebene Regeln machen mehr aus, als 100 Items mehr in der Datenbank. Udo hat bestimmt noch eine einfachere Lösung, ich stecke in der Programmiersprache nicht so drin wie er, ich arbeite erst seit nem halben Jahr so richtig mit openHAB und lerne jeden Tag dazu.

Re: Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 14:44
von Tokamak
Vielleicht verstehe ich das Problem nicht richtig.

Warum nicht so

Code: Alles auswählen

rule "Einspeisung_Netz_Aktuell"
when
    Item Einspeisung_Aktuell received update
then
    val diff=(Einspeisung_Aktuell.state as Number) - (Hausverbrauch_Aktuell.state as Number)
    Einspeisung_Netz_Aktuell.postUpdate(if (diff>0) diff else 0)
end
Man könnte auch das Maximum von der Differenz und 0 nehmen, was aber die Lesbarkeit nicht erhöht.

Re: Bei Berechnung Ergebnis nur als positive Zahl oder Null

Verfasst: 9. Jun 2020 15:22
von Ramme
Tokamak hat geschrieben: 9. Jun 2020 14:44 Vielleicht verstehe ich das Problem nicht richtig.

Warum nicht so

Code: Alles auswählen

rule "Einspeisung_Netz_Aktuell"
when
    Item Einspeisung_Aktuell received update
then
    val diff=(Einspeisung_Aktuell.state as Number) - (Hausverbrauch_Aktuell.state as Number)
    Einspeisung_Netz_Aktuell.postUpdate(if (diff>0) diff else 0)
end
Man könnte auch das Maximum von der Differenz und 0 nehmen, was aber die Lesbarkeit nicht erhöht.
Danke,

hab die Regel mal danach angepasst und bisher schauts erstmal gut aus. Werds beobachten und dann Rückmeldung geben :)