userReadings mit Hilfe von ReadingsVal und {return} im Wert verändern

Begonnen von cocojambo, 16 August 2018, 19:55:09

Vorheriges Thema - Nächstes Thema

CoolTux

Sorry aber ich verstehe nur Bahnhof.

Batt_State  Error evaluating mySL_now userReading Batt_State
Batt_State      4


Welchen Wert hat das Reading denn nun. Beides kann es nicht haben.

Aktualisiert sich das Reading Batt_State vom Device mySL_now wo du ja das userReadings angegeben hast?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

cocojambo

Im Moment gibt die Batterie über den Modbus des SolarEdge Inverters den Status 4 heraus und zwar so:

2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_Temp: 27.40
2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_Watt: -677
2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_Out_Count: 1638
2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_In_Count: 302
2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_Fill: 84.49
2018-08-17 21:33:56 ModbusAttr SolarEdge Batt_State: 4


der alle 30 sek völlig unabhängig ausgelesen wird. mySL_now sind die Daten aus einem Solarlog an dem die 2 Wechselrichter hängen. Dort wird die erzeugte Leistung gemessen und der SolarEdge regelt dahinter die Verteilug der Energie: Einspeisung, Batterieladung-entladung und den Verbrauch.
Den Wert Batt_State hole ich also aus dem SolarEdge, wie auch alle anderen Werte. Die funktionieren alle. Das sieht so aus:

#attr mySL_now userReadings Pac_S0_now {if (ReadingsVal("mySL_now", "S0_now", "0") > ReadingsVal("mySL_now", "Pac_now", "0")) {return '0'} else {ReadingsVal("mySL_now", "Pac_now", "0") - ReadingsVal("mySL_now", "S0_now", "0")+ ReadingsVal("SolarEdge", "Batt_Watt", "0")}},Co2_all {ReadingsVal("mySL_now", "Pac_all", "0")*0.70},S0_Pac_now {if (ReadingsVal("mySL_now", "Pac_now", "0") - ReadingsVal("SolarEdge", "Batt_Watt", "0") > ReadingsVal("mySL_now", "S0_now", "0")) {return '0'} else {ReadingsVal("mySL_now", "S0_now", "0") - ReadingsVal("mySL_now", "Pac_now", "0") + ReadingsVal("SolarEdge", "Batt_Watt", "0")}},Pac_S0_now_avg {ReadingsVal("mySL_now", "Pac_now_avg", "0")- ReadingsVal("mySL_now", "S0_now_avg", "0")}

wo ich dann die Werte miteinander verechne. Und dort soll dann auch die Anzeige für den Status mit eingefügt werden. Ich hoffe das ist einigermassen verständlich.
Die ganze Werte werden dann in einer ReadingGroup zusammengefasst und in einer Tabelle und grafisch auf dem Dashboard dargestellt.

Gruß
Nobbi


FHEM5.9 Buster FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 3xF20S20 2xFS20S4 8xFS20ST 7xFS20SIG2 2xFS20S4U 2xFS20SU 6xFS20KSE 2xHM-ES-PMSW1-PL 2xFS20DI 2xFS20SM8 2xFS20WS 5xS300TH 1xASH2200 1xEM1000

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

cocojambo

Jetzt habe ich dich "verschreckt". Das wollt ich nicht. Schade. Alles läuft ja bei mir einwandfrei seit Jahren und die Verrechnung mache ich ja auch selber. Das war ja nur zur Info was ich mit dem gewonnene Wert mache. Mehr nicht.

Es geht mir ja nur darum das ich den Status der in SolarEdge:Batt_State steckt anders darstellen möchte. Also wenn eine 4 kommt soll die 4 nur "übersetzt" werden in z.B. "laden" die ich dann als "laden" in meiner Tabelle anzeigen kann. Der neue Wert bzw Beschreibung kann ja auch dann in zb "SolarEdge:Batt_State_TXT" stecken, dann kann ich diesen statt Batt_State anzeigen und schon ist der Fall fertig. Das ist alles was ich machen möchte. Also eine Verschönerung der Darstellung.

Alles andere ist Beiwerk, was ich schon größtenteils am Laufen habe.

