Mit Windows Kommandos an FHEM senden (via EventGhost)

Begonnen von Spiff, 07 Juli 2013, 18:24:32

Vorheriges Thema - Nächstes Thema

Spiff

Hallo!

Ich beginne gerade, mich etwas in FHEM einzuarbeiten.
Gibt es eine Möglichkeit, von außen Befehle z.B. mit Command Line Parametern an FHEM zu senden?
Also sozusagen per Verknüpfung aus Windows heraus.

Momentan benutze ich das FHEMWEB, aber wenn ich "localhost:8083/fhem?cmd.Kaffee=set Kaffee on&room=all" in eine Verknüpfung packe, öffnet er den Browser, wartet bei der Benutzerauthentifizierung und bleibt danach auch geöffnet.
Ich möchte es sozusagen versteckt und ohne Interaktion machen können.

Terminal funktioniert auch nicht - oder ich habe das passende Programm nicht gefunden. Auch hier muss man sich erst anmelden und ein Terminal mit einstellbaren und per Command Line aufrufbaren Makros ist mir nicht bekannt.

Gibt es andere Alternativen, also eine Verknüpfung mit integrierter Passwortangabe und versteckter Ausführung?

Hintergrund ist, dass ich FHEM mit EventGhost koppeln möchte. Ich habe schon ein paar Regeln in Eventghost erstellt und ich möchte z.B. mittels eines Schalters sowohl EventGhost als auch FHEM mitteilen, dass ich zu Hause bin. Momentan mache ich das über ein USB-Experimentierboard mit digitalen Ein- und Ausgängen, das mit EventGhost kommunizieren kann.

Danke & viele Grüße
Spiff

rudolfkoenig

Z.Bsp. mit
 perl fhem.pl <fhemhost>:7072 "<command>..."

muesste es klappen, habs aber unter Windows nie getestet.

Steht unter anderem in http://fhem.de/commandref.html#intro


Spiff

Super, das klappt, danke!
Kann man in die Kommandozeile auch das Passwort der Terminal-Schnittstelle integrieren? Ich habe es erstmal rausgenommen.

Geht das auch umgekehrt, also dass FHEM eine Windows- .exe oder .bat ausführt?
Ich hätte gerne einen "Ein-Aus"-Schalter, der je nach Schaltzustand auf Druck eine .exe mit untersch. Parametern ausführt.

Vielen Dank & Gruß
Spiff

Spiff

Hallo!

ZitatGeht das auch umgekehrt, also dass FHEM eine Windows- .exe oder .bat ausführt?
Ich hätte gerne einen "Ein-Aus"-Schalter, der je nach Schaltzustand auf Druck eine .exe mit untersch. Parametern ausführt.

Ich habe eine Lösung gefunden:
############ DUMMY SCHALTER ############

define Test dummy
attr Test room Experiment
attr Test webCmd on:off
attr Test setList on off

define Alarm notify Test {\
system("C:\\PROGRA~2\\EventGhost\\EventGhost.exe -e Test_%")\
}
attr Alarm room Experiment


Hinweise:
- Doppelbackslash notwendig, weil Perl das sonst selbst interpretiert
- Das Programmverzeichnis darf keine Leerzeichen enthalten. In dem Fall muss man den alternativen 8-stelligen Verzeichnisnamen eintragen.
Unter einem 64-bit-System  ist der oben stehende Link richtig, unter 32-Bit müsste es "C:\\PROGRA~1\\EventGhost\\EventGhost.exe -e Test_%" heißen. Diese Verzeichnisnamen kann man über "dir /x" herausfinden.
- die unter Eventghost zu verwendenden Events heißen dann "Main.Test_on" bzw. "Main.Test_off". Am besten in FHEM testweise beide einmal anklicken und das Event wie gewohnt in das Makro reinziehen.

Viele Grüße
Spiff

m.o.d

Hallo,
Wie muss den ein befehl aussehen der mit der ip anfängt? (Socket Control für Android)

<fhemhost>:8083/fhem?cmd.Deckenlampe=set Deckenlampe on&room=all

