ich stelle mich gerade zu doof an.
in einen Shell Befehl soll ein Rückgabewert aus einer Perl Funktion eingebaut werden.
müsste sozusagen so aussehen:
"mosquitto_pub -t /System/sunrise -m "{ sunrise_abs() }" -u user -P pass -p 1883"
das funktioniert allerdings nicht, denn { sunrise_abs() } wird nicht ausgeführt, was ist da zu tun?
Danke euch
Wo wird der Shell Befehl ausgeführt? Innerhalb von FHEM kann die Funktion so nicht aufgelöst werden, da sie als Zeichenkette interpretiert wird. Du müsstest in etwa so vorgehen: "Zeichenkette" . Funktion . "Zeichenkette"
Grüße Jörg
Gesendet von iPhone mit Tapatalk
dann würde der Befehl "mosquitto_pub -t /System/sunrise -m ".{sunrise_abs()}." -u user -P pass -p 1883" so aussehen.
aber in dem topic steht dann trotzdem nur: .{sunrise_abs()}. :(
Hi,
ich glaube, etwas mehr Kontext würde nicht schaden. Ist das ganze in einem notify oder einem at? ...oder einfach nur so als Kommando eingegeben oder...?
Gruß,
Thorsten
gerne doch, ja es steckt in einem at, aber das spielt ja keine Rolle, auch in der Kommandozeile eingegeben, erzeugt es das Gleiche
Also wenn überhaupt dann klappt es wohl eher nur wenn du den Rückgabewert in eine Variable einliest und deiner Syntax zum Scriptaufruf den Inhalt der Variablen übergibst.
Zitat von: Rothammel am 01 Februar 2017, 22:21:11
gerne doch, ja es steckt in einem at, aber das spielt ja keine Rolle, auch in der Kommandozeile eingegeben, erzeugt es das Gleiche
Also wenn ich das hier...
"mosquitto_pub -t /System/sunrise -m "{ sunrise_abs() }" -u user -P pass -p 1883"
...in meine FHEM-Kommandozeile eingebe, dann passiert genau gar nichts. Du könntest hier ehrlich noch ein bisschen mehr Kontext liefern.
Vielleicht meinst Du ja sowas wie...
{ system("mosquitto_pub -t /System/sunrise -m "{ sunrise_abs() }" -u user -P pass -p 1883") }
...aber das geht natürlich auch nicht.
Dem hier würde ich eine Chance geben:
{ system("mosquitto_pub -t /System/sunrise -m ".sunrise_abs()." -u user -P pass -p 1883") }
...zumindest macht das was ansatzweise sinnvolles auf der Kommandozeile.
Gruß,
Thorsten
Zitat von: CoolTux am 01 Februar 2017, 22:25:23
Also wenn überhaupt dann klappt es wohl eher nur wenn du den Rückgabewert in eine Variable einliest und deiner Syntax zum Scriptaufruf den Inhalt der Variablen übergibst.
danke dir,
so etwa?
{ my $s = sunrise_abs() } ; "mosquitto_pub -t /System/sunrise -m "$s" -u user -P pass -p 1883"
der topic ist dann leer, so als hätte der string $s keinen Wert
Zitat von: Thorsten Pferdekaemper am 01 Februar 2017, 22:50:16
Also wenn ich das hier...
"mosquitto_pub -t /System/sunrise -m "{ sunrise_abs() }" -u user -P pass -p 1883"
...in meine FHEM-Kommandozeile eingebe, dann passiert genau gar nichts. Du könntest hier ehrlich noch ein bisschen mehr Kontext liefern.
Vielleicht meinst Du ja sowas wie...
{ system("mosquitto_pub -t /System/sunrise -m "{ sunrise_abs() }" -u user -P pass -p 1883") }
...aber das geht natürlich auch nicht.
Dem hier würde ich eine Chance geben:
{ system("mosquitto_pub -t /System/sunrise -m ".sunrise_abs()." -u user -P pass -p 1883") }
...zumindest macht das was ansatzweise sinnvolles auf der Kommandozeile.
Gruß,
Thorsten
so deine Zeilen liefern zwar Fehler zurück
nr.2
syntax error at (eval 172) line 1, near ""mosquitto_pub -t /System/sunrise -m "{ "
syntax error at (eval 172) line 1, near "" -u user -P pass -p 1883") "
nr.3
-1
aber nr.3 funktioniert :o nun gut ich teste da morgen noch mal weiter.
danke an alle für eure Mühe und Zeit - es besteht Hoffnung :D
Zitat von: Rothammel am 01 Februar 2017, 22:55:21
so deine Zeilen liefern nur Fehler zurück
Bei mir nicht. Du hast halt immer noch nicht den Kontext geliefert. Das, was Du da ansonsten versuchst (angeblich) in die FHEM-Kommandozeile einzugeben, ist auf jeden Fall falsch.
Gib doch mal Deinen vollständigen Kommando-String und sag vielleicht auch mal, welche Fehlermeldungen.
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 01 Februar 2017, 22:58:09
Bei mir nicht. Du hast halt immer noch nicht den Kontext geliefert. Das, was Du da ansonsten versuchst (angeblich) in die FHEM-Kommandozeile einzugeben, ist auf jeden Fall falsch.
Gib doch mal Deinen vollständigen Kommando-String und sag vielleicht auch mal, welche Fehlermeldungen.
Gruß,
Thorsten
siehe bitte edit vom vorpost
z.B. der hier funktioniert:
"mosquitto_pub -t /System/Zeit -m $(date +'%H%M%S') -u user -P pass -p 1883"
gesamt at:
define at_Zeit_senden at +*00:00:10 "mosquitto_pub -t /System/Zeit -m $(date +'%H%M%S') -u user -P pass -p 1883"
nun gut, erstmal ist Feierabend, morgen ist auch noch ein Tag
Zitat von: Rothammel am 01 Februar 2017, 23:02:08
siehe bitte edit vom vorpost
Nee, der ist totaler Humbug.
Zitat
z.B. der hier funktioniert:
"mosquitto_pub -t /System/Zeit -m $(date +'%H%M%S') -u user -P pass -p 1883"
Vielleicht auf der Linux-Kommandozeile, aber deshalb noch lange nicht in FHEM.
Zitat
gesamt at:
define at_Zeit_senden at +*00:00:10 "mosquitto_pub -t /System/Zeit -m $(date +'%H%M%S') -u user -P pass -p 1883"
Du mischst da FHEM-Kommandos mit Linux-Kommandozeile. Das geht nicht. So könnte es gehen: Du musst erstmal in Perl wechseln ({}) und dann in die Linux-Kommandozeile (system):
define at_Zeit_senden at +*00:00:10 { system("mosquitto_pub -t /System/sunrise -m ".sunrise_abs()." -u user -P pass -p 1883") }
Gruß,
Thorsten
na klar funktioniert der Befehl, ich leg dir ans Herz mal in die Referenz zu guggen, dort steht:
Es gibt drei Arten von Befehlen: "fhem" Befehle (werden in diesem Dokument beschrieben), SHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden) und PERL-Ausdrücken (von geschwungenen Klammern {} eingeschlossen)
also sind meine Zeilen, oh kein Wunder, shell befehle, in diese lassen sich aber wohl keine Perl Funktionen einbetten, daher ist es wohl besser den shell befehl aus perl zu starten
Zitat von: Rothammel am 02 Februar 2017, 06:59:09
na klar funktioniert der Befehl, ich leg dir ans Herz mal in die Referenz zu guggen, dort steht:
Es gibt drei Arten von Befehlen: "fhem" Befehle (werden in diesem Dokument beschrieben), SHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden) und PERL-Ausdrücken (von geschwungenen Klammern {} eingeschlossen)
also sind meine Zeilen, oh kein Wunder, shell befehle, in diese lassen sich aber wohl keine Perl Funktionen einbetten, daher ist es wohl besser den shell befehl aus perl zu starten
Vielleicht reden wir auch aneinander vorbei.
-m $(date +'%H%M%S')
Das hier ist ein Linuxbefehl. Das der aus FHEM heraus funktioniert ist klar, weil die Variablen erst im Linuxbereich aufgelöst werden.
sunrise_abs()
Das hier ist eine FHEM Perlroutine. Das Ergebnis dieser Routine möchtest Du mit in dein Linux Befehlsaufruf eingeben. Ob das so einfach geht kann ich nicht sagen. Ich denke wenn dann nur als system() Befehl. FHEM kann Systembefehle nonBlocking ausführen wenn man sie einfach als FHEM Befehl in doppelte Hochkommata setzt. Aber ob man da eine Variable mitgeben kann weiß ich nicht.
{ system("mosquitto_pub -t /System/sunrise -m ".sunrise_abs()." -u user -P pass -p 1883") }
Das hier könnte also dem zu Folge Funktion haben.
Und vielleicht solltest du nicht ganz so schnell Gegensprechen. Die Referenz sagt das was Du zitiert hat, sie sagt aber nichts über den Umgang mit FHEM Perlfunktion innerhalb eines Shellkommandos. Und genau das ist Dein Problem.
Zitat von: Rothammel am 02 Februar 2017, 06:59:09
na klar funktioniert der Befehl, ich leg dir ans Herz mal in die Referenz zu guggen, dort steht:
Es gibt drei Arten von Befehlen: "fhem" Befehle (werden in diesem Dokument beschrieben), SHELL-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden) und PERL-Ausdrücken (von geschwungenen Klammern {} eingeschlossen)
Ok, mea culpa. Dann war ich da tatsächlich auf dem falschen Dampfer.
Zitat
also sind meine Zeilen, oh kein Wunder, shell befehle, in diese lassen sich aber wohl keine Perl Funktionen einbetten, daher ist es wohl besser den shell befehl aus perl zu starten
Genau. Hast Du meine Variante mit "system" ausprobiert?
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 02 Februar 2017, 10:22:21
Ok, mea culpa. Dann war ich da tatsächlich auf dem falschen Dampfer.
Genau. Hast Du meine Variante mit "system" ausprobiert?
Gruß,
Thorsten
hab ich ausprobiert und die letzte Zeile code aus deinem Post funktioniert.
ich werde noch mal probieren ob der Aufruf mit & als nonblocking zu starten geht, dann bin ich mit der Lösung zufrieden. :)