Nach einem Tag Frust versuche ich es mal mit einer Frage.
Ich möchte eigentlich nur einfach einen Systemaufruf mit FHEM-Befehlen in einem notify kombinieren. Hab zig Varianten durch, aber es klappt einfach nicht. Das Ergebnis des Systemaufrufs ist irrelevant(könnte also in einem eigenen Prozess laufen). Vielleicht hat einer der Experten einen Tipp.
Das
notify ... "curl --output /opt/fhem/log/Bilder/mycallrss.jpg http://192.168.178.47:8083/fhem/www/images/default/icoBlitz.png"
klappt problemlos. Um es nun aber mit einem FHEM-Befehl(z.B. set.....) zu kombinieren hab ich tausende Varianten(Geschweifte, runde Klammern; 1-Mehrere Semikolon;exec(Absturz) u. system(FHEM-Hänger mit blockierendem curl-Prozess) ausprobiert.
Oder etwas anders beschrieben: der Systemaufruf in "" klappt, während mit system oder exec scheinbar ein Berechtigungsproblem auftritt
curl: (7) couldn't connect to host
auf den http-Link zuzugreifen :-\ Lt. Prozessliste wird curl aber doch auch mit dem user fhem ausgeführt :-\ edit:Evtl. ein CSRF-Token-Thema ?eher nicht, mit csrfToken=none das selbe Verhalten. allowed ist für den Port auch nicht gesetzt !
Hat einer ne Idee, wie ich das kombiniert kriege ? Geht das in einer Perl-Funktion ? Mit einem Skript für den Systemaufruf ?
Gucke mir jetzt mal HTTPutils an....
Grüße Markus
Hallo Markus,
so ganz generell der Tipp: packe Shell Befehle mit einer Länge größer 3 in ein Script und führe das Script aus. Das ist meist Stressfreier.
Was Du jetzt genau mit dem set machen willst wird mir nicht klar. Der curl Befehl holt ein Bild aus FHEM und speichert es?
Oder willst Du (so lese ich deinen Frage) sowas machen set Lamp on;"/opt/fhem/script.sh"
Gruß Otto
Hi Otto,
ZitatDer curl Befehl holt ein Bild aus FHEM und speichert es?
Richtig :D Und das funktioniert dann auch, wenn ich es als alleinige "Anweisung" und ohne system/exec ins notify packe.
Ich möchte aber zusätzlich im selben notify einen simplen set-Befehl absetzen, also z.B. set Lampe on. Aber jetzt kommen sich FHEM-Welt und OS-Welt in die Quere.
Ich dachte dann gehe ich also auf Perl-Ebene, z.B. so
notify....{system("curl --output /opt/fhem/log/Bilder/mycallrss.jpg http://192.168.178.47:8083/fhem/www/images/default/icoBlitz.png");fhem("set Lampe on")}
aber das geht eben in die Hose(Blocking; u. bei exec anstatt system = Absturz) :'( Und sämtliche andere Kombis, die ich probiert habe, gehen auch nicht. :'(
ZitatTipp: packe Shell Befehle mit einer Länge größer 3 in ein Script und führe das Script aus. Das ist meist Stressfreier.
Daran dachte ich auch. Nur, das Skript(wo ich nur den Einzeiler für's curl reinschreiben würde) wird ja auch wieder über das System aufgerufen, also so
notify....{system("curl_script.sh");fhem("set Lampe on")}
und wieso sollte das das Problem lösen ?
Ich kapier halt nicht, warum ein system/exec-Aufruf nicht funktioniert u. scheue mich vorm Ausprobieren gleiches in einer Perl-Sub oder einem Skript auszuprobieren(geht mir nicht soooo einfach von der Hand), weil ich das selbe negative Erlebnis erwarte :'( Wieso kann system() nicht auf FHEM zugreifen ? Was muss/kann man mit auf den Weg geben, dass es geht ? (sudo hatte ich natürlich auch schon probiert).
(OT)
Hintergrund ist übrigens, dass ein per RSS-Modul erzeugtes Bild(Anrufername, Telefonnr. ....) in den Pfad des Media-Servers kopiert wird, welches dann per FHEM und DLNA auf dem TV angezeigt wird. Die Komplexität wollte ich aber in meiner Fragestellung rausnehmen ;)
(OT)
Grüße Markus
Hi,
also wie schon gesagt: sowas "cat willi.txt";set Lamp on
geht einfach in der Kommandozeile. Geht genauso auch im notify (getestet):
defmod n_Test notify n_Test set Lamp off;;"cat willi.txt"
In /opt/fhem/willi.txt steht einfach echo Test
Das notify schaltet die Lampe und schreibt echo Test ins Logfile 8)
Gruß Otto
Ich habe das mal noch in Deine Richtung getrieben:
Erzeuge Script
{system ("echo 'curl --output /opt/fhem/mycallrss.jpg' http://192.168.178.83:8083/fhem/rss/myrss.jpg> HoleBild.sh")}
Führe Script aus (Kommandozeile oder notify wie oben):
"bash HoleBild.sh"
Funktioniert, es legt mir das aktuelle rss Bild in /opt/fhem/mycallrss.jpg ab 8)
Fehlt noch was?
Beachte die unterschiedliche Rückgabe: der system("") Aufruf schreibt eine -1 als Quittung in den Browser und nichts ins Log.
"bash HoleScript.sh" schreibt "nichts" als Quittung in den Browser, der macht ein Refresh (ist wahrscheinlich nicht richtig erklärt) aber die Ausgabe des Scripts (stdout) landet im Log.
Gruß Otto
Hi Otto,
danke für Deine Unterstützung. Hat zwar nicht direkt geholfen, aber indirekt. ;) Über das Skript ist mir dann aufgefallen, dass es ein Berechtigungsproblem und ein Zugriffsproblem ist, was zum Blockieren bei Nutzung von system() führte.
Und noch eins ist jetzt klar. Mein Notify ist ja etwas komplizierter:
Das geht nichtnotify ..."echo 'test'";{ fhem("set Lampe an");my $num = ReadingsVal("FritzBox","internal_number",99);if ( $num eq "654321" || $num eq "123456" ) { fhem("set Steckdose an") } }
obwohl das
notify ...{ fhem("set Lampe an");my $num = ReadingsVal("FritzBox","internal_number",99);if ( $num eq "654321" || $num eq "123456" ) { fhem("set Steckdose an") } }
funktioniert. Unterschied ist nur der vorne angestellte Systembefehl.
Durch den Systembefehl wird aber eine Verdopplung jedes Semikolons erforderlich, also so
notify ..."echo 'test'";{ fhem("set Lampe an");;my $num = ReadingsVal("FritzBox","internal_number",99);;if ( $num eq "654321" || $num eq "123456" ) { fhem("set Steckdose an") } }
:o
Wäre eigentlich was für den Syntaxcheck, oder ?
Irgendwann treiben mich diese Feinheiten in den Wahnsinn....... ::)
Grüße Markus
Das letzere habe ich nicht ganz verstanden, ich bin mir nicht so sicher: redest Du von der DEF oder vom define Befehl?
Aber wichtig zu wissen ist auf alle Fälle:
system() Aufrufe sind an sich blockierend - wenn man das nicht will muss man diese mit einem & am Ende in den Hintergrund schicken! (normaler Shell Syntax)
Der Aufruf "shell Befehl" ist nicht blockierend bzw. passiert im Hintergrund -> https://fhem.de/commandref_DE.html#command
Gruß Otto
DEF
Zitatwenn man das nicht will muss man diese mit einem & am Ende in den Hintergrund schicken! (normaler Shell Syntax)
Aha, gut zu wissen. Dann wären mir wohl irgendwann ne Menge curl-Prozesse aufgefallen, aber wenigstens kein Systemhänger. :D
Zitathttps://fhem.de/commandref_DE.html#command
Sorry, aber das versteht kein Mensch, der nicht schon weiß, was da steht. ???
Möglicherweise ist das ja der Hinweis
ZitatFür jede weitere Indirektion muss man die Strichpunkte verdoppeln.
aber ich kenne nur Indiskretion ;D
Grüße Markus
Moin,
ZitatSHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden)
...
SHELL-Kommandos werden im Hintergrund ausgeführt,
Erscheint für mich relativ eindeutig.
Indirektion ist ein typischer Fachbegriff aus der Informatik - da findet man einiges an Erklärungen :D
Gruß Otto