Userreadings-Wert soll die 0 nicht unterschreiten

Begonnen von Stargazer, 18 Juni 2018, 14:02:31

Vorheriges Thema - Nächstes Thema

Stargazer

Hallo zusammen,

ich habe hier derzeit eine kleine Simulation laufen, die darstellen soll, wie unser Verbrauch mit einer Hausbatterie im täglichen Leben aussieht.
Nun habe ich soweit alles fertig und es läuft auch gut. Nun habe ich aber eine Frage an euch.
Ich habe in dem Modul zum auslesen für das Energymeter (SMA) ein userreadings angelegt, welches aus den bilanzierenden Werten von Einspeisung und Verbrauch den virtuellen Akku bedient oder aus ihm zieht. Doch dieser Akku hat derzeit eine nutzbare Kapazität von 0 - 25 kW/h. Und nun zu meinem Problem. Das Reading darf sich ja nur zwischen 0 und 25 kW/h bewegen (Verluste usw. erstmal hinten angestellt).

Doch wie bekomme ich es am einfachsten hin, dass er nicht unter 0 zählt ?

Habt ihr eine Idee ?

Viele Grüße und besten Dank

André

PS.: Ein Ansatz wäre ein DOIF zu setzen, welches den Wert überwacht und bei einem Wert unter 0 diesen wieder automatisch auf 0 setzt. Das sähe dann so aus:

[SMA_EM:Batteriesimulation] < 0.0) (setreading SMA_EM:Batteriesimulation 0.000)

Das muss ich noch testen. Würde das wohl funktional gehen ?

Frank_Huber

TempDiff {if (ReadingsVal("Pool_Temp_1","Temp_1",0) - ReadingsVal("Pool_Temp_2","Temp_2",0) > 0 )) {return (ReadingsVal("Pool_Temp_1","Temp_1",0) - ReadingsVal("Pool_Temp_2","Temp_2",0))} else {return 0}}

So mache ich es im Userreading für meine Poolheizung.
Wenn Wert 1 - Wert 2 > 0 gebe Wert 1 minus Wert 2 zurück, ansonsten gebe 0 zurück

Stargazer

 Hallo Frank,

besten Dank für deinen Tipp. Ich habe das jetzt für mich abgeändert und in die Formel integriert. Also bei der 0 funktioniert das perfekt.
Die zweite If-Bedingung mit der 25 habe ich ebenfalls integriert. Da muss ich aber auf einen einigermaßen windigen Tag hoffen, damit er den virtuellen Akku wieder aufladen kann. Oder aber einen Tag richtig gute Sonne.

VG

André

Stargazer

Hallo zusammen,

ich habe derzeit diese Konfiguration:

Batteriesimulation0 {if (ReadingsVal("SMA_EM","Batteriesimulation",0) < 0 ) {return (ReadingsVal("NullWertBatt","state",0))};;}

Das Reading orientiert sich an dem Simulationswert, welches vorher errechnet wurde (Batteriesimulation).
Ein dummy enthält den angezeigten Wert 0. So kommt der Batteriewert nicht mehr unter 0. Das läuft. Und ich habe später schnell die Möglichkeit, den Wert des dummy's zu ändern. Doch wie bekomme ich das nun noch mit dem Oberwert 25 hin ?
Ich hatte da schon mit elseif experementiert. Doch derzeit stehe ich mit Perl noch etwas auf Kriegsfuß.

Kann ich das mit einem elseif machen ?

VG

André


Stargazer

Hallo zusammen,

ich habe mich nun etwas durchgeboxt und habe zwei Userreadings, die ich generiere.
Zum einen, wird der stupfe Akkuwert berechnet (Reading : Batteriesimulation).
Zum anderen soll das eigentliche Reading generiert werden, welches die beiden Endwerte 0 und 25 berücksichtigt.

Der Codeblock sieht zurzeit folgendermaßen aus :

Batteriesimulation:.* {(ReadingsVal("BattKapWert","state",0))-(ReadingsVal("Energie_Bezug","SMA_EM_SMAEM1900235883_Bezug_Wirkleistung_Zaehler_EnergyDay",0)*0.90)+(ReadingsVal("Energie_Einspeisung","SMA_EM_SMAEM1900235883_Einspeisung_Wirkleistung_Zaehler_EnergyDay",0)*0.90)}, Batteriesimulation0:.* {if (ReadingsVal("SMA_EM","Batteriesimulation",0) < 0) {return (ReadingsVal("SMA_EM","Batteriesimulation",0))- ((ReadingsVal("SMA_EM","Batteriesimulation",0)))}elseif(ReadingsVal("SMA_EM","Batteriesimulation",0) >25 ) {return  (ReadingsVal("Batteriestatus","state",0))}else {return (ReadingsVal("SMA_EM","Batteriesimulation",0))}}