Vielleicht fällt dir doch noch was ein, bin morgen wieder online.
Gute Nacht
Norbert
FHEM5.9 Buster FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 3xF20S20 2xFS20S4 8xFS20ST 7xFS20SIG2 2xFS20S4U 2xFS20SU 6xFS20KSE 2xHM-ES-PMSW1-PL 2xFS20DI 2xFS20SM8 2xFS20WS 5xS300TH 1xASH2200 1xEM1000

dafex

Da du ja das Reading Batt_Stat von deinem Solar Edge abfragen willst, musst anstatt $name
ReadingsVal("SolarEdge", .... eingeben.

Hast du denn schon mal meinen Code ausprobiert?

Wzut

Zitat von: cocojambo am 17 August 2018, 15:28:25
Ich habe auch auf Anhieb nicht gesehen was an "return" falsch, vielleicht hören irgendwo noch ein paar Klammern hin.
nein, die Frage ist aber wie du versucht hast meinen Einzeiler einzugeben.
Im Webinterface via mySL_now , Attribut userReadings auswählen , in die kleine Eingabezeile klicken und dann im großen Fenster
Batt_State {
my @a=("0"=>"Text1","1"=>"Text2","2"=>"Text2","3"=>"laden","4"=>"entladen","5"=>"Text5","6"=>"Text6","7"=>"???");
my $v=int(ReadingsNum("SolarEdge", "Batt_State", 7)); return $a[$v];}

oder
im Webinterface via mySL_now , Raw definitions und dann im großen Fenster darunter das attr überschreiben bzw. einfügen
attr mySL_now userReadings Batt_State { \
my @a=("0"=>"Text1","1"=>"Text2","2"=>"Text2","3"=>"laden","4"=>"entladen","5"=>"Text5","6"=>"Text6","7"=>"???");;\
my $v=int(ReadingsNum("SolarEdge", "Batt_State", 7));; return $a[$v];;}

und dann Execute commands. Beide Wege führen zum gleichen Ergebniss ohne irgendwelche Auswirkungen auf andere Geräte in der fhem.cfg
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

cocojambo

Ich hatte mich heute morgen erst mal daran gesetzt und habe den Vorschlag von dafex ausprobiert und $name durch SolarEdge ersetzt mit und ohne"........" und auch BattStateHuman ersetzt, ohne Erfolg.
Dann habe ich den Vorschlag der am Anfang des Threads steht probiert ans laufen zu kriegen, nachdem ich daran ein paar Änderungen gemacht hatte, stand plötzlich im "list mySL_now" ein Wert für Batt_State. Nach einigen Versuchen habe ich dann das so ans laufen bekommen:

attr mySL_now userReadings Batt_State {ReadingsVal("SolarEdge", "Batt_State", "") == 0 ? "ist aus" : ReadingsVal("SolarEdge", "Batt_State", "") == 3 ? "wird geladen" : ReadingsVal("SolarEdge", "Batt_State", "") == 4 ? "wird entladen" : ReadingsVal("SolarEdge", "Batt_State", "") == 6 ? "erhaltungsladen" : "unbekannt"}

Damit gehts auf jeden Fall und ich habe das auch schon in meine Berechnungen eingefügt und auch dort scheint es zu gehen. Ob diese Lösung nun die Eleganteste ist weiß ich nicht, aber ich möchte eigendlich nicht noch was anders ausprobieren, es sei denn, es stellt im Verlauf meiner weiteren Programmierung heraus, das diese Version nicht auf Dauer brauchbar ist.

Ich möchte mich auf jeden Fall bei Allen die mir hier geholfen haben und keine Mühe und Zeit gescheut haben, herzlich bedanken.

Mit handwerklichem Gruß aus dem z.Zt. sonnigen Köln-Dellbrück
Norbert

PS: ich hoffe es hat geklappt: ich habe mal eine Foto als .jpg  von meiner noch nicht ganz fertigen Solarseite angehangen.
FHEM5.9 Buster FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 3xF20S20 2xFS20S4 8xFS20ST 7xFS20SIG2 2xFS20S4U 2xFS20SU 6xFS20KSE 2xHM-ES-PMSW1-PL 2xFS20DI 2xFS20SM8 2xFS20WS 5xS300TH 1xASH2200 1xEM1000