Hallo
irgendwie bekomme ich es nicht hin.
habe mit
define ip dummy
set ip 192.168.0.10
eine globale variable erstellt.
diese will ich an ein shell script übergeben.
defmod Rlctech_r1on notify Rlctech:r1on { system "echo -e '\xA0\x01\x01\xA2' | nc -q 1 ".ReadingsVal("ip","state","")." 8080" }
geht aber irgendwie nicht.
wie kann ich denn die dummy ip auslesen?
habe auch Value(ip) probiert. ohne erfolg.
Danke für die Hilfe
sollte (auf einen schnellen Blick) eigentlich funktionieren... was wird denn übergeben? Sagt das Log etwas?
Hallo
@KernSani, dieses Log ist für einen anderen Ansatz den ich versucht habe.
der code dazu ist:
defmod Rlctech_r1on_t1 notify Rlctech:r1on_t1 { system("my $a = ReadingsVal('relay_lctech_2ch_ip','state','')");; system ("set test_var $a") }
das log sagt
2018.02.06 07:38:55.654 4 : Rlctech_r1on_t1 exec { system("my $a = ReadingsVal('relay_lctech_2ch_ip','state','')");; system ("set test_var $a") }
2018.02.06 07:38:55.655 1 : PERL WARNING: Use of uninitialized value $a in concatenation (.) or string at (eval 1491556) line 1.
verstehe aber nicht warum das so ist?
Danke
@KernSani: Nachtrag: hier noch das log:
2018.02.06 08:47:37.368 4 : Rlctech_r1on exec { system "echo -e '\xA0\x01\x01\xA2' | nc -q 1 ".ReadingsVal("ip","state","")." 8080" }
2018.02.06 08:47:37.377 3 : Rlctech_r1on return value: -1
zu dem post von oben
defmod Rlctech_r1on notify Rlctech:r1on { system "echo -e '\xA0\x01\x01\xA2' | nc -q 1 ".ReadingsVal("ip","state","")." 8080" }
Bin jetzt nicht der Experte, aber mal in den Raum gefragt: Ist der ".". vor ReadingsVal so O.K.?
Zitat von: Wernieman am 06 Februar 2018, 08:04:29
Bin jetzt nicht der Experte, aber mal in den Raum gefragt: Ist der ".". vor ReadingsVal so O.K.?
Hallo, denke schon
normalerweise
konkatinieren mit . in einem string dann ".xxx." oder ?
Hi,
Zitatverstehe aber nicht warum das so ist?
damit verschwindest Du doch aus Perl ins system. Und der fhem Aufruf macht mit system auch keinen Sinn.
{ system("my $a = ReadingsVal('relay_lctech_2ch_ip','state','')");; system ("set test_var $a") }
So hier würde ich das ansetzen:
{my $a = ReadingsVal('relay_lctech_2ch_ip','state','') ;; fhem("set test_var $a")}
Nicht getestet nur überlegt.
Zu deinem eigentlichen Problem, ich sage es immer wieder, mach ein Script und übergib die Werte dorthin.
Gruß Otto
Zu Deinem ursprünglichem Code
Das hier { my $val = ReadingsVal("ip","state","") ;; system ("echo -e '\xA0\x01\x01\xA2' | nc -q 1 $val 8080") }
könnte doch eigentlich gehen. Ansatzweise bezüglich $val getestet. :D
Allerdings im Zweifelsfall blockierend. Wenn Du ein Script machst und das mit "bash Script.sh" aufrufst wird es im Hintergrund ausgeführt.
Gruß Otto
Hallo Otto,
danke für die Hilfe.
ja denke mit scripten ist das einfacher, habe es aber auch nicht geschafft eine globale variable an ein script zu übergeben?
Bin total durcheinander mit den Ebenen.
{ system " /opt/fhem/relay_lctech.sh Value(relay_lctech_action)" }
geht ja nicht und mit Readingsval auch nicht .
also habe das mal so angepasst:
{my $action = ReadingsVal("relay_lctech_action","state","") ;;system (" /opt/fhem/relay_lctech.sh $action") }
passt aber nicht . Log sagt : return -1
Jetzt mal langsam, mein Beispiel aus #6 geht nicht?
Zitat von: Otto123 am 06 Februar 2018, 18:50:40
Jetzt mal langsam, mein Beispiel aus #6 geht nicht?
denke es geht nicht.
siehe hier, das ist doch analog implementiert, oder? :
{my $action = ReadingsVal("relay_lctech_action","state","") ;;system (" /opt/fhem/relay_lctech.sh $action") }
und das liefert return -1
Hallo,
system() gibt doch nur zurück, ob die Ausführung funktioniert hat == 0 oder nicht == (-1). Will man das Ergebnis der Ausführung muss man qx() nehmen.
Warum nun die Ausführung nicht funktioniert hat ist ein anderes Thema.
Grüße Jörg
Zitat von: JoWiemann am 06 Februar 2018, 19:05:45
Hallo,
system() gibt doch nur zurück, ob die Ausführung funktioniert hat == 0 oder nicht == (-1). Will man das Ergebnis der Ausführung muss man qx() nehmen.
Grüße Jörg
Hallo Jörg,
der system() befehl funktioniert wenn ich die variable fix übergebe, also ohne variable
{ system " /opt/fhem/relay_lctech.sh relay,0,0" }
in der Variable
setstate relay_lctech_action relay,1,1
ist doch so korrekt, oder?
Ja, aber was möchtest Du als Rückgabe. Das Ergebnis von system() oder das Ergebnis von relay_lctech.sh?
{my $action = ReadingsVal("relay_lctech_action","state",""); system("/opt/fhem/relay_lctech.sh $action") if($action ne "");}
Gib Dir das Ergebnis von system()
{my $action = ReadingsVal("relay_lctech_action","state",""); qx(/opt/fhem/relay_lctech.sh . $action) if($action ne ""); }
Gib Dir das Ergebnis von relay_lctech.sh
Grüße Jörg
Hallo Jörg,
ich benötige keine Rückgabe.
habe aber gesehen, das du die Syntax anders hast
....qx(relay_lctech.sh . $action)....
ich hatte:
{my $action = ReadingsVal("relay_lctech_action","state","") ;;system (" /opt/fhem/relay_lctech.sh $action") }
und du:
{my $action = ReadingsVal("relay_lctech_action","state","") ;;system (" /opt/fhem/relay_lctech.sh" . $action) }
also konkateniert ausserhalb der ".
ich passe das mal an.
Ja, war aber falsch, da system() den kompletten Befehl in "" erwartet. Häng doch mal bitte das if..., siehe korrigierten Post, mit hinten dran. Dann wird system() bur ausgeführt, wenn ein Wert durch ReadingsVal übergeben wird.
Grüße Jörg
Zitat von: JoWiemann am 06 Februar 2018, 19:54:27
Ja, war aber falsch, da system() den kompletten Befehl in "" erwartet. Häng doch mal bitte das if..., siehe korrigierten Post, mit hinten dran. Dann wird system() bur ausgeführt, wenn ein Wert durch ReadingsVal übergeben wird.
Hi Jörg,
nun mit dem if, aber keine Änderung, das script wird nicht ausgeführt.
also scheint die Variable leer zu sein, ....komisch
LCR1_on_script_RV exec {my $action = ReadingsVal("relay_lctech_action","state","") ;;;;qx (/opt/fhem/relay_lctech.sh $action) if($action ne "");; }
bzw mit system:
defmod LCR1_on_script_RV_sys notify test_script:lct_r1_on_RV_sys {my $action = ReadingsVal("relay_lctech_action","state","") ;;;;system ("/opt/fhem/relay_lctech.sh $action") if($action ne "");; }
kommt kein Log eintrag...
...das lag an der verbose einstellung...
im log kommt: LCR1_on_script_RV_sys exec {my $action = ReadingsVal("relay_lctech_action","state","") ;;;;system ("/opt/fhem/relay_lctech.sh $action") if($action ne "");; }
aber keine aktion.
nochmal zur sicherhaeit: das geht:
defmod Rlctech_r2off_esp notify Rlctech:r2_off_esp { system " /opt/fhem/relay_lctech.sh relay,1,0" }
...uff
habe was gefunden:
state war noch leer....nur STATE war gefüllt.
also die System Variante ging , qx nochmal checken: geht auch !!! geprüft
obwohl ich den Eintrag hatte:
setstate relay_lctech_action relay,1,1
dieser hat den Wert state aber nicht gefüllt.
erst über das GUI mit
setstate relay_lctech_action 2018-02-06 20:32:18 state relay,1,1
Danke für die Hilfe an alle.
Zitat von: JoWiemann am 06 Februar 2018, 19:05:45
system() gibt doch nur zurück, ob die Ausführung funktioniert hat == 0 oder nicht == (-1). Will man das Ergebnis der Ausführung muss man qx() nehmen.
Ich bin mir nicht sicher, aber ich glaube bei {system()} kommt immer -1 zurück. Völlig egal ob der Befehl in () funktioniert oder nicht. Also zumindest hab ich das mit verschiedenen Inhalten probiert. Laut Beschreibung in Perl Doc ist das nicht so.
stdout landet aber im Logfile, nicht im Browser.
Aber ein Beispiel
echo 'echo Test' > willi.txt
Im Terminal liefert das keinen Fehler und funktioniert.
{system ("echo 'echo Test' > willi.txt")}
In der Kommanozeile von FHEM liefert -1 zurück und keinen Eintrag im Logfile. Der Befehl wird ordentlich ausgeführt. Die Datei genauso geschrieben wie im Terminal.
Gruß Otto