Da schreibt er mir folgenden Fehler zu:

Error evaluating SMA_EM userReading Batteriesimulation0: syntax error at (eval 2806793) line 1, near ")  {"

Ich habe mir schon die Augen wund gesucht, konnte nur herausfinden, dass es im Bereich des vorletzten "return" liegen müsste.
Ich sehe da aber anscheinend den Wald vor lauter Bäumen nicht.

Kann mir da jemand noch einen Tipp geben ?

Dann wäre ich nämlich fertig.

Viele Grüße und besten Dank

André

rischbiter123

Moin,
ich bin auch nicht so der Perl-Freak, aber Du hast beim vorletzten return zwischen return und öffnender Klammer scheinbar zwei Leerzeichen.

Und müsste nicht bei
{return (ReadingsVal("SMA_EM","Batteriesimulation",0))-
[color=red]([/color](ReadingsVal("SMA_EM","Batteriesimulation",0)))}

die öffnende Klammer vor das erste ReadingsVal?

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Stargazer

#6
Grüß dich, Andreas !

Vielen Dank für deinen Tipp. Hatte es damit versucht. Ändert sich leider nix.

Derzeit habe ich diesen Code:

Batteriesimulation:.* {(ReadingsVal("BattKapWert","state",0))-(ReadingsVal("Energie_Bezug","SMA_EM_SMAEM1900235883_Bezug_Wirkleistung_Zaehler_EnergyDay",0)*0.90)+(ReadingsVal("Energie_Einspeisung","SMA_EM_SMAEM1900235883_Einspeisung_Wirkleistung_Zaehler_EnergyDay",0)*0.90)}, Batteriesimulation0:.* {if (ReadingsVal("SMA_EM","Batteriesimulation",0) <0) {return (ReadingsVal("SMA_EM","Batteriesimulation",0))- ((ReadingsVal("SMA_EM","Batteriesimulation",0)))}elseif(ReadingsVal("SMA_EM","Batteriesimulation",0) [color=red]>25) {return[/color]  (ReadingsVal("Batteriestatus","state",0))}else {return (ReadingsVal("SMA_EM","Batteriesimulation",0))}}


Wenn ich den Abstand zwischen der runden Klammer (Bedingung) und der geschweiften geöffneten Klammer (Perl-Anweisung) verändere, wird das auch in dem Fehler dargestellt. Also vermute ich da einfach noch einen Fehler. Ich stehe nur voll auf dem Schlauch, wo da noch was sein könnte  :-[.

VG

André

PS.: Die Stelle wird ja im Codeblock nicht markiert. Ich meine die..:  ...elseif(ReadingsVal("SMA_EM","Batteriesimulation",0) >25) {return (ReadingsVal("Batteriestatus"...

rischbiter123

Moin,

hast Du mal die andere Klammersetzung

{return ((ReadingsVal("SMA_EM","Batteriesimulation",0))-((ReadingsVal("SMA_EM","Batteriesimulation",0)))}

blau statt rot angesehen?

Perl meckert nämlich manchmal auch an der "falschen" Stelle, wenn vorherige Klammern anders interpretiert werden als gedacht.
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Stargazer

Nabend,

jawoll. Habe ich mir gerade angesehen und auch mal dahingehend verändert. Fehlermeldung bleibt die gleiche...

VG und besten Dank

André

Stargazer

Hallo zusammen,

ich habe in der letzten Zeit an dem virtuellen Akku weitergearbeitet. Es läuft soweit erst einmal sehr gut.
Nur habe ich da ein Problem, wo ihr eventuell eine Idee habt.

Und zwar erzeuge ich mir ja per userReading einen passenden Zähler, wie siehe oben.
Nur habe ich ja das Problem, dass der Zähler, wenn er den über Tage den Bezug zählt und die Erzeugung
nicht groß genug war, der Wert in den Minus Bereich geht. Dann stehen dort Morgens z.B.: - 7 kW/h.
Jetzt kommt am nächsten Tag Erzeugungsüberschuss im Bereich von 5 kW/h dazu. Dann habe ich dort -2 kW/h auf dem Akku.

Dieser kann ja aber nicht ins negative gehen. Das ganze habe ich in einer Readingsgroup optisch per DOIF gelöst.
Wenn der Wert negativ wert, setze den angezeigten Akkuwert auf 0. Das geht richtig gut.

Doch wenn es ganz korrekt laufen würde, müsste er die 5 kW/h an plus in den Akku geladen haben.

Wie kann ich das mit dem Zählwerk lösen ?

Habt ihr eine Idee ?

Viele Grüße und besten Dank

André