ReadingsVal - leere Variable auslesen

Begonnen von cocojambo, 06 September 2019, 13:47:47

Vorheriges Thema - Nächstes Thema

cocojambo

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
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

DeeSPe

Wie wäre es mit:
............Batt_State {!ReadingsVal("SolarEdge", "Batt_State", undef) ? "Error"..........

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

binford6000

{ReadingsVal("SolarEdge", "Batt_State", "Error") ??
VG Sebastian

Beta-User

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

@DeeSPe: Wenn regulär aus, aber erreichbar, ist der Wert "0", wenn ich das richtig verstanden hatte...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cocojambo

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
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

DeeSPe

............Batt_State {ReadingsVal("SolarEdge", "Batt_State", "") !~ /^\d$/ ? "Error"..........

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

cocojambo

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
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

cocojambo

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
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

cocojambo

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
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

DeeSPe

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.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

#12
Hmm, bei SolarLog scheint es um eine Art Statistikmodul zu gehen, das regelmäßig Werte abfragt (siehe 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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Beta-User

#13
...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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cocojambo

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")}

FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000