Neue Version von HTTPMOD zum Testen

Begonnen von StefanStrobel, 22 November 2014, 20:32:46

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo,

Anbei eine grundlegend überarbeitete und erweiterte Version von HTTPMOD.
Es wäre super wenn ein paar Benutzer von HTTPMOD die neue Version testen könnten, bevor ich die neue Version einchecke.
Eigentlich sollten alle bisherigen Features unverändert weiter funktionieren.

Folgendes ist neu:
Es gibt nun auch die Möglichkeit Set-Optionen generisch über Attribute zu erzeugen und so Daten an ein Gerät mit Web-Interface zu senden. Bei einer Heizung, die ein Web-Interface hat, könnte man beispielsweise per
set Heizung TempSoll 22
die Zieltemperatur auf 22 Grad setzen und HTTPMOD macht daraus den passenden HTTP-Request.  Dazu definiert man Attribute wie:

attr Heizung set01Name TempSoll
attr Heizung set01URL http://MeineHeizung/cgi-bin/webgui.fcgi?sid=$sid
attr Heizung set01Min 15
attr Heizung set01Max 25
attr Heizung setHeader1 Content-Type: application/json
attr Heizung set01Data {"set" :{"34.3118.value" :"$val" }}


Die Dokumentation ist wie üblich am Modul angehängt. Einen ersten Entwurf für eine Wiki-Seite habe ich unter http://www.fhemwiki.de/wiki/HTTPMOD2 angelegt.
Damit das ganze auch funktioniert wenn das Web-Interface eine Session-Id und ein Login benötigt und nicht mit Basic-Auth o.ä. zufrieden ist, gibt es die Möglichkeit mehrere HTTP-Requests für die Login-Prozedur über Attribute zu definieren.
Beispiel:


attr Heizung sidURL http://192.168.70.90/cgi-bin/webgui.fcgi?sid=$sid
attr Heizung sidHeader1 Content-Type: application/json
attr Heizung sid1IDRegex wui.init\('([^']+)'
attr Heizung sid2Data {"set" :{"9.17401.user" :"fhem" ,"9.17401.pass" :"password" }}
attr Heizung sid3Data {"set" :{"35.5062.value" :"128" }}
attr Heizung sid4Data {"set" :{"42.8026.code" :"pincode" }}


In diesem Beispiel werden 4 Schritte durchlaufen, bis eine gültige Session-Id existiert. Die URL und die HTTP-Header gelten in diesem Beispiel für alle 4 Schritte, sie könnten aber auch für jeden Schritte separat angegeben werden (sid1URL, sid2URL etc.).
Im ersten Schritt in diesem Beispiel wird die neue Session Id mit der sid1Regex extrahiert und in den folgenden Schritte authentisiert und autorisiert.

Damit das mit dem Login und den Sets auch ohne Blockieren funktioniert, verwendet das neue HTTPMOD eine Send-Queue, die per Internal-Timer schrittweise abgearbeitet wird.

Weitere Details in der Doku bzw. im Wiki.

Gruss
   Stefan

EDIT: neue Version vom 6.12. angehängt

Rince

Ich habe es nicht probiert. Aber einen Feature Request:
Könntest du mit wget runtergeladenen HTML Dateien als Input einbauen?

In dem TV Programm Thread gibt es einige, die erst mit wget die Daten holen, um sie dann mit deinem Modul von dort zu laden, da es ansonsten zu viel Ärger mit den Antwortzeiten gibt...
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

StefanStrobel

Hallo Rince,

um bereits heruntergeladene HTML-Dateien einzubinden wäre es am elegantesten wenn die HttpUtils neben HTTP: und HTTPS: auch FILE: als Prefix unterstützen würde. Da wäre des am besten aufgehoben und dann würde es mit allen Modulen klappen, die HttpUtils verwenden. Das sollte kein großes Problem sein und ich kann gerne einen Patch vorschlagen.

Ich vermute aber, dass es eher ein Problem mit dem Timeout war, das zu wget geführt hat. Ich hoffe eigentlich, dass das Problem inzwischen behoben ist. Wenn nicht, helfe ich gerne dabei das zu lösen und wget wieder überflüssig zu machen.
(siehe http://forum.fhem.de/index.php/topic,29269.0.html und http://forum.fhem.de/index.php/topic,29397.0.html)

Was meinst Du?

Gruss
   Stefan

Rince

Klingt auf jeden Fall besser, den Fehler gleich komplett zu beheben, statt ein Hilfskonstrukt außen rum zu stricken :)

Wenn ich es richtig verstanden habe, hat also eine zweite Instanz des Moduls quasi die erste Instanz abgeschossen indem sie den Timeout Timer überschrieben hat?

Ich werde es mal ausprobieren :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

StefanStrobel

Hallo Rince,

