FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mtk am 18 Oktober 2016, 17:42:05

Titel: Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 18 Oktober 2016, 17:42:05
Ich möchte gerne im Wiki beschrieben http://www.fhemwiki.de/wiki/Weckautomation (http://www.fhemwiki.de/wiki/Weckautomation) eine Weckautomation realisieren, die u.a. auch ein Shellskript aufruft, das mir die Uhrzeit auf einem Raspi ansagt. Das Skript funktioniert per Commandline auf dem FHEM Server:

ssh hifi.daheim /aio/sounds/picowave_hifi  "Guten Morgen, es ist $(date +%k:%M)"

aber ich schaffe es irgenwie nicht, das Skript auch aus dem Makro heraus aufzurufen.

Bevor die Frage auftaucht, dabei möchte ich nicht unbedingt eine FHEM Instanz auf dem Raspi installieren müssen, nur um die TTS Funktion nutzen zu können. Statt dessen möchte ich pico2wave lieber direkt aufrufen. Leider bin ich mit FHEM und der Syntax noch nicht so vertraut ...



# Licht:
fhem "set HUEDevice4 pct 1 : ct 2000 : transitiontime 30";
fhem "define atTmp_1_$NAME at +00:01:10 set HUEDevice4 pct 50 : ct 2000 : transitiontime 30";
fhem "define atTmp_2_$NAME at +00:02:20 set HUEDevice4 pct 100 : ct 2000 : transitiontime 30";
fhem "define atTmp_3_$NAME at +00:03:30 set HUEDevice4 pct 100 : ct 5600 : transitiontime 30";
# Sound:
fhem "set mpd_hifi volume 55";

        fhem "define atTmp_4_$NAME at +00:02:40 {system (ssh hifi.daheim /aio/sounds/picowave_hifi  "Guten Morgen, es ist $(date +%k:%M)")};



Kann mir jemand helfen, wie ich die o.g. Zeile "define atTmp_4_$NAME ... " korrekterweise formulieren muss?

Grüsse
Michael
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: Otto123 am 18 Oktober 2016, 18:27:18
Hallo Michael,

also falls Dein Script wirklich problemlos läuft, dann geht es aus FHEM so --> http://fhem.de/commandref_DE.html#command
Also einfachste Variante:
"ssh hifi.daheim /aio/sounds/picowave_hifi  'Guten Morgen, es ist $(date +%k:%M)')"
Wegen der Hochkommas bin ich mir nicht hundert prozent sicher.

Du kannst das direkt in die Kommandozeile von FHEM werfen!

Gruß Otto
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 18 Oktober 2016, 19:47:31
Merci Otto,

habe noch etwas experimentiert und mit folgendem Code direkt in der Commandline von FHEM erfolg gehabt:

"sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'""

Wichtig sind wohl die vielen und unterschiedlichen Hochkommas ( ' und " ), ohne die geht es nicht ...
Ein sudo fehlt auch, da fhem selber nicht die entsprechenden Rechte hatte.

Versuche es gleich mal im Makro selber, hoffe es wird nicht noch wilder mit den ganzen Hochkommas ... ;-)

Grüße
Micha
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 18 Oktober 2016, 20:01:45
Im Makro läuft es noch immer nicht.

Zeile 54:
fhem "define atTmp_4_$NAME at +00:00:00 {system('sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'"');


Im Logfile sehe ich die Fehlermeldung aber für Zeile 67:

2016.10.18 19:55:11.915 3: Macro_rr_Michael_wakeuptimer1 return value: Search pattern not terminated at (eval 11271) line 67.


Deswegen gehe ich davon aus das der interpreter den Ausdruck noch immer nicht sauber verarbeiten kann.
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: Devender am 18 Oktober 2016, 20:22:44

Hast du nicht die abschließende } vergessen?
Also so:

{system('sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'"') }

Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 18 Oktober 2016, 21:39:44
hatte ich tatsächlich übersehen, war es aber leider nicht:

Macro_rr_Michael_wakeuptimer1 return value: Search pattern not terminated at (eval 17256) line 67.


hier zur Vollständigkeit die vollständige aktuelle Zeile 54 im Makro:

fhem "define atTmp_4_$NAME at +00:00:00 {system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'"")};


Ich verstehe auch noch nicht was die Fehlermeldung "Search pattern not terminated " bedeutet.
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: Devender am 18 Oktober 2016, 22:35:08
Ist schwer zu finde ohne es testen zu koennen.
Kannst du mal versuchen deinen Ausgabesatz "'Guten Morgen, es ist $(date +%k:%M)'"
Zu vereinfachen um zu sehen ob es an den " und ' liegt?
Also sowas wie Hallo als Ausgabe?
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: Otto123 am 18 Oktober 2016, 23:49:57
und fhem  in die Gruppe audio anstatt sudo?

Gruß Otto
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 19 Oktober 2016, 14:50:24
Hallo Otto

ich habe alles ausprobiert und es hat leider nichts gebracht.
Ich gebe auf, ich bekomme noch nicht mal ein einfaches hallo raus.  :'(

fhem "define atTmp_4_$NAME at +00:00:00 {system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi 'Hallo'")};

oder

fhem "define atTmp_4_$NAME at +00:00:00 {system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi Hallo")};


oder

fhem "define atTmp_4_$NAME at +00:00:00 {system('sudo ssh hifi.daheim /aio/sounds/picowave_hifi Hallo')};

Habe es auch mal mit Variationen von \" versucht, falls die vielen verschachtelten Hochkommas irritieren sollten.  ... im Logfile sehe ich stets nur ein :

Macro_rr_Michael_wakeuptimer1 return value: Search pattern not terminated at (eval 70935) line 68.

Wie der Perl Interpreter das wirklich braucht, finde ich einfach nicht raus.

Das mit der gruppe audio probiere ich nicht mehr aus. Ein sudo muss möglich sein, geht ja auch bei meinen anderen stellen wie z.B.

define n_Homebridge_start notify Homebridge:start {system('sudo service homebridge start');;}
attr n_Homebridge_start room Residents,System

define n_Homebridge_restart notify Homebridge:restart {system('sudo service homebridge restart');;}
attr n_Homebridge_restart room Residents,System

define n_Homebridge_stop notify Homebridge:stop {system('sudo service homebridge stop');;}
attr n_Homebridge_stop room Residents,System


Ich vermute das man in Perl mit den Hochkommas etwas Erfahrung für das Parsing braucht. Bin Informatiker aber kein Perl Spezialist.

Hast Du ein Beispiel, bei dem man ein FHEM Kommando per ssh an einen anderen rechner schicken kann?

In der Commandline funktioniert der code doch, also warum nicht im Makro???

Grüsse
Michael
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: CoolTux am 19 Oktober 2016, 15:09:57
Versuch das ganze mal als quasi Perlprogramm zu missbrauchen.


my $response = qx(Befehl eingeben);
printf $response;

So siehst du mehr Meldung im Log. Du bist bkjnd und musst erstmal sehen das Du mehr siehst.
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: CoolTux am 19 Oktober 2016, 15:13:12
Noch was, Du schreibstganz oben das der erste oben genannte Befehl in der Commandline von FHEM funktioniert.
Dann gebe genau diesen mal ohne at Aufruf in das Skript ein. Also mit System davor. at kommt ganz zum Schluss, denke mal das ist der Auslöser
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: Otto123 am 19 Oktober 2016, 16:41:32
Hallo Michael,

ZitatDas mit der gruppe audio probiere ich nicht mehr aus. Ein sudo muss möglich sein, geht ja auch bei meinen anderen stellen wie z.B.

naja, ist offtopic aber ich bin grundlegend dagegen, einfach alles als Admin machen ist sicherheitstechnisch das dünnste Brett was man bohren kann.

Und einfach "sudo ssh hifi.daheim /aio/sounds/picowave_hifi Hallo" geht nicht?

Gruß Otto
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 19 Oktober 2016, 17:23:52
So, jetzt habe den Vorschlag mal aufgegriffen und das at weggelassen und direkt den Aufruf gemacht:

fhem system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi 'Guten Morgen'");
fhem system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi Guten Morgen");

Damit gibt es jedenfalls einen "Guten" aus, aber noch keinen "Morgen". ;-)

Habe mal die Hochkommata in verschiedenen Permutationen ausprobiert, kein Erfolg.
Der Parser geht einfach nicht über das Leerzeichen hinweg ....

Da scheinen sich mehrere Fehler/Probleme zu überlagern, aber wenigstens ein Anfang um zu verstehen, wie es geht.

Hat noch jemand eine Idee?

Das mit ohne Admin-Rechte durchzuführen baue ich später ein, jetzt möchte ich erstmal sehen das es überhaupt läuft :-)

Wie geht das mit dem quasi Perlprogramm genau?

my $response = qx(system('sudo ssh hifi.daheim /aio/sounds/picowave_hifi Guten Morgen'));
printf $response;
oder
my $response = qx('sudo ssh hifi.daheim /aio/sounds/picowave_hifi Guten Morgen');
printf $response;


erzeugen eine Fehlermeldung

Grüsse
Michael
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: CoolTux am 19 Oktober 2016, 17:30:43

ssh hifi.daheim /aio/sounds/picowave_hifi  "Guten Morgen, es ist $(date +%k:%M)"


Das hier soll gehen in der fhem cmd hast du gesagt.
Also probiert bitte mal

system("ssh hifi.daheim /aio/sounds/picowave_hifi  "Guten Morgen, es ist");

Kein fhem davor, system ist ein Perlcommando
Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: mtk am 19 Oktober 2016, 17:47:53
Hallo CoolTux

erstmal danke für die Unterstützung (cc Otto).

Folgender Code funktioniert einwandfrei in der FHEM CMD line:

"sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'""

also habe ich jetzt wie vorgeschlagen nur noch folgendes eingetragen:

system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi 'Guten Morgen'");

Also ohne FHEM davor und ein Hochkomma fehlte übrigens in deiner Vorgabe ... ;-)

Ergebnis ist nur leider auch nur wieder ein Guten ohne Morgen....  :'(
Nach dem ersten Leerzeichen wird alles ignoriert.

Weiss den jemand wie man so etwas in Perl sauber handhaben muss?
Oder ist das ein Problem von FHEM?
Wie gesagt, ich habe keinerlei Erfahrung mit dieser Skriptsprache.

Was ich noch versuchen kann, ist das ganze in variablen zu übergeben. Aber warum so umständlich ...
Wenn ich mir artverwandte Beispiele mittels der system Funktion anschaue, sollte die Syntax korrekt sein.

Ich möchte mir jetzt mal anschauen, was über das ssh interface ausgegeben wird und wo das Wort "Morgen" auf seinem Weg zum raspi verloren geht.


Titel: Antw:Mit Weckautomation Macro ein shellscript ausführen
Beitrag von: CoolTux am 19 Oktober 2016, 18:21:32

system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi  "'Guten Morgen, es ist $(date +%k:%M)'"");


oder wenn das oben nicht geht


system("sudo ssh hifi.daheim /aio/sounds/picowave_hifi \'Guten Morgen\'");


Bitte mal testen