[gelöst] Frage zu Ersatzwert von Readingsval

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

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

kann mir wer sagen weshalb ich nicht "Error" als Ausgabe bekomme wenn das Reading list_SHOPPING_ITEM keinen Inhalt hat und ich folgendes in die Befehlszeile eingebe:

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

Gruß

Thomas

marvin78

Was bekommst du denn? Hat es wirklich keinen Inhalt oder wird nur keiner dargestellt? Ist der Inhalt vielleicht ein Leerstring.

Wenn es keinen Inhalt hat, ist es trotzdem vorhanden. Den Fallback-Wert erhälst du nur, wenn das Reading nicht defined ist. Leer ist auch ein Wert.

Demnächst bitte etwas mehr Infos posten.

rabehd

Zitatwenn das Reading list_SHOPPING_ITEM keinen Inhalt hat
Das geht nicht, siehe marvin78
Auch funktionierende Lösungen kann man hinterfragen.

TomLee

Ok, dann andersherum.

Kann ich in einem notify mit if auf einen Leerstring prüfen, siehe hier.

TomLee

Ok, nochmal nachgelesen und das was ich schon versucht habe ist auf einen Leerstring zu prüfen. Klappt aber nicht.

Otto123

Mach mal ein list echo in dem Zustand wo Du der Meinung bist, es ist ein Leerstring im reading: list_SHOPPING_ITEM

Gruß 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

#6
{length(ReadingsVal("Echo", "list_SHOPPING_ITEM", "Error")} wäre vielleicht noch interessant ;) ?
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

Internals:
   CHANGED   
   DEF        crypt:305b09085443185550170c4e405c0f79111e0d5a095e0d5d165XXX crypt:3c5e071147594e0XXX
   IODev     
   NAME       Echo
   NR         366
   NTFY_ORDER 50-Echo
   STATE      connected
   TYPE       echodevice
   model      ACCOUNT
   OLDREADINGS:
   READINGS:
     2018-06-15 06:54:43   2FACode         not used
     2018-06-15 06:54:44   BrowserLanguage de-DE
     2018-06-15 06:54:44   BrowserUserAgent D0mNJGT328HQPD4ufLXXX
     2018-06-15 06:54:45   COOKIE_STATE    OK
     2018-06-15 06:54:44   COOKIE_TYPE     NEW
     2018-05-14 21:44:33   alarm_count     0
     2018-06-14 17:05:31   autocreate_devices stop
     2018-03-20 00:14:23   aws_outputformat mp3
     2018-03-20 11:29:13   aws_pythonversion 0.0.3
     2018-06-15 16:52:28   list_SHOPPING_ITEM
     2018-06-12 09:49:34   list_TASK       o._k._kündigen,waschbeckenarmatur
     2018-05-14 21:44:33   musicalarm_count 0
     2018-03-19 23:45:34   pom_ipaddress   192.168.188.26
     2018-05-14 21:44:33   reminder_count  0
     2018-06-15 06:54:33   state           connected
     2018-05-14 21:44:33   timer_count     0
     2018-05-14 21:44:33   timer_id        -
     2018-05-14 21:44:33   timer_remainingtime 0
     2018-06-15 17:02:04   tou             o. k. kündigen,waschbeckenarmatur
     2018-03-19 23:45:18   tts_ipaddress   192.168.188.26
     2018-06-14 17:05:31   version         0.0.37
   helper:
     DEVICETYPE A15ERDAKK5HXXX
     RUNLOGIN   0
     RUNNING_REQUEST 0
     SERVER     layla.amazon.de
     TWOFA     
     VERSION   
     CMD_QUEUE:
     ITEMS:
       SHOPPING_ITEM:
         butter     ABLFB4UU38CN0#6d85cd25-2a19-4917-8d5a-c0d79ed4d4da
       TASK:
         o._k._kündigen ABLFB4UU38CN0#361b41ac-9775-471b-b877-0e05ef7f5b46
         waschbeckenarmatur ABLFB4UU38XXX#c17dcb06-8850-4080-bcb5-007a14d4d68b
     notifications:
       _14dee0df9b234fc683e1978550a8170c:
       _G090L90964221XXX:
       _G090L90964430XXX:
       _account:
Attributes:
   TTS_normalize 5
   browser_language de-DE
   browser_useragent_random 1
   comment    <a href="https://mwinkler.jimdo.com/smarthome/eigene-module/echodevice/"></a>
   event-on-change-reading .*
   icon       echo
   room       Echo
   server     layla.amazon.de
   userReadings tou {my $sl = ReadingsVal('Echo','list_TASK',''); $sl =~ tr/_/ /; return $sl;}
   verbose    0

TomLee

"length" hatte ich auch schon durch, versuchs aber später auch nochmal.

