[gelöst] Frage zu Ersatzwert von Readingsval

Begonnen von TomLee, 15 Juni 2018, 15:43:48

Vorheriges Thema - Nächstes Thema

Otto123

Ich nehme an: weil es $EVTPART1 nicht gibt wenn list_SHOPPING_ITEM leer ist.

Und <ne "willi"> ist immer wahr wenn nicht willi drin steht. Also auch wenn es leer ist.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ok.

Mit

{length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error"))}

haben wir aber schon festgestellt  das es "0" zurück gibt, wenn list_SHOPPING_ITEM leer ist.

Darum weiterer Test mit

Echo:list_SHOPPING_ITEM:.* { if (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")) ne "0") { fhem("set EG_Echo_Kueche tts Jetzt gehts")}}

Mit dem Ergebnis die tts wird ausgegeben beim Wert hinzufügen und die tts wird nicht ausgegeben beim vollständigen löschen der Einkaufsliste (kein Wert vorhanden= length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")) ergibt 0). Sieht also gut aus :D

Dann wieder das gleiche mit Filewrite:

Echo:list_SHOPPING_ITEM:.* { if (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")) ne "0") { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}

und die Meldung kommt wieder auch wenn length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")) wieder 0 ergibt.
Dabei sollte doch der Befehlsteil gar nicht, wie oben, ausgeführt werden.

2018.06.17 17:38:17 1: ERROR evaluating my $SELF='not_Echo_Einkaufsliste';my $TYPE='echodevice';my $EVTPART0='list_SHOPPING_ITEM:';my $NAME='Echo';my $EVENT='list_SHOPPING_ITEM: ';
{ if (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")) ne "0") { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}:
Global symbol "$EVTPART1" requires explicit package name at (eval 679266) line 1

Wuppi68

auf $EVTPART<n> bin ich auch schon reingefallen ;-)

wenn $EVENT nur 1 Element hat gibt auch NUR $EVTPART0.

Ich habe mir dadurch beholfen, dass ich $EVENT selber in meiner Funktion gesplittet habe. Kann es nur die nächsten 2 Wochen nicht nachschauen, da ich keinen Zugriff auf meinen Rechner habe ;-)

Fand ich super böse, aber auch völlig korrekt diese Situation.
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

TomLee

Mein letzter Test zeigt doch aber das überhaupt gar kein Teil der EVTPART<n> nutzt verwendet werden sollte, da der Befehlsteil gar nicht erst ausgeführt werden dürfte.

Otto123

Kannst Du beschreiben wie du im Gerät Echo das reading list_SHOPPING_ITEM manipulierts damit Länge null wird?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Manipuliere nix, führe zum testen,während die Liste nur einen Wert enthält, nur den Befehl "set echo item_shopping_delete  <Wert>" aus.
Am Ende macht das das hier erwähnte DOIF.

Otto123

Sorry ist mir zu komplex. Ich gehe raus. Hab versucht das ansatzweise nachzustellen, aber es gelingt mir nicht.

Viel Erfolg noch
Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Wirf mal das "Error" raus und nimm stattdessen "". Könnte sein, dass es doch so ist, dass je nach Fallgestaltung irgendwas komplett gelöscht wird.
Und so sollte es auch gehen (ist m.E. alles gleichbedeutend):
Echo:list_SHOPPING_ITEM:.* { if (!length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}

Echo:list_SHOPPING_ITEM:.* { unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}

Echo:list_SHOPPING_ITEM:.* { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "")))}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Moin,

fass es nicht, das wars.

Mit dem 1. Beispiel bleibt's zwar bei der Meldung, mit dem 2. und 3. klappt's aber jetzt. ;D

Dickes DANKE

TomLee

Eine Verständnisfrage hätte ich noch zu unless.

Sehe ja das es nicht anders sein kann trotzdem muss ich noch mal fragen.

Es wird im Bedingungsteil ja kein Vergleich gemacht, mit Readingsval nur eine Abfrage.
Verstehe ich es richtig das bei unless der Bedingungsteil automatisch WAHR ist wenn ein Wert vorhanden und FALSCH wenn keiner vorhanden ?

Beta-User

Es ist bei unless nicht anders wie bei if (nur eben genau invertiert): "Wahr" bzw. "Falsch" sind boolsche Werte, es wird genau die "0" (eigentlich als boolscher Wert, also ohne Anführungszeichen) als "Falsch" gewertet, der Vergleich findet implizit und direkt statt ;) .
Anders gesagt: die Anweisung wird bei unless ausgeführt, wenn die Bedingung FALSCH ist, eine Berechnung, ein Vergleich, eine Funktion oder was auch immer eine 0 liefert.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Hallo,

muß mal wieder. Drucke ja selten die Einkaufsliste, glaub heute das erste mal seit meinem letzten Beitrag hier. Keines der letzten Beispiele schreibt mir noch die hinzugefügten Werten in das Textfile im /tmp Ordner. Kann jetzt auch nicht sagen ob ich danach mal ein update gemacht habe.

Generell funktionierts aber noch eine leere Textdatei zu erstellen aus der Befehlszeile mit:

{FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" })}


1. Wert der Liste hinzugefügt mit:
Echo:list_SHOPPING_ITEM:.* { unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}


2018.07.18 20:23:34 5: Triggering not_Echo_Einkaufsliste
2018.07.18 20:23:34 4: not_Echo_Einkaufsliste exec { if (!length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt",ForceType=>"file", split(/\,/,$EVTPART1))}}



2. Wert der Liste hinzugefügt mit:
Echo:list_SHOPPING_ITEM:.* { if (!length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}}


2018.07.18 20:25:35 5: Triggering not_Echo_Einkaufsliste
2018.07.18 20:25:35 4: not_Echo_Einkaufsliste exec { unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite(FileName=>"/tmp/einkaufsliste.txt",ForceType=>"file", split(/\,/,$EVTPART1))}}
2018.07.18 20:25:35 3: not_Echo_Einkaufsliste return value: 9



3. Wert der Lioste hinzugefügt mit:
Echo:list_SHOPPING_ITEM:.* { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "")))}


2018.07.18 20:28:35 5: Triggering not_Echo_Einkaufsliste
2018.07.18 20:28:35 4: not_Echo_Einkaufsliste exec { FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "")))}
2018.07.18 20:28:35 3: not_Echo_Einkaufsliste return value: 15