Der Timeout hat innerhalb einer Instanz von einem früheren Request einen späteren Request abgeschossen. Zudem war in der früheren Version von HTTPMOD der Timeout immer auf 2 Sekunden. Beides sollte behoben sein.

Gruss
   Stefan

StefanStrobel

Hallo,

ich habe im ersten Post eine neue Version angehängt, die ein paar Bugs behebt und auch mit Session-Cookies funktioniert, sobald die HttpUtils auch Header zurückgeben. Einen entsprechenden Patch habe ich im Development Forum vorgeschlagen.

Gruss
   Stefan

StefanStrobel

Hallo,

am ersten Post hängt nun die aktualisierte Version, die zu den Änderungen in HttpUtils von Rudolf Koenig passt.

Gruss
   Stefan

Actronx

Hi, erster Post für mich :)
Wollte mich zuerst für deine tolle Arbeit bedanken! Nutze es für die Kommunikation mit meinem Arduino Yun und es klappt sehr gut!

Ein kleines Bugfix habe ich:

Und zwar wird die Set Liste bei Aufruf mit ? (und damit auch die Liste im Web GUI) ohne ein notwendiges Leerzeichen erstellt.
Ohne das Leerzeichen erstellt er bspw. SollTemperatur:17,18,19,20,21,22,23HeizungAN:0,1 und denkt 23HeizungAN:0 wäre ein State.

In sub HTTPMOD_Set($@)
müsste es statt
$setList .= $setOpt;                   

so heißen (als Vorschlag):
$setList .= $setOpt . " ";                   

VG
Tristan

StefanStrobel

Hallo Tristan,

vielen Dank!
hab eine aktuelle Version im ersten Posting angehängt.

Gruss
   Stefan

Doggiebert

Zitat von: StefanStrobel am 23 November 2014, 10:52:30
um bereits heruntergeladene HTML-Dateien einzubinden wäre es am elegantesten wenn die HttpUtils neben HTTP: und HTTPS: auch FILE: als Prefix unterstützen würde. Da wäre des am besten aufgehoben und dann würde es mit allen Modulen klappen, die HttpUtils verwenden. Das sollte kein großes Problem sein und ich kann gerne einen Patch vorschlagen.
Ich fände das immer noch für ein nützliches Feature, auch wenn die Timeoutproblematik behoben ist. Erstens für Testzwecke (z.B. lokale Kopie eines Stands, mit dem es mal funktioniert hat, Webseiten ändern sich ja manchmal), zweitens um modulspezifische Implementierung dieses Features (z.B. CALENDAR) zu vermeiden.
Klar, dann sind's keine HttpUtils mehr, sondern UriUtils, und irgendwer braucht dann bestimmt noch FTP-Zugriff...  8)
SW: FHEM 5.5, Raspian, XBMC, Testinstallation auf Win7
HW: Raspi B, 32GB SD, enocean Pi, RFXTRX433E, BSC - MwC-32, Onkyo TX-NR709, Samsung UE55F8090, Jung LS-Eno, permundo SmartPlug, KDG-FB 6490cable (ohne FHEM)

StefanStrobel

Hallo,

Rudi hat das mit file: URLs in HttpUtils eingebaut und in HTTPMOD sollte es jetzt auch funktionieren. Die URLs sollten relativ sein und keine .. enthalten. (bei mir hat es relativ zu /opt/fhem/ funktioniert).

Im ersten Post in diesem Thread habe ich eine aktualisierte Version von HTTPMOD angehängt, bei der man in Fhemweb auch auf die bereits gesetzten Attribute klicken kann um sie zu bearbeiten.

Gruss
   Stefan

Doggiebert

Sensationell, danke! Muss ich nächste Woche gleich antraten...
SW: FHEM 5.5, Raspian, XBMC, Testinstallation auf Win7
HW: Raspi B, 32GB SD, enocean Pi, RFXTRX433E, BSC - MwC-32, Onkyo TX-NR709, Samsung UE55F8090, Jung LS-Eno, permundo SmartPlug, KDG-FB 6490cable (ohne FHEM)

Doggiebert

Zitat von: StefanStrobel am 06 Dezember 2014, 13:28:19
Rudi hat das mit file: URLs in HttpUtils eingebaut und in HTTPMOD sollte es jetzt auch funktionieren. Die URLs sollten relativ sein und keine .. enthalten. (bei mir hat es relativ zu /opt/fhem/ funktioniert).

Tut bei mir auch wunderbar...
SW: FHEM 5.5, Raspian, XBMC, Testinstallation auf Win7
HW: Raspi B, 32GB SD, enocean Pi, RFXTRX433E, BSC - MwC-32, Onkyo TX-NR709, Samsung UE55F8090, Jung LS-Eno, permundo SmartPlug, KDG-FB 6490cable (ohne FHEM)