Hallo liebe Forumsmitglieder. Ich möchte mit einem Dummy und notify ein bestimmtes Preset einer Kamera aufrufen.
Die URL welche aufgerufen werden muss lautet:
http://Benutzer:Passwort@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=2&arg3=0?loginuse=user&loginpas=password
Habe schon HttpUtils_BlockingGet vergeblich getestet. Irgendwie komm ich nicht mit dem Encode klar für die Sonderzeichen. War ich auf dem richtigen oder dem Holzweg?
Bitte um Hilfe.
Besser wäre non-blocking... oder einfach ein Systemaufruf (der wäre aber wieder blocking) von curl o.ä.
Wie sieht denn dein aktuelles coding aus?
Kurz, weil mobil
Kamera_Dummy:on { HttpUtils_BlockingGet("http://user:password@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=2&arg3=0?loginuse=user&loginpas=password") }
Zitat von: KernSani am 05 Januar 2020, 21:36:42
Besser wäre non-blocking... oder einfach ein Systemaufruf (der wäre aber wieder blocking) von curl o.ä.
Wie sieht denn dein aktuelles coding aus?
Kurz, weil mobil
Nicht, wenn er einfach zwischen doppelte Anführungszeichen gesetzt wird...
Ohne system( ) oder qx( ) etc.
EDIT: und hier bzgl. Shell-Aufrufen http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
Irgendwo hat Otto123 mal was bzgl. Http-Aufrufen etc. gepostet bzw. in einem seiner Blogs...
EDIT: ich glaub das war's http://heinz-otto.blogspot.com/2019/02/fhem-http-client.html
Es sollte auch mit dem HTTPMOD-Modul gehen...
@Pleitegeier: wenn du es per wget oder curl auf der Linux-cmd geschafft hast sollte die Umsetzung per Notify o.ä. einfach sein... Wenn du Probleme beim "encoden" vermutest, es gibt auch eine Funktion urlencode (oder so ähnlich), vielleicht hilft das. Und ja, besser nonblocking verwenden!
Gruß, Joachim
Danke für die Hilfestellung. Habe es jetzt mit folgendem Code funktionierend eingerichtet.
Dummy_Preset_1:on {GetFileFromURL("http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password") }
Der Backslash vor dem @ war in dem Code wichtig. Ohne funktioniert es nicht.
Wie müsste der Code aussehen damit FHEM nicht blockiert wird sobald der Dummy auf on getriggert wird?
Mit der URL encoded und "HttpUtils_NonblockingGet" bin ich leider nicht weiter gekommen.
http%3A%2F%2Fuser%3Apassword%40192.168.1.36%2Fcgi-bin%2Fptz.cgi%3Faction%3Dstart%26channel%3D0%26code%3DGotoPreset%26arg1%3D0%26arg2%3D2%26arg3%3D0%3Floginuse%3Duser%26loginpas%3Dpassword
Ein
wget http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password
auf der Linux-Console geht!?
EDIT: evtl. ist auch folgendes nötig (einfach mal auf der Linux-Console testen was geht) wget "http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password"
dann unten im code auch eintragen ABER: dort dann eben "escapen"! also statt " eben \" eintragen: Dummy_Preset_1:on "wget \"http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password\""
oder auch Dummy_Preset_1:on "wget 'http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password'"
wenn du keine Variablen im http-Request hast! (Unterschied zwischen " " und ' ' bzgl. "Variablenauswertung" nachschlagen ;) )
Dann sollte folgendes auch gehen (und nicht blockieren: Aufrufe in "einfachen Anführungszeichen" blockieren nicht allerdings: es gibt auch keinen "Rückgabewert" zur weiteren Verwendung, ist hier aber unnötig!?):
Dummy_Preset_1:on "wget http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password"
Bei urlencode hast du wohl etwas zu viel encodiert ;)
Bzw. hast du mal genau das was du mit GetFileFromURL probiert hast auch mal mit HTTPUtilsNonBlockingGet versucht zu nutzen!?
Gruß, Joachim
Hallo Joachim. Ein wget mit deinem Code in der Linux Shell führt zu "HTTP-Anforderung gesendet, warte auf Antwort... 400 Bad Request".
Ja habe den gleichen Code von "GetFileFromURL" (Kamera dreht auf Preset) mit "HttpUtils_NonblockingGet" (Nichts passiert) versucht und damit funktioniert es leider nicht.
Gruß Carsten
PS: Meine Antwort hat sich zeitlich überschnitten. Werde es testen
Zitat von: MadMax-FHEM am 06 Januar 2020, 10:09:46
Ein
wget http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password
auf der Linux-Console geht!?
EDIT: evtl. ist auch folgendes nötig (einfach mal auf der Linux-Console testen was geht)
wget "http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password"
Liefert als Antwort "HTTP-Anforderung gesendet, warte auf Antwort... 401 Unauthorized
Authentifizierung mit Benutzername/Passwort fehlgeschlagen. aber das Prompt erscheint in der Shell und bleibt nicht hängen wie die Ausführung ohne ""
wget -q -O /dev/null "http://user:password@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=2&arg3=0?loginuse=user&loginpas=password"
Dieser Code funktioniert in der Console. Werde deine weiteren Vorschläge jetzt mit dem Code testen.
Dummy_Preset_1:on "wget -q -O /dev/null \"http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password\""
Funktioniert leider nicht.
Zweck dieses Code ist das drehen einer Kamera vom PKW Stellplatz zur Haustür wenn jemand an der Türsprechanlage klingelt.
Was kommt denn für eine Fehlermeldung!?
Weil mit "geht nicht" kann ich nicht viel anfangen ;)
Und bevor du das ins Notify einbaust kannst du das auch erst mal einfach in die FHEM-Web Kommandozeile "reinklopfen" ;)
Das Thema mit url per fhem als Systembefehl gab es schon mal und ich weiß es war etwas "hakelig" bzgl. wo nun genau Anführungszeichen und wo nicht bzw. welche ;)
EDIT: wichtig ist halt, dass der gesamte Systemaufruf in "doppelte Anführungszeichen" muss, damit fhem das als "Systembefehl" behandelt. Also: "Systembefehl". Wenn innerhalb des Systembefehls Anführungszeichen benötigt werden, dann entweder "escapen", also: statt " eben \" oder einfache Anführungszeichen, also ' statt ". Allerdings beachten, dass innerhalb von "einfachen Anführungszeichen" KEINE Variablenauswertung passiert. Also: '$Variable' führt dazu, dass genau der "Text" $Variable ankommt wogegen bei: "$Variable" der Inhalt der Variablen übergeben wird...
Evtl. finde ich den Thread noch mal...
...war aber schon lange her...
EDIT: nicht der, den ich gesucht hatte aber vielleicht hilfreiche Infos (sind nur kurze Threads ;) ):
https://forum.fhem.de/index.php/topic,84067.msg763402.html#msg763402
https://forum.fhem.de/index.php/topic,72962.msg645718.html#msg645718
https://forum.fhem.de/index.php/topic,95373.msg882090.html#msg882090
https://forum.fhem.de/index.php/topic,97703.msg909550.html#msg909550 (ist quasi die "fhem-Variante" des verlinkten Blogs von Otto ;) )
EDIT2: hast du schon probiert, ob das was mit GetFileFromURL klappt auch mit HTTPUtils_nonblockingGet geht!?
Gruß, Joachim
Danke für deine Mühe Joachim. Folgender Code funktioniert jetzt in FHEM. Meine Frage ist nur noch ob "wget" wie im Code eingebunden auch FHEM blockiert sobald das notify getriggert wird.
Dummy_Preset_1:on {system("wget -q -O /dev/null \"http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password\"")}
Ja.
Aber es lässt sich vermeiden, wenn am Ende ein & angestellt wird.
Also wie in Linux üblich: "verschiebe Ausführung in den Hintergrund"...
Leider daddel ich grad nur am Handy und da kann ich jetzt keine "korrigierte Version" anhängen, da geht verm. nur was schief... ;)
Ok, ich versuch's trotzdem mal: ;)
Dummy_Preset_1:on {system("wget -q -O /dev/null \"http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password\" &")}
Allerdings eigenartig warum das nicht "einfach so", also ohne "system( )" geht... Bzw. welcher Fehler kam da? Evtl. dass wget nicht "gefunden" wird? Dann mal den gesamten Pfad zu wget mit angeben... Bzw. ich bin ja doof... Evtl. habe ich noch meine eigenen wget-Aufrufe wo rumliegen... ;) Wenn ich dann wieder zuhause bin schau ich mal. Könnte auch eine von den Optionen sein, die du da bei wget mitgibst. Ich glaub da hab ich auch etwas "rumlaboriert"... ;)
Gruß, Joachim
Das \" &")}
am Ende des Code funktioniert und FHEM stellt den Dummy sofort auf on und nicht erst nach ca. zwei Sekunden.
Es wird wohl damit kein FHEM mehr blockiert. Leider kam keine Rückmeldung von FHEM bei vorherigen Fehlversuchen. Habe aber auch nicht die Kommandozeile benutzt sondern direkt im notify per "DEF" eingefügt.
Nochmal danke für deine Mühe. Wenn du noch eine elegantere Lösung die Tage parat hast würde es mich freuen.
Folgender Code für alle kommenden Anfänger mit IP Kamera und Preset arbeitet in FHEM. Kamerahersteller ist Dahua und arg2=1
das =1 von arg2 im Code ist gewünschtes Preset.
Dummy_Preset_1:on {system("wget -q -O /dev/null \"http://user:password\@192.168.1.36/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=1&arg3=0?loginuse=user&loginpas=password\" &")}
Gruß Carsten
Gerne!
Na wenn's tut und nicht blockiert...
...was willst du mehr ;)
Du kannst ja dann ein [gelöst] vor den ersten Post setzen :)
Hmm, eleganter. Folgendes funktioniert bei mir:
"wget --output-document=/dev/null -q 'http://192.168.1.120:8085/fhem?cmd=set%20Ich%20state%20absent' > /dev/null 2&1"
direkt ins DEF eines Notify...
So habe ich mal testweise von einem fhem an ein anderes fhem (Testsystem) An-/Abwesenheit gesendet ;)
(ja, ich hatte keine Lust fhem2fhem einzurichten ;) )
--output-document=/dev/null habe ich gebraucht, weil irgendwie mein fhem-Home (also /opt/fhem/) mit lauter irgendwas Dateien (weil fhem ja eine "Antwortseite" schickt) voll gemüllt wurde...
...evtl. bei dir mal schauen ;)
Das "Umleiten" zu /dev/null 2&1 am Ende hat nicht gereicht.
Auch das quiet nicht...
Ob das nun eleganter ist: das musst du entscheiden ;)
Es blockiert aber auch nicht...
...und sieht eigentlich ähnlich einem deiner (von mir vorgeschlagenen) Versuche aus...
Gruß, Joachim