FHEMWEB: FHEM Befehl ueber http get url

Begonnen von dev0, 21 August 2016, 12:17:34

Vorheriges Thema - Nächstes Thema

dev0

Könnte sich FHEMWEB in irgendeiner Art und Weise gestört fühlen, wenn man einen Befehl über eine http get URL aufruft und in diesem Aufruf nicht nur die http Header vorhanden sind, sondern auch noch json Content?


2016.08.21 12:11:03.907 4: WEB_192.168.30.145_2805 GET /fhem?cmd=setreading%20ESP02%20Uptime%20328.00&{"module":"ESPEasy","version":"0.1","data":{"ESP":{"version":9,"build":121,"name":"ESP02","sleep":0,"ip":"192.168.30.145"},"SENSOR":{"value0":{"deviceName":"SI","valueName":"Uptime","value":328.00,"type":1},"value1":{},"value2":{}}}}; BUFLEN:0



Um für eine Übergangszeit eine Rückwärtskompatibilität zu bieten, wäre das recht hilfreich. Oder ist das ein no-go?

rudolfkoenig


CoolTux

Ich befürchte Du wirst wohl des gesamten url Aufruf codieren müssen. Sprich Sonderzeichen {} , "
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dev0

Zitat von: rudolfkoenig am 21 August 2016, 13:02:03
Ich verstehe nur Bahnhof.

Ok, der Reihe nach:

Ich habe ein Plugin für ESPEasy erstellt, dass Sensorwerte über eine URL an FHEM übergeben kann:

http://<fhem>:8083/fhem?cmd=setreading%20device%20reading%20value


Da das recht unflexible ist, habe ich im nächsten Schritt ein zweistufiges Modul geschrieben, dass anstatt FHEMWEB von ESPEasy angesprochen wird. Stellt ein Benutzer nun in ESPEasy den Port von FHEMWEB _nicht_ auf mein Modul um, dann ist das auch ok, der alte Mechnismus funktioniert ja weiterhin.

Da die "setreading Syntax" aber auch alles andere als flexible ist, habe ich das ESPEasy Plugin dahin gehend erweitert, dass zusätzlich Daten im json Format übertragen werden. Mein Modul verarbeitet dann nur noch diese Json Daten und alles ist gut. Das funktioniert so weit.

Jetzt kann es aber sein, dass ein Benutzer den Port im ESPEasy-Setup noch nicht von 8083 (FHEMWEB) auf mein Modul geändert hat. Das hat dann zur Folge, dass FHEMWEB weiterhin den "/fhem?cmd=setreading... " Aufruf bekommt mit Json Daten im Content:
Zitat
        client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                     "Content-Length: "+ len + "\r\n" +
                     "Host: " + host + "\r\n" + authHeader +
                     "Connection: close\r\n\r\n"
                     + jsonBuffer);

Da dieser GET Request wohl nicht so ganz den RFCs entspricht, wollte ich mit meiner ursprünglichen Frage klären ob FHEMWEB dadurch eventuell in einer unerwarteten Weise reagieren könnte (crash, ...), da ich nicht sicherstellen kann, dass alle ESPEasy Benutzer den Port in ihrem Setup ändern um das ESPEasy Modul zu verwenden.

Meine Tests haben zwar gezeigt, dass FHEMWEB damit kein Problem hat, aber ich wollte sicherheitshalber doch hier nachfragen, bevor es nachher heißt: "Wie kannst Du nur..." ;)

Ich hoffe, dass war jetzt verständlicher.

rudolfkoenig

Gegen welche RFCs dein Request verstoessen soll, ist mir zwar schleierhaft, aber soweit ich sehe, hat FHEMWEB kein Problem mit einem JSON Inhalt (kann damit auch nichts anfangen), und liefert die normale Eingangsseite als Antwort zurueck. Die GET/POST Parameter werden in FHEMWEB bei & getrennt, und danach in key=value zerteilt. Wenn keys existieren, mit dem FHEMWEB was anfangen kann (wie z.Bsp. cmd), dann passiert was mit value, sonst wird key+value ignoriert.

dev0