Aus FHEM einen URL Befehl senden

Begonnen von Klaus Heynen, 27 Januar 2020, 20:02:51

Vorheriges Thema - Nächstes Thema

Klaus Heynen

Ich habe folgendes Problem:
Wenn ich in einem beliebigem Browser

http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits": 32, "data": 0x20DF10EF}

öffne wird der Befehl von meinem Tasmota IR Device problemlos ausgeführt.

Von der FHEM console habe ich ein Problem:

{system ("/usr/bin/wget -O /dev/null -q 'http://172.16.15.77/cm?cmnd=irsend {'protocol': 'NEC', 'bits' 32, 'data': 0x20DF10EF}'") }

endet immer mit einem

19:15:59 MQT: stat/tasmota/RESULT = {"IRSend":"Invalid JSON"} auf der Tasmota console.

Das heißt der Teil der hinter dem IRSend kommt wird nicht richtig rüber geschickt.
Ich weiß das es wohl ein Syntax/Escape Problem sein wird, habe auch schon 2 Tage gegoogelt und gelesen und komme einfach nicht weiter.

Ich hoffe jemand kann helfen, danke Klaus

Gisbert

Hallo Klaus,

versuch's mal mit folgendem in der Fhem-Console, allerdings ungetestet, da ich deine spezifische Anwendung nicht habe:
"wget -qO /dev/null http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits": 32, "data": 0x20DF10EF}&"
(mit Anführungszeichen eingeben)

Heute hatte ich wegen eines Perl Warnings bei einer geschweiften Klammer folgenden Rat bekommen, der in meinem Fall geholfen hat.
Anscheinend muss man die 1. geschweifte Klammer escapen durch "\{" anstelle von "{".
Ob's in deinem Fall hilft, weiß ich nicht, aber außer, dass es nicht geht, wird wohl hoffentlich nicht viel passieren.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Klaus Heynen

Hi Gisbert

vielen Dank, das Resultat ist nun:
stat/tasmota/RESULT = {"IRSend":"No Bits or Data"}

also ein Schritt in die richtige Richtung!

rudolfkoenig

#3
In JSON muessen Strings in " eingeschlossen werden (im Gegensatz zu JavaScript, wo auch ' erlaubt ist):
  {system ('/usr/bin/wget -O /dev/null -q \'http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits":32, "data":0x20DF10EF}\'') }


{system(...)} ist in FHEM verpoent, weil sie FHEM blockiert.
"..." ist besser, weil FHEM den Befehl ... im Hintergrund startet (& ist unnoetig)
Gisberts Beispiel ohne & funktioniert (mit & gibt es ein Syntax error vom shell), aber nur weil der FHEM Parser "doof" ist, und " nur am Anfang und Ende prueft.

Ich wuerde die FHEM Funktion verwenden:{ HttpUtils_NonblockingGet({url=>'http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits":32, "data":0x20DF10EF}', callback=>sub(){}}) }

Klaus Heynen

Hallo Rudolf,
habe:
{ HttpUtils_NonblockingGet({url=>'http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits":32, "data":0x20DF10EF}', callback=>sub(){}}) }

probiert aber:

stat/tasmota/RESULT = {"IRSend":"No Bits or Data"}

rudolfkoenig

Ich gehe davon aus, dass der Empfaenger kein JSON5 unterstuetzt, und deswegen muss dein hex Zahl als String gesendet werden.
Also ... "data":"0x20DF10EF"...
Widerspricht der Theorie, dass mit dem ersten wget es funktioniert hat.

Klaus Heynen

nee tut's nicht.
Wie gesagt:
http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits": 32, "data": 0x20DF10EF}
funktioniert aus jedem Browser
Es scheint mir also die Frage wie man
{"protocol": "NEC", "bits": 32, "data": 0x20DF10EF}
so "verpackt" das es beim Empfänger richtig ankommt.

Klaus Heynen

es geht jetzt:
"wget -qO /dev/null 'http://172.16.15.77/cm?cmnd=irsend {"protocol": "NEC", "bits": 32, "data": 0x20DF10EF}'"
Danke für eure Hilfe Klaus