Jemand eine Idee was sich geändert haben könnte ?

TomLee

Etwas weiter getestet.

Den Teil mit der Prüfung ob der Inhalt leer ist mal weggelassen:

Echo:list_SHOPPING_ITEM:.* {FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}

das Log dazu:

2018.07.19 13:23:13 5: Triggering not_Echo_Einkaufsliste 2018.07.19 13:23:13 4: not_Echo_Einkaufsliste exec {FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1))}

und es wird keine Textdatei erstellt.


weiter getestet mit zusätzlichen geschweiften Klammern:

Echo:list_SHOPPING_ITEM:.* {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)})}

das Log dazu (ganz neu die Warnung bei einer ungeraden Anzahl der Werteliste)

2018.07.19 13:17:12 5: Triggering not_Echo_Einkaufsliste
2018.07.19 13:17:12 4: not_Echo_Einkaufsliste exec {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)})}
2018.07.19 13:17:12 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 1737812) line 1.
2018.07.19 13:17:12 3: eval: my $NAME='Echo';my $TYPE='echodevice';my $EVTPART0='list_SHOPPING_ITEM:';my $EVTPART1='baileys,lampe,topfen,flasche,lampe,bett,fernseher,blumen,irgendwas';my $SELF='not_Echo_Einkaufsliste';my $EVENT='list_SHOPPING_ITEM: baileys,lampe,topfen,flasche,lampe,bett,fernseher,blumen,irgendwas';{FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)})}


Es wird ein Textfile erstellt, aber ohne Inhalt.


Und das ganze nochmal beim hinzufügen eines 'geraden' Wertes:

Echo:list_SHOPPING_ITEM:.* {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)})}

2018.07.19 13:18:12 5: Triggering not_Echo_Einkaufsliste
2018.07.19 13:18:12 4: not_Echo_Einkaufsliste exec {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)})}


Das zuvor erstellte Textfile hatte ich gelöscht und wird auch hier wieder leer erstellt.

Beta-User

Wenn ich die DevelopmentModuleAPI im Wiki richtig verstehe, stimmt da was mit deinen Klammern nicht:

Zitat$error = FileWrite($param, @content);
Dabei soll in der Form, wie du das verwendest $param so aussehen:
Zitat{ FileName => $filename, ForceType => "file", NoNL => 0 }

Ergibt m.E. insgesamt:
Echo:list_SHOPPING_ITEM:.* {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", NoNL => 0 }, split(/\,/,$EVTPART1))}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Ja, danke klappt soweit.

Aber mit Prüfung, z.B. mit unless , wieder nicht mehr :

Echo:list_SHOPPING_ITEM:.* { unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) { FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file"}, split(/\,/,$EVTPART1))}}

2018.07.19 14:18:24 5: Triggering not_Echo_Einkaufsliste
2018.07.19 14:18:24 4: not_Echo_Einkaufsliste exec { unless (length(ReadingsVal("Echo", "list_SHOPPING_ITEM", ""))) {FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file"}, split(/\,/,$EVTPART1))}}
2018.07.19 14:18:24 3: not_Echo_Einkaufsliste return value: 14


Und es wird kein Textfile erstellt.