Otto123

ich bin der Meinung jetzt steht "" im Reading ... also eq "" müsste wahr ergeben.
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

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

ergibt jetzt wenigstens "0", ist ja jetzt wenigstens etwas.

@Otto

nicht nur jetzt, sondern dann schon die ganze Zeit, mit all meinen versuchen. Klappt ja aber nicht.

Ich möchte das Filewrite nicht ausgeführt wird wenn das Reading "" ist, also ne nicht eq.



Beta-User

Zitat von: TomLee am 15 Juni 2018, 17:55:29
{length(ReadingsVal("Echo","list_SHOPPING_ITEM","Error"))}
ergibt jetzt wenigstens "0", ist ja jetzt wenigstens etwas.
Dann mach das filewrite() nur, wenn da was drinsteht. Einfachste Variante von "Mach nur, wenn nicht" ist unless (), kann man genau wie if () bei Perl nach hinten nehmen. 
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

Danke. Werd ich später versuchen, jetzt ist keine Zeit.

TomLee

Habs. Danke dir.

Auch wenn ich mir mit der Syntax nicht sicher bin klappt's jetzt mit :

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

Beta-User

Da sind einige Fehler drin. Keine ; , Klammern und Syntax wie sonst if
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

Sry, aber hier bin ich etwas überfordert.

Hab mir im if-condition Wiki die Beispiele angeschaut, demnach sollte der unless Teil in zusätzliche geschweifte Klammern, dann bekomm ich aber einen Fehler am EOF.

Komma kann ich mir nur vorstellen das du das vor split meinst, lass ich das weg kommt ein zusätzlicher Fehler zw. split und der vorherigen geschweiften Klammer.

Die doppelten Semikolon kann man bei dem hier gezeigten Beispiel weglassen, ja, aber der Fehler am EOF bleibt:

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


Und wenn ich die } nach split ganz ans Ende verfrachte gibts wieder einen zusätzlichen Fehler.

Beta-User

Einmal auf die perl-Ebene wechseln sollte eigentlich genügen. Probier mal das:Echo:list_SHOPPING_ITEM:.* {FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) unless (length($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

Hi,

ändert nichts. Beim löschen des letzten Wertes kommt weiterhin:

2018.06.16 19:15:56 1: ERROR evaluating my $SELF='not_Echo_Einkaufsliste';my $NAME='Echo';my $EVTPART0='list_SHOPPING_ITEM:';my $TYPE='echodevice';my $EVENT='list_SHOPPING_ITEM: ';
{FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) unless (length($EVTPART1))}:
Global symbol "$EVTPART1" requires explicit package name at (eval 491209) line 1. Global symbol "$EVTPART1" requires explicit package name at (eval 491209) line 1.

Otto123

Hi,

der Fehler bedeutet doch, dass $EVTPART1 in dem Fall nicht existiert!?

Gruß 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

TomLee

Richtig, es funzt auch alles wie es soll. Die Meldung im Log möcht ich nur nicht haben, selbst verbose 0 hilft nicht.
Das man die Meldung vermeiden kann sehe ich ja an meinem Versuch

Otto123

Deinen Link verstehe ich nicht.

Du musst einfach vermeiden ein split(/\,/,$EVTPART1) zu machen wenn $EVTPART1 gar nicht existiert.

Gruß 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

TomLee

Sry Post 13 meinte ich.

ZitatDu musst einfach vermeiden ein split(/\,/,$EVTPART1) zu machen wenn $EVTPART1 gar nicht existiert.

Ok fux ich mich rein und teste.

TomLee

#22
ZitatDu musst einfach vermeiden ein split(/\,/,$EVTPART1) zu machen wenn $EVTPART1 gar nicht existiert.

Kurz mal nachgedacht, ist doch mehr oder weniger das was ich hier schon die ganze Zeit versuche, wenn EVTPART1 ne"0" (Wert vorhanden) dann mach was , sonst nix

Otto123

{Befehl unless(Bedingung)} falls das beim unless wie beim if ist :)


Gruß 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

TomLee

Wo wir wieder hier wären, wenn ich dich richtig verstehe. unless wird nicht beachtet.

Mit Meldung im Log siehe darauffolgender Post.

Otto123

gut die Idee mit unless war nicht von mir - sorry. Dann mach es doch mit if.

Wobei mir momentan nicht klar ist wie man die Existenz einer Variablen wirklich testet.
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

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

Das obige notify hab ich rein zu Testzwecken versucht um der Syntax des if Teils näher zu kommen.
Denke dieser ist auch richtig.
Hätte jetzt nicht alles passen und keine Meldung im Log auftauchen sollen ?

Es kommt eine Meldung und in dieser steht auch noch explizit das $EVTPART0 'list_SHOPPING_ITEM:' hätte sein sollen:

2018.06.16 23:44:16 1: ERROR evaluating my $EVENT='list_SHOPPING_ITEM: ';my $SELF='not_Echo_Einkaufsliste';my $NAME='Echo';my $EVTPART0='list_SHOPPING_ITEM:';my $TYPE='echodevice';
{ if ($EVTPART0 eq "list_SHOPPING_ITEM:"){FileWrite(FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", split(/\,/,$EVTPART1)) }}:
Global symbol "$EVTPART1" requires explicit package name at (eval 531998) line 1.


Krieg noch die Krise

Otto123

Moin,

nein passt nicht! Du testest ob eine Einkaufstüte da ist -> ok

Dann willst Du den Inhalt der Einkaufstüte aufteilen - leider ist diese komplett leer -> es gibt nichts aufzuteilen! Fehler: nichts da!

Du darfst nicht nur $EVTPART0 testen, du musst auch $EVTPART1 auf Inhalt testen.

Gruß 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

TomLee

#28
Hi,

hab diesen Beitrag aus 2012 gefunden:

Und folgendes mal probiert:

Echo:list_SHOPPING_ITEM:.* { if("$EVTPART1" ne "modeStarted: EVTPART1") { fhem("set EG_Echo_Kueche tts jetzt gehts")}}

Wird ein Wert der Einkaufsliste hinzugefügt wird die die tts ausgeführt, lösche ich die Einkaufsliste erfolgt keine tts, also wie gewollt.

Ersetze ich nun den Befehlsteil durch mein Filewrite:

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

wird trotzdem wieder das split beim löschen ausgeführt und es kommt zu der bekannten Meldung im Log.

TomLee

Kommando zurück.

Hatte es extra mehrmals getestet keine Ahnung was da schief ging.

Auch mit

Echo:list_SHOPPING_ITEM:.* { if("$EVTPART1" ne "modeStarted: EVTPART1") { fhem("set EG_Echo_Kueche tts jetzt gehts")}}

kommt es beim löschen zu der Meldung, aber eine tts erfolgt nicht, tts erfolgt nur wenn ein Wert vorhanden

2018.06.17 14:44:41 1: ERROR evaluating my $EVENT='list_SHOPPING_ITEM: ';my $TYPE='echodevice';my $EVTPART0='list_SHOPPING_ITEM:';my $NAME='Echo';my $SELF='not_Echo_Einkaufsliste';
{ if("$EVTPART1" ne "modeStarted: EVTPART1") { fhem("set EG_Echo_Kueche tts jetzt gehts")}} :
Global symbol "$EVTPART1" requires explicit package name at (eval 655873) line 1.

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.

Beta-User

Da es ja egal ist, wenn eventuell eine leere Liste erstellt wird, kannst du auch einfach eval() verwenden:
ZitatEcho:list_SHOPPING_ITEM:.* { eval ( FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file"}, 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

Mit einem Danke ist das gar nich mehr Wert zu schätzen. Klappt.

Es bleibt aber bei einem Logeintrag:

2018.07.19 16:05:50 1: PERL WARNING: Use of uninitialized value in eval "string" at (eval 1757758) line 1.
2018.07.19 16:05:50 3: eval: my $NAME='Echo';my $TYPE='echodevice';my $EVTPART0='list_SHOPPING_ITEM:';my $EVTPART1='allianz,fernbedienung,eis,eis,baileys,blumen';my $SELF='not_Echo_Einkaufsliste';my $EVENT='list_SHOPPING_ITEM: allianz,fernbedienung,eis,eis,baileys,blumen';{ eval ( FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file"}, split(/\,/,$EVTPART1)) )}


Mir ging's ja zwischenzeitlich such darum keine Logeinträge zu haben.
Kann auch auf verbose 0 stellen !?.

Beta-User

mach doch das ", NoNL => 0" auch noch rein; ich kann im Moment nicht sagen, an es daran hängt, aber eigentlich will fileWrite in der von dir gewählten Form auch diese Angabe...

Ansonsten sollte man Logeinträge vermeiden, nicht unterdrücken ;) .
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

Bleibt dabei.

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


2018.07.19 17:31:55 1: PERL WARNING: Use of uninitialized value in eval "string" at (eval 1768537) line 1.
2018.07.19 17:31:55 3: eval: my $SELF='not_Echo_Einkaufsliste';my $EVENT='list_SHOPPING_ITEM: eis';my $EVTPART1='eis';my $EVTPART0='list_SHOPPING_ITEM:';my $TYPE='echodevice';my $NAME='Echo';{ eval ( FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", NoNL => 0 }, split(/\,/,$EVTPART1)) )}

Beta-User

...dann habe ich erst mal keine weitere Idee, wie man die Meldung wegbekommt...
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