FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: cocojambo am 06 September 2019, 13:47:47

Titel: ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 13:47:47
Ich habe eine PV Anlage aus der ich verschiedene Werte auslese und auswerte. Dazu stelle ich mit Hilfe von ReadingsVal userReadings zusammen. Von dem Modul "SolarEdgeAPI" bekomme ich verschiedene Batterie Stati gemeldet (normal von 0 bis 7). Wenn das Modul aber ausfällt, wenn die max.API Abfrage zu Ende ist, ist auch die Variable "Batt_State" leer. Damit wird sofort ein Error ausgelöst und meine LOG Datei ist dann voller Error Meldungen. Um diese Fehlermeldung zu vermeiden muß ich mit ReadingsVal den Leerstring auswerten und in meiner Anzeige "Error" ausgeben.
userReading sieht zur Zeit so aus (auszugweise).

..............Batt_State {ReadingsVal("SolarEdge", "Batt_State", "") ==~ m/:\s ? "Error" : ReadingsVal("SolarEdge", "Batt_State", "") == 0 ? "ist aus" : ReadingsVal("SolarEdge", "Batt_State", "") == 1 ? "Standby " : ReadingsVal("SolarEdge", "Batt_State", "") == 2 ? "initialisiert " : ReadingsVal("SolarEdge", "Batt_State", "") == 3 ? "wird geladen " : ReadingsVal("SolarEdge", "Batt_State", "") == 4 ? "wird entladen " : ReadingsVal("SolarEdge", "Batt_State", "") == 5 ? "Fehler " : ReadingsVal("SolarEdge", "Batt_State", "") == 6 ? "Leerlauf " : ReadingsVal("SolarEdge", "Batt_State", "") == 7 ? "Leerlauf "}...........

und um diese Stelle geht es:
............Batt_State {ReadingsVal("SolarEdge", "Batt_State", "") ==~ m/:\s ? "Error"..........

Ich habe alle Möglichkeiten ausprobiert um mit Hilfe von "==~ m/:\s ? " und " !~ m//)" und auch anderen Lösungen die Meldung "Error" auszugeben. Im I-Net und auch hier im Board habe ich keine Lösung gefunden. Wenn die SolarEdgeAPI läuft funktioniert alles einwandfrei.
Weiß einer eine Lösung für dieses Problem?

Gruß aus Köln
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: DeeSPe am 06 September 2019, 13:57:12
Wie wäre es mit:
............Batt_State {!ReadingsVal("SolarEdge", "Batt_State", undef) ? "Error"..........

Gruß
Dan
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: binford6000 am 06 September 2019, 13:57:32
{ReadingsVal("SolarEdge", "Batt_State", "Error") ??
VG Sebastian
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Beta-User am 06 September 2019, 14:08:19
Und noch ein paar Anmerkungen dazu:

- zum einen kann man mit dem dritten Parameter von ReadingsVal() auch einen Rückgabewert festlegen, wenn nichts drin steht... Das ist evtl. leichter auszuwerten als "leer" ;) . (das wäre "if defined ...")
- userReadings sollten m.E. immer einen sauberen Trigger verwenden, und nicht auf alle Events reagieren
- Ob es überhaupt sinnvoll ist, das umzulabeln, mußt du selbst wissen, ggf. ginge das auch als reine Anzeigefunktion auf Basis der reinkommenden Werte
- Dann könntest du den Rückgabewert auch einfach zwischenspeichern, statt ihn wiederholt aufzurufen, z.B. "my $val = ReadingsVal("SolarEdge", "Batt_State", "Error");;"- Solche Wertzuweisungen nach key=>value gehen in Perl evtl. eleganter, wenn du einen Hash verwendest, siehe z.B. hier: https://perlmaven.com/perl-hashes (https://perlmaven.com/perl-hashes)

@DeeSPe: Wenn regulär aus, aber erreichbar, ist der Wert "0", wenn ich das richtig verstanden hatte...
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 14:20:30
Leider funktioniere es nicht mit undef und Error nicht. Auch das ! habe ich eingefügt, immer noch die Error Meldung von Batt_State im Reading.
Ich habe mit:
{(ReadingsVal("SolarEdge", "Batt_State", ""))}

extra noch malnachgesehen ob die Variable auch wirklich leer ist, ja, Anfrage gibt keinen Wert raus.

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: DeeSPe am 06 September 2019, 14:32:40
............Batt_State {ReadingsVal("SolarEdge", "Batt_State", "") !~ /^\d$/ ? "Error"..........

Gruß
Dan
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 14:57:30
Hallo Dan,

so sieht die Eingabe aus:
Batt_State {ReadingsVal("SolarEdge", "Batt_State", "")  !~ /^\d$/ ? "Error"

und so die Error Meldung von attr mySL_now userReadings:
Error evaluating mySL_now userReading Batt_State: syntax error at (eval 3092) line 1, at EOF

Gruß
Nobbi
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: DeeSPe am 06 September 2019, 15:03:25
Zitat von: cocojambo am 06 September 2019, 14:57:30
Hallo Dan,

so sieht die Eingabe aus:
Batt_State {ReadingsVal("SolarEdge", "Batt_State", "")  !~ /^\d$/ ? "Error"

und so die Error Meldung von attr mySL_now userReadings:
Error evaluating mySL_now userReading Batt_State: syntax error at (eval 3092) line 1, at EOF

Gruß
Nobbi

So kann leider niemand helfen.
Bitte mal ein list vom Device.

Gruß
Dan
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 15:08:09
Hier das list mySL_now:

Internals:
   DEF        192.168.115.2 30
   FUUID      5c470f61-f33f-6f9b-f6a3-56a4313f177dd67b
   HOST       192.168.115.2
   INTERVAL   30
   NAME       mySL_now
   NR         809
   STATE      active
   TYPE       Solarlog
   READINGS:
     2019-09-06 15:06:05   Batt_State      Error evaluating mySL_now userReading Batt_State: syntax error at (eval 3526) line 1, at EOF

     2019-09-06 15:06:05   Baum_all        53586243.2
     2019-09-06 15:06:05   Co2_all         53586243.2
     2019-09-06 15:06:05   Pac_Day         33650
     2019-09-06 15:06:05   Pac_Day_avg     33443
     2019-09-06 15:06:05   Pac_Mon         176953
     2019-09-06 15:06:05   Pac_Mon_avg     176746
     2019-09-06 15:06:05   Pac_S0_now      4854
     2019-09-06 15:06:05   Pac_S0_now_avg  4840
     2019-09-06 15:06:05   Pac_Year        7671000
     2019-09-06 15:06:05   Pac_Year_avg    7670793
     2019-09-06 15:06:05   Pac_all         76551776
     2019-09-06 15:06:05   Pac_all_avg     76551569
     2019-09-06 15:06:05   Pac_now         5482
     2019-09-06 15:06:05   Pac_now_avg     5467
     2019-09-06 15:06:05   S0_Day          6840
     2019-09-06 15:06:05   S0_Day_avg      6814
     2019-09-06 15:06:05   S0_Mon          56029
     2019-09-06 15:06:05   S0_Mon_avg      56003
     2019-09-06 15:06:05   S0_Pac_now      0
     2019-09-06 15:06:05   S0_Year         2493093
     2019-09-06 15:06:05   S0_Year_avg     2493067
     2019-09-06 15:06:05   S0_all          35522645
     2019-09-06 15:06:05   S0_all_avg      35522619
     2019-09-06 15:06:05   S0_now          628
     2019-09-06 15:06:05   S0_now_avg      627
Attributes:
   alias      Solar-Log Energie Kontrolle
   avg_count  10
   group      Systemkontrolle
   register   3502,Pac_now,3518,S0_now,3520,S0_Day,3524,S0_Mon,3526,S0_Year,3516,Pac_all,3508,Pac_Day,3512,Pac_Mon,3514,Pac_Year,3528,S0_all
   room       System
   userReadings Pac_S0_now {if (ReadingsVal("mySL_now", "S0_now", "0")+ ReadingsVal("SolarEdge", "Batt_Watt", "0") > ReadingsVal("mySL_now", "Pac_now", "0")) {return '0'} else {ReadingsVal("mySL_now", "Pac_now",


Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: DeeSPe am 06 September 2019, 15:32:29
Ich kann bei dem list kein erstelltes userReading mit Batt_State finden!
Das Attribut userReading scheint nicht vollständig zu sein.

Irgendwie dachte ich auch es geht um das Device SolarEdge und nicht um mySL_now.

Gruß
Dan
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 15:49:02
hier das list SolarEdge:

Internals:
   DEF        1 30 192.168.115.3:502 TCP
   DeviceName 192.168.115.3:502
   EXPECT     idle
   FD         38
   FUUID      5c470f64-f33f-6f9b-0546-4ade89a2d57ede73
   INTERVAL   30
   IODev      SolarEdge
   LASTOPEN   1567773634.65354
   MODBUSID   1
   MODE       master
   MODULEVERSION Modbus 4.1.4 - 1.6.2019
   NAME       SolarEdge
   NOTIFYDEV  global
   NR         1349
   NTFY_ORDER 50-SolarEdge
   PARTIAL   
   PROTOCOL   TCP
   STATE      opened
   TCPConn    1
   TRIGGERTIME 1567777032.54309
   TRIGGERTIME_FMT 2019-09-06 15:37:12
   TYPE       ModbusAttr
   devioLoglevel 4
   lastUpdate 1567777002.54309
   nextOpenDelay 60
   QUEUE:
   READ:
     BUFFER     
   READINGS:
     2019-09-06 14:40:35   state           opened
   REMEMBER:
     lid        1
     lname      SolarEdge
     lrecv      1567777002.68791
     lsend      1567777002.6613
   defptr:
     SolarEdge  1
   lastRead:
Attributes:
   alias      SolarEdge Energie Steuerung
   dev-h-combine 200
   dev-h-defPoll 1
   dev-h-defShowGet 1
   enableControlSet 1
   group      Systemkontrolle
   maxTimeoutsToReconnect 3
..........
   obj-h57734-reading Batt_State
   obj-h57734-unpack s>
............
   room       System
   silentReconnect 1
   sortUpdate 1


Aber nützt ja nichts weil unter der Adresse "h57734" keine "Batt_State" Daten zur Verfügung stehen und deshalb ist ja auch die Variable die an mySL_now übergeben wird, leer. Die Error Meldung entsteht ja nicht hier in dem Modul, sondern erst später bei der Auswertung in mySL_now bei der Definition der userReadings. Und wie gesagt, wenn der Wert wieder da ist, geht die Ausgabe 0-7 wieder.

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: DeeSPe am 06 September 2019, 15:58:43
Ich denke hier ist Deine Herangehensweise falsch.
userReading wird nur innerhalb des eigenen Devices verwendet, sonst fehlt der Trigger.
Wenn Du so etwas Device-übergreifend machen willst, dann würde ich das mit einem notify machen und dann entsprechend die Readings in dem anderen Device setzen.

Damit Dir hier wirklich jemand verbindlich helfen kann musst Du noch das vollständige list von mySL_now liefern.

Gruß
Dan

P.S. Mir fällt gerade auf dass es in dem list von SolarEdge keine Readings außer state gibt.
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Beta-User am 06 September 2019, 16:22:12
Hmm, bei SolarLog scheint es um eine Art Statistikmodul zu gehen, das regelmäßig Werte abfragt (siehe https://wiki.fhem.de/wiki/SolarLog (https://wiki.fhem.de/wiki/SolarLog)), vermutlich, um Loggen und eben auch "angebotsabhängig" Verbraucher schalten zu können.

Der TE hat hier keinen Trigger definiert, was an sich als generelle Vorgehensweise nicht optimal ist, aber vermutlich hier (ausnahmsweise) nicht schädlich, weil eh' alles auf einen Rutsch aktualisiert wird (??). Es ist aber kein Problem, mit userReadings externe Werte abzufragen und ins eigene Device zu importieren - dass da ("extern") im Moment nur state verfügbar ist, scheint ja gerade die Ursache zu sein, warum das hier knallt...

Vorschlag @TE: check doch nochmal deinen Post von 15:08, das list dort ist nicht vollständig, was du vermutlich trotz der Hinweise von DeeSPe übersehen hast...

Dann mach' in dein ursprüngliches userReading mal überall $name rein statt des "mySL_now", dann erkennen wir besser, was sich auf interne Werte bezieht, und was "von außen" geholt wird.
(EDIT: nein, machen wir erst am Ende, sonst klappt das mit der Kommandozeile nicht so einfach...)

Zuletzt überarbeiten wir dann den Code auf eine besser lesbare und funktionale Form? Hier sind ja genug Leute, die wissen, wie sowas geht...
Zur Vorgehensweise würde ich vorschlagen, den Perlcode nicht jedesmal in das attr zu übertragen, sondern erst mal in der Kommandozeile zu testen?
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Beta-User am 06 September 2019, 16:34:45
...oder versuche den relevanten Teil mal mit folgendem zu ersetzen:
Batt_State { my %rets = ("Error"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",);; my $val = ReadingsVal("SolarEdge", "Batt_State", "Error");; my $val = ReadingsVal("SolarEdge", "Batt_State", "Error");; $rets{$val};;}
Edit: ein paar ; eingefügt...
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 17:33:48
Bei SolarEdge und mySL_now werden bei zwei Module verwendet die einen Solarlog und einen Inverter per Modbus auslesen und die Werte schalten div.Aktoren, versorgen ein Wanddisplay mit Tabellen und Grafiken.
So ich habe jetzt mal die Zeile von Beta-User eingefügt. Die vorigen Error Meldungen sind weg und im Reading steht jetzt tatsächlich "Error". Es scheint also zu funktionieren. Aber warum steht da so oft
my $val = ReadingsVal("SolarEdge", "Batt_State", "Error")
drin?
Und wie kann ich jetzt mal vorher den "Ernstfall" testen wenn der Inverter wieder seine Daten rausrückt?
Und was mir noch einfiel: hätte man nicht einfach zu dem Batt_State immer "1" dazuadieren können und dann die Zahlenauswertung um 1 erhöht. Dann wäre doch immer mindestens Value ="1" da gewesen?

Gruß
Norbert

hier trotzdem noch mal mein komplettes list mySL_now, mit dem geändertem ReadingsVal
Internals:
   DEF        192.168.115.2 30
   FUUID      5c470f61-f33f-6f9b-f6a3-56a4313f177dd67b
   HOST       192.168.115.2
   INTERVAL   30
   NAME       mySL_now
   NR         809
   STATE      active
   TYPE       Solarlog
   READINGS:
     2019-09-06 17:27:12   Batt_State      Error
     2019-09-06 17:27:12   Baum_all        53592926.1
     2019-09-06 17:27:12   Co2_all         53592926.1
     2019-09-06 17:27:12   Pac_Day         43197
     2019-09-06 17:27:12   Pac_Day_avg     43117
     2019-09-06 17:27:12   Pac_Mon         186500
     2019-09-06 17:27:12   Pac_Mon_avg     186420
     2019-09-06 17:27:12   Pac_S0_now      1294
     2019-09-06 17:27:12   Pac_S0_now_avg  1512
     2019-09-06 17:27:12   Pac_Year        7680547
     2019-09-06 17:27:12   Pac_Year_avg    7680467
     2019-09-06 17:27:12   Pac_all         76561323
     2019-09-06 17:27:12   Pac_all_avg     76561243
     2019-09-06 17:27:12   Pac_now         1867
     2019-09-06 17:27:12   Pac_now_avg     2003
     2019-09-06 17:27:12   S0_Day          8205
     2019-09-06 17:27:12   S0_Day_avg      8183
     2019-09-06 17:27:12   S0_Mon          57394
     2019-09-06 17:27:12   S0_Mon_avg      57372
     2019-09-06 17:27:12   S0_Pac_now      0
     2019-09-06 17:27:12   S0_Year         2494458
     2019-09-06 17:27:12   S0_Year_avg     2494436
     2019-09-06 17:27:12   S0_all          35524010
     2019-09-06 17:27:12   S0_all_avg      35523988
     2019-09-06 17:27:12   S0_now          573
     2019-09-06 17:27:12   S0_now_avg      491
Attributes:
   alias      Solar-Log Energie Kontrolle
   avg_count  10
   group      Systemkontrolle
   register   3502,Pac_now,3518,S0_now,3520,S0_Day,3524,S0_Mon,3526,S0_Year,3516,Pac_all,3508,Pac_Day,3512,Pac_Mon,3514,Pac_Year,3528,S0_all
   room       System
   userReadings Pac_S0_now {if (ReadingsVal("mySL_now", "S0_now", "0")+ ReadingsVal("SolarEdge", "Batt_Watt", "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")}}, Batt_State { my %rets = ("Error"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",); my $val = ReadingsVal("SolarEdge", "Batt_State", "Error"); my $val = ReadingsVal("SolarEdge", "Batt_State", "Error"); $rets{$val};},Pac_S0_now_avg {ReadingsVal("mySL_now", "Pac_now_avg", "0")- ReadingsVal("mySL_now", "S0_now_avg", "0")},Baum_all {ReadingsVal("mySL_now", "Co2_all", "0")}

Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Beta-User am 06 September 2019, 17:47:57
UPS,   Tastatur gehangen...? Hinten ist es überflüssig...
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 18:16:50
Habe die hinteren 2 "Errors" entfernt und jetzt kommen wieder die Error Meldungen.

Batt_State { my %rets = ("Error"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",);; $rets{$val};;}

Zuviel geändert? oder zuviel gekürzt?

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 06 September 2019, 20:14:03
Ich habe die erste Version in der "Error"  im Reading stand wieder eingespielt.
Leider steht im LOG folgende Fehlermeldung. Scheint also doch noch nicht so wirklich zu funktionieren:

2019.09.06 20:08:16 1: PERL WARNING: "my" variable $val masks earlier declaration in same scope at (eval 27016) line 1.
2019.09.06 20:08:16 3: eval: { my %rets = ("Error"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",);; my $val = ReadingsVal("SolarEdge", "Batt_State", "Error");; my $val = ReadingsVal("SolarEdge", "Batt_State", "Error");; $rets{$val};;}


und kann man da was machen?

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Beta-User am 07 September 2019, 07:38:29
Du hattest schon recht, da war was zu viel - ziemlich genau das sagt auch die Fehlermeldung.

Hab's entfernt, den "Ersatzrückgabewert" etwas umbenannt und die Reihenfolge umgedreht, dann wird vielleicht klarer, was da passiert:
Batt_State { my $val = ReadingsVal("SolarEdge", "Batt_State", "Err");; my %rets = ("Err"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",);; $rets{$val};;}
Bedeutet:
1. ReadingsVal = Aktuellen Zustand (in eine Variable) holen, gibt's da ein Problem (Device oder Reading existiert nicht oder ist undef), wird "Err" zurückgeliefert.
2. HASH definieren, der die effektiven Rückgabewert-MÖGLICHKEITEN enthält.
3. Rückgabewert für die Variable aus dem HASH holen...

Hab's zwar nicht nochmal getestet, sollte aber funktionieren.
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Wzut am 07 September 2019, 08:33:56
Jungs ihr seid zwar wohl schon recht weit, aber für mich liest sich das alles als ob ihr das Symptom statt der Ursache behandelt.
Ursache ist doch wohl das Modbus ein leeres bzw gar kein Reading für die Registerabfrage 57734 liefert ?
Also warum nicht im Modbus Device ein userReading mit Namen Batt_State erstellen und das aus dem Registerwert von 57734 bilden.
D.h liefert  57734 einen Wert 0-7 geht dieser direkt im userReading durch, ist es nicht vorhanden ist der Returnwert eben ein beliebiger andere String/Wert.
Trigger ist bestimmt auch einfach zu definieren, cocojambo hat das list gekürzt aber da sind wahrscheinlich noch mehr Registerwerte die auch im dem Fehlerfall eine gültige Antwort liefern.
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 07 September 2019, 09:36:40
Das ist richtig, es werden noch mehr Werte ausgelesen. Diese machen aber keinen "Ärger" wenn sie nicht da sind, weil sie nicht weiter bearbeitet werden, sondern 1:1 in die Ausgabe übernommen werden. Es wird ja bei der Abfrage der Werte kein Error ausgelöst. Der Modbus gibt "opened" raus, die Adresse scheint auch abgefragt zu werden, hat aber keinen Inhalt. Ich habe SolarEdge diesbezüglich schon angeschrieben, da einige Adressen weiterhin funktionieren. Habe nur noch keine Stellungsnahme dazu bekommen.
Die Idee das "leere Reading" mit einem Wert zu füllen, hatte ich ja auch, indem man einfach immer zu jeder Ausgabe +1 dazu addiert und die Abfrage dann entsprechend ändert. Dadurch käme immer mindestens der Wert 1 an. Habe es aber nicht hinbekommen und deshalb verworfen.

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: Wzut am 07 September 2019, 12:21:58
na also wenn es Register gibt die immer einen Wert liefern hat man schon mal einen Trigger für das userReading.
Das Geräte via Modbus gar keinen Wert liefert ist ärgerlich, aber vom User wohl ersteinmal kaum zu ändern.
Man kann allerdings noch einen Schritt weitergehen und mal mit dem Autor von ModbusAttr (StefanStrobel) reden :
a. warum löscht er bereits vorhandene Readings ? (finde ich persönlich etwas unglücklich und wenn nötig dann kann man dem User ggf. auch die Wahl lassen)
b. ob es nicht möglich wäre wenn ein Register bei der Abfrage keinen Wert mehr liefert es mit irgend einem default Wert zu besetzen.
Allerdings solltest du sicher sein das wirklich kein Wert vom WR kommt, oder kommt vllt. doch einer nur fällt er bei der Auswertung durchs Raster ?
(da sollte ein verbose 5 Log für Aufklärung sorgen)
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 07 September 2019, 13:25:10
Ich frage alle 30sek 23 Adressen des Inverters ab nach dem gleichen Schema. Davon bekomme ich 14 Readings mit den richtigen Werten zurück. Der Rest betrifft nur die storage-Daten, die alle vor 3 Tagen Mittags plötzlich gleichzeitig keine Readings mehr lieferten. Die kompletten Energy Daten liefen weiter bis einschließlich heute. Deshalb vermute ich, das der Hersteller SolarEdge über ein "Fernupdate" diese Abfragen gesperrt hat. Deshalb habe ich bei SolarEdge bereits angefragt. Meine Anfrage ist bereits vom techn.Support hier in Deutschland weitergeleitet worden zum techn.Support in Israel. Leider habe ich noch keine Stellungnahme.

Das mit dem verbose 5 LOG werde ich auf jeden Fall trotzdem mal versuchen.

Gruß
Norbert
Titel: Antw:ReadingsVal - leere Variable auslesen
Beitrag von: cocojambo am 27 September 2019, 17:46:46
So, die Adressen die ich auslesen möchte sind mittlerweile in meinem Inverter wieder von SolarEdge freigeschaltet worden und es kommen wieder alle Werte so wie Vorher. Aber jetzt wo die Zahlenwerte für den Zustand der Batterie wieder ausgelesen werden, kommt zwar keine "Error" Anzeige mehr, dafür aber nur die Zahlenwerte und nicht die entsprechenden "Zustände".

attr mySL_now userReadings Pac_S0_now {if (ReadingsVal("mySL_now", "S0_now", "0")+ ReadingsVal("SolarEdge", "Batt_Watt", "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")}},Batt_State { my $val = ReadingsVal("SolarEdge", "Batt_State", "Err");; my %rets = ("Err"  => "Error","0" => "ist aus","1" => "Standby","2" => "initialisiert","3" => "wird geladen","4" => "wird entladen","5" => "Fehler","6"  => "Leerlauf","7"  => "Leerlauf",);; $rets{$val};;},Pac_S0_now_avg {ReadingsVal("mySL_now", "Pac_now_avg", "0")- ReadingsVal("mySL_now", "S0_now_avg", "0")},Baum_all {ReadingsVal("mySL_now", "Co2_all", "0")}
attr mySL_now verbose 5


verbose=5 gibt auch keine Auskunft darüber warum das so ist:

2019.09.27 17:43:47 4: Solarlog_getupdate
2019.09.27 17:43:47 4: avg_count: 10
2019.09.27 17:43:47 4:   currentvalues: 388, 2686, 7927, 200425, 2637489, 77129426, 26939, 754603, 8248650, 35667041
2019.09.27 17:43:47 4:     count_avg: 100
2019.09.27 17:43:47 4:     avg_count: 10
2019.09.27 17:43:47 4:     reg_count: 10
2019.09.27 17:43:47 4:     add reg  : 3502 Pac_now 3518 S0_now 3520 S0_Day 3524 S0_Mon 3526 S0_Year 3516 Pac_all 3508 Pac_Day 3512 Pac_Mon 3514 Pac_Year 3528 S0_all
2019.09.27 17:43:47 4:   shift 0
2019.09.27 17:43:47 4:   shift 1
2019.09.27 17:43:47 4:   shift 2
2019.09.27 17:43:47 4:   shift 3
2019.09.27 17:43:47 4:   shift 4
2019.09.27 17:43:47 4:   shift 5
2019.09.27 17:43:47 4:   shift 6
2019.09.27 17:43:47 4:   shift 7
2019.09.27 17:43:47 4:   shift 8
2019.09.27 17:43:47 4:   shift 9
2019.09.27 17:43:47 4:     --------------------
2019.09.27 17:43:47 4:     new avg_values: 413, 737, 7793, 200291, 2637355, 77129398, 26911, 754575, 8248622, 35666907, 401, 737, 7793, 200291, 2637355, 77129401, 26914, 754578, 8248625, 35666907, 390, 761, 7805, 200303, 2637367, 77129404, 26917, 754581, 8248628, 35666919, 383, 761, 7805, 200303, 2637367, 77129407, 26920, 754584, 8248631, 35666919, 369, 2758, 7840, 200338, 2637402, 77129411, 26924, 754588, 8248635, 35666954, 374, 2758, 7840, 200338, 2637402, 77129414, 26927, 754591, 8248638, 35666954, 389, 2647, 7883, 200381, 2637445, 77129417, 26930, 754594, 8248641, 35666997, 398, 2647, 7883, 200381, 2637445, 77129421, 26934, 754598, 8248645, 35666997, 386, 2686, 7927, 200425, 2637489, 77129424, 26937, 754601, 8248648, 35667041, 388, 2686, 7927, 200425, 2637489, 77129426, 26939, 754603, 8248650, 35667041
2019.09.27 17:43:47 4:     Pac_now - 0
2019.09.27 17:43:47 4:     S0_now - 1
2019.09.27 17:43:47 4:     S0_Day - 2
2019.09.27 17:43:47 4:     S0_Mon - 3
2019.09.27 17:43:47 4:     S0_Year - 4
2019.09.27 17:43:47 4:     Pac_all - 5
2019.09.27 17:43:47 4:     Pac_Day - 6
2019.09.27 17:43:47 4:     Pac_Mon - 7
2019.09.27 17:43:47 4:     Pac_Year - 8
2019.09.27 17:43:47 4:     S0_all - 9


Woran kann das denn jetzt liegen? Ich finde eigendlich keinen direkten Fehler.

Gruß
Norbert