Das funzt leider nicht bei mir...!?   :-(

wilkens

Hallo Spiff,

ich versuche das gleiche Problem zu lösen. FHEM soll Infos an EventGhost senden.

Kannst du die Konfig des "Dummy Schalters" für mich erläutern?
EventGhost läuft bei mir auf einem Win8 PC und FHEM auf einem Ubuntu PC (VMWare auf diesem Win8)
Wenn ich nun beim Schalter folgendes definiere:
Zitat
define Alarm notify Test {\
system("C:\\PROGRA~2\\EventGhost\\EventGhost.exe -e Test_%")\
}
attr Alarm room Experiment
Fehlt mir die Verknüpfung zum EventGhost des Win8 PC.
Woher weiß also FHEM, auf welchem PC EventGhost läuft?
Wäre super, wenn du einen Tipp für mich hast.

Vielen Dank und Gruß

Spiff

Hi spynet, sorry - etwas spät :D

Wenn die Befehle über das Netzwerk an den Eventghost-Rechner geschickt werden sollen, gibt es das Webserver-Plugin.
Das geht dann so:
http://(IP des Eventghost-Rechners):Port/?(Eventname)

Gruß
Spiff

TWART016

Hallo,

mein Ziel ist es per FHEM (Raspberry Pi) ein bestimmtes Event am Windows PC auszuführen. Eventghost ist bereits installiert.

Zitat von: Spiff am 14 April 2015, 22:13:52
Wenn die Befehle über das Netzwerk an den Eventghost-Rechner geschickt werden sollen, gibt es das Webserver-Plugin.
Das geht dann so:
http://(IP des Eventghost-Rechners):Port/?(Eventname)
Wie muss der das Webserver-Plugin am Windows PC konfiguriert werden? Was soll bei Datenverzeichnis rein? Authentifikation benötigt?

Ein weiteres Ziel ist es Winamp per FHEM zu Bedienen. Am besten mit dem Modul Remote Control (FHEM Fernbedienung)? Oder gibt es besseren Alternativen? eigenes CSS?

Zitat von: spynet am 02 März 2014, 15:46:13
Woher weiß also FHEM, auf welchem PC EventGhost läuft?
Ähnlich wie spynet interessiert mich, woher FHEM wissen soll, wo der Eventghost Server steht?


Gruß
TWART016

Spiff

#8
Hi TWART016,

im Webserver-Plugin kannst du alles einstellen: den Port, das Prefix, eine Authentifikation. Letztere habe ich noch nicht ausprobiert, wäre aber besser, den Zugang zu schützen. Hatte mich damit noch nicht auseinandergesetzt.
Wenn FHEM-Pi und Windows-PC in einem Netzwerk sind, brauchst du nichtmal den Port forwarden, das macht es auch sicherer.
Viel mehr brauchst du also nicht konfigurieren.
Nehmen wir an, dein Windows-Rechner hat die IP 192.168.178.20, der Port im Webserver ist z.B. auf 8086 eingestellt und das Prefix auf "FHEM" dann fängst du so an:
Rufe in einem Browser die Adresse
http://192.168.178.20:8086/?Event auf.
Dann siehst du in Eventghost das Event FHEM.Event
Das ziehst du dann einfach per Drag&Drop in das Makro.

Um eine Webseite in FHEM aufzurufen, bzw. einfach nur auszuführen, gibt es die httputils.
Probier mal das hier aus (in der Commandozeile):

{GetFileFromURL("http://192.168.178.20:8086/?Event")}
Um die Seite in den Logs zu verschlüsseln, kannst du auch GetFileFromURLQuiet benutzen. Siehe hier: http://www.fhemwiki.de/wiki/HttpUtils

Du müsstest also einen Dummy anlegen und einen notify darauf ansetzen, der die obige Funktion ausführt.

Gruß
Spiff

EDIT: Das Datenverzeichnis ist das Verzeichnis, das auch html-Dateien enthalten kann. Bei mir ist es c:\temp. Du könntest also dort eine index.html reinlegen und das wäre dann die Seite, die nach dem Eventaufruf im Browser erscheinen würde. httputils gibt diese Seite dann als Antwort aus. Damit könnte man theoretisch eine Überwachung einführen, ob der Befehl, den FHEM ausgesendet hat, auch wirklich beim Eventghost angekommen ist.

Noch ein Hinweis zu httputils: ich hatte es vorher auch noch nie ausprobiert. Aber es kann sein, dass fhem bis zu einem Timeout hängt, solange die Eventghost-Seite nicht erreichbar ist. Das steht alles in der wiki.

TWART016

Hi Spiff,

Zitat von: Spiff am 29 August 2015, 17:03:48
Das Datenverzeichnis ist das Verzeichnis, das auch html-Dateien enthalten kann. Bei mir ist es c:\temp. Du könntest also dort eine index.html reinlegen und das wäre dann die Seite, die nach dem Eventaufruf im Browser erscheinen würde. httputils gibt diese Seite dann als Antwort aus. Damit könnte man theoretisch eine Überwachung einführen, ob der Befehl, den FHEM ausgesendet hat, auch wirklich beim Eventghost angekommen ist.

Vielen Dank. Das hat soweit funktioniert. Leider steht im Log dann immer der Code der html, bzw. der Fehler, dass die Seite nicht gefunden wurde.
Ist es möglich das im FHEM Log auszublenden, evtl. per Loglevel?

Was meinst du mit Überwachung?


Gruß
TWART016

Spiff

Hi,

Der Standard für Logs in fhem ist verbose (= Loglevel) 3. Du scheinst einen höheren eingestellt zu haben, denn httputils hat als Standard 4, siehe wiki. Wenn du dein FHEM tatsächlich auf >3 laufen lassen willst (was eigentlich nur für die Analyse Sinn macht), kannst du in den httputils das Loglevel vielleicht auf 5 oder 6 (wenn das überhaupt geht) erhöhen.

Oder du speicherst eine leere index.html in dein Datenverzeichnis.

Mit Überwachung meine ich nur, wenn du in deine index.html ein "Befehl ausgeführt" einfügst und du ein if oder doif auf die Rückgabe von httputils mit genau diesem String ansetzt, könntest du eine Fehlermeldung oder irgendwas anderes damit erzeugen. Weiss nicht, ob das Sinn macht; der Eventghost-Webserver hat bei mir noch nie Probleme gemacht und läuft die ganze Zeit mit.

Gruß
Spiff

TWART016

Hi Spiff,

Zitat von: Spiff am 29 August 2015, 20:35:59
Der Standard für Logs in fhem ist verbose (= Loglevel) 3. Du scheinst einen höheren eingestellt zu haben, denn httputils hat als Standard 4, siehe wiki. Wenn du dein FHEM tatsächlich auf >3 laufen lassen willst (was eigentlich nur für die Analyse Sinn macht), kannst du in den httputils das Loglevel vielleicht auf 5 oder 6 (wenn das überhaupt geht) erhöhen.
Wenn ich es im wiki richtig verstehe ist der Loglevel von httputils auf 4. Wie kann ich das verändern? Wie ist die Syntax?

{GetFileFromURL("http://192.168.178.20:8086/?Event","4","","3")}

funktioniert bei mir leider nicht.

Leere index.html funktioniert bei mir leider nicht.


Gruß
TWART016

Spiff

Hmm warum geht das mit der index nicht?

Probier mal

{GetFileFromURL("http://192.168.178.20:8086/?Event","4","","","3")}


Du hast ein Argument zu wenig und warst noch gar nicht  beim loglevel angekommen :)
GetFileFromURL($url, [$timeout], [$data], [$noshutdown], [$loglevel])

Gruß
Spiff

TWART016

Hi Spiff,

Zitat von: Spiff am 29 August 2015, 21:22:24
Probier mal
Du hast ein Argument zu wenig und warst noch gar nicht  beim loglevel angekommen :)

Danke für den Hinweis, hat aber leider trotzdem nicht geholfen. Bei Loglevel 1,2 und 3 kommt folgendes ins FHEM-log:

2015.08.29 21:38:55 3: HttpUtils url=http://192.168.178.20:8086/?Event
2015.08.29 21:38:55 3: http://192.168.178.20:8086/?Event: HTTP response code 200
2015.08.29 21:38:55 3: HttpUtils http://192.168.178.20:8086/?Event: Got data, length: 0
2015.08.29 21:38:55 3: HttpUtils http://192.168.178.20:8086/?Event: Zero length data, header follows:
2015.08.29 21:38:55 3:   Server: EventGhost/0.4.1.r1700
2015.08.29 21:38:55 3:   Date: Sat, 29 Aug 2015 19:38:55 GMT
2015.08.29 21:38:55 3:   Content-type: text/html
2015.08.29 21:38:55 3:   Content-Length: 1184


Kann man eventuell im notify ein Logeintrag ins FHEM-log schreiben?


Gruß
TWART016

Spiff

Hmm bei mir funktioniert es wie es soll.
Vielleicht nochmal zu den Logleveln generell:
http://www.fhemwiki.de/wiki/FHEM_Command_Beispiele#attr_global_verbose_X

Das habe ich auf 3 laufen, wie es auch empfohlen wird. Ausser, es funktioniert etwas nicht, dann schalte ich auf 5 hoch.

5 bedeutet: alles bis einschließlich Stufe 5. Wenn du 3 eingestellt hast und die Funktion auf 4 oder höher laufen lässt, wird nichts ins Log geschrieben.

Gruß
Spiff.