Generisches Modul zum Abfragen von Readings per HTTP bzw. Webservice

Begonnen von StefanStrobel, 22 Dezember 2013, 11:49:49

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hi Uli,

das mache ich gerne. Ich habe nur noch keinen Account für das Wiki. Werd ich gleich mal beantragen.

Gruss
   Stefan

StefanStrobel

Wie sollen denn erweitere Modul-Dokumentationen im Wiki benannt werden?
Ich habe es vorübergehend im Benutzer-Namespace abgelegt, da sollte es aber nicht bleiben:
http://www.fhemwiki.de/wiki/Benutzer:StefanStrobel/Module_HTTPMOD
Auch die Einbindung in der Gesamtstruktur ist für mich nicht offensichtlich. Es ist ja kein Gerät sondern ein Modul für viele Geräte ...

StefanStrobel

Ich habe die Doku zum Modul mit einem Verweis auf diesen Threat unter "Other Components" im Wiki einsortiert.
Es wäre schön wenn sich noch ein paar Tester finden, so dass das Modul eingecheckt werden kann.

Gruss
   Stefan

Thorsten Pferdekaemper

Hi,
ich habe das Modul heute ausprobiert und bis auf eine kleine Startschwierigkeit hat es auch funktioniert. Ich habe das erst einmal nur temporär gemacht und die Definition wieder gelöscht, daher habe ich momentan kein konkretes Beispiel. Das sollte aber in den nächsten Tagen kommen.
Ich bin gerade dabei, ein Zusatz zu meiner Heizungssteuerung zu bauen. (Damit ist der Heizkessel/Brenner gemeint, nicht die Heizkörper.) Das Gerät entsteht auf Arduino-Basis mit Ethernet-Shield. Ich rufe das Teil per http://<local-ip>/ auf und bekomme die Zustände der Pins zurück. Das sieht etwa so aus:

A0 599
A1 351
A2 177
...
D0 0
D1 1
D2 1
...
P5 125
P6 128

Die As sind analoge Eingänge, Ds sind digitale Ausgänge (digitale Eingänge habe ich nicht), Ps sind PWM-Pins ("Analoge" Ausgänge).
(Zusätzlich läuft auf dem Teil noch ein bisschen mehr, es versendet nicht nur Zustände.)
Mit dem HTTPMOD habe ich dann versuchsweise ungefähr das gemacht:

define Heizkessel HTTPMOD http://192.168.178.48/ 30
attr Heizkessel readingsName1 VorlaufTempRaw
attr Heizkessel readingsRegexp1 A0[\x20]([\d]+)
attr Heizkessel userReadings VorlaufTemperatur {0.06 * (ReadingsVal("Heizkessel", "VorlaufTempRaw",0) - 600) + 70 }

Die Formel am Ende stimmt nicht wirklich. Leider ist das ganze nicht wirklich linear, aber als Proof of Concept reichts.

Das ganze hat anstandslos funktioniert, bis auf einen kleinen Teil: Ich habe zuerst in der URL den abschließenden "/" weggelassen. Ich bin mir nicht ganz sicher, ob das trotzdem funktionieren sollte, tut es aber nicht. (...wobei ich mir nicht 100% sicher bin, ob es nicht an meiner Implementierung des Webservers auf dem Arduino liegt.) Wenn man das ganze ohne "/" in den IE eingibt, dann bastelt der anscheinend den "/" automatisch dazu.
Mich hat das so ungefähr 30 Minuten gekostet, vielleicht wäre es nett, wenn das Modul in einem solchen Fall den "/" automatisch anzuhängen.
(...oder eine Fehlermeldung liefern. Komischerweise kam gar nichts, nur die Readings wurden nicht angezeigt.)

Ansonsten wäre es klasse, wenn es auch etwas zum Senden von Kommandos und Werten geben würde. Aber soweit ich verstanden habe, muss das Modul erst einmal auf einen Stand gebracht werden, dass es eingecheckt werden kann.

Ich hoffe, dass ich die erste Version in den nächsten zwei Tagen in die Heizung einbauen kann. Dann geht's weiter...

Gruß,
  Thorsten
FUIP

StefanStrobel

Hallo Thorsten,

es freut mich dass HTTPMOD bei Dir funktioniert. Das mit der Unterstützung für "set" habe ich auf der Agenda. Für meinen Anwendungsfall muss ich dafür aber auch gleich noch eine Login-Seiten / Session-ID Erkennung einbauen. Das kann noch ein paar Tage dauern, da ich momentan einen verbesserten S0-Zähler auf Arduino-Basis mit zugehörigem Modul baue. Zunächst wäre das Ziel daher die Stabilität von HTTPMOD in seiner jetzigen Form zu bestätigen, so dass es eingecheckt werden kann.

Das mit dem Anfügen eines / ist übrigens nicht immer wünschenswert. Es kommt darauf an, was der Webserver erwartet und da gibt es unterschiedliche Implementationen.

Gruss
   Stefan

Thorsten Pferdekaemper

Hi,
Das mig dem "set" hat auch noch ein bisschen Zeit. Ich bin doch noch nicht so weit, wie ich sein wollte. 
Gruß,
Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
es hat etwas länger gedauert, aber jetzt habe ich in meine Zentralheizung einen Arduino mit Ethernet-Shield, ein kleines Netzteil und eine kleine Lochrasterplatine mit einem Temperaturfühler und zwei Spannungsteilern eingebaut. Der Temperaturfühler soll überwachen, ob es meinem Gebastel zu warm wird. Die Spannungsteiler sind mit je einem VF202 Anlegefühler verbunden, einmal für Vorlauf und einmal für Rücklauf. (Mehr gibt's noch nicht.)
Der Arduino spuckt per HTTP folgendes aus:
       A0 586 T0 63 A1 578 T1 59 A4 150 T4 23
Die A-Werte sind die Raw-Werte am jeweiligen Arduino-Pin. Die T-Werte sind Grad Celsius.
Damit kann ich meinen Heizkessel als FHEM-Gerät definieren:

define Heizkessel HTTPMOD http://192.168.178.48/ 30
attr Heizkessel readingsName1 VLTemp
attr Heizkessel readingsName2 RLTemp
attr Heizkessel readingsName3 SysTemp
attr Heizkessel readingsRegex1 T0[\x20]([\d]+)
attr Heizkessel readingsRegex2 T1[\x20]([\d]+)
attr Heizkessel readingsRegex3 T4[\x20]([\d]+)
attr Heizkessel room Heizraum
attr Heizkessel stateFormat {sprintf("VL: %u°C, RL: %u°C, Sys: %u°C", ReadingsVal($name, "VLTemp",0), ReadingsVal($name, "RLTemp",0), ReadingsVal($name, "SysTemp",0))}
attr Heizkessel userReadings VLRL {sprintf("%u %u", ReadingsVal($name, "VLTemp",0), ReadingsVal($name, "RLTemp",0))}
define FileLog_Heizraum FileLog ./log/Heizraum-%Y%m%d.log Heizkessel:VLRL:.*
attr FileLog_Heizraum nrarchive 1
attr FileLog_Heizraum room Heizraum
define SVG_FileLog_Heizraum_1 SVG FileLog_Heizraum:SVG_FileLog_Heizraum_1:CURRENT
attr SVG_FileLog_Heizraum_1 room Heizraum

Ein "list Heizkessel":

Internals:
   CFGFN     
   DEF        http://192.168.178.48/ 30
   Interval   30
   NAME       Heizkessel
   NR         1654
   STATE      VL: 63°C, RL: 56°C, Sys: 22°C
   TYPE       HTTPMOD
   addr       http://192.168.178.48:80
   buf        HTTP/1.1 200 OK
Connection: close

A0 586 T0 63
A1 573 T1 56
A4 149 T4 22

   conn       
   displayurl http://192.168.178.48/
   host       192.168.178.48
   loglevel   4
   path       /
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.48/
   Readings:
     2014-02-06 23:29:42   RLTemp          56
     2014-02-06 23:29:42   SysTemp         22
     2014-02-06 23:29:42   VLRL            63 56
     2014-02-06 23:29:42   VLTemp          63
Attributes:
   readingsName1 VLTemp
   readingsName2 RLTemp
   readingsName3 SysTemp
   readingsRegex1 T0[\x20]([\d]+)
   readingsRegex2 T1[\x20]([\d]+)
   readingsRegex3 T4[\x20]([\d]+)
   room       Heizraum
   stateFormat {sprintf("VL: %u°C, RL: %u°C, Sys: %u°C", ReadingsVal($name, "VLTemp",0), ReadingsVal($name, "RLTemp",0), ReadingsVal($name, "SysTemp",0))}
   userReadings VLRL {sprintf("%u %u", ReadingsVal($name, "VLTemp",0), ReadingsVal($name, "RLTemp",0))}


Es funktioniert bisher alles, wie erwartet.
Nur eins vielleicht: Mein Logfile wurde nach der Definition des FileLogs mit sowas hier geflutet:

^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE $/ at ./FHEM/92_FileLog.pm line 143.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE $/ at ./FHEM/92_FileLog.pm line 143.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE $/ at ./FHEM/92_FileLog.pm line 143.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE $/ at ./FHEM/92_FileLog.pm line 143.

Das lag wohl daran, dass ich ein FileLog "Everything" habe, welches ich mit "*" als RegExp definiert hatte. Ich habe das jetzt auf ".*" geändert, womit die Meldungen aufgehört haben. Mir ist klar, dass meine "Everything"-Definition nicht ganz richtig war, aber andererseits hat das Problem erst mit HTTPMOD angefangen.

Auf jeden Fall ist das HTTPMOD-Modul (für mich) sehr nützlich.
Falls es noch etwas zu testen gibt, was ich mit meinem Setup testen kann, dann bitte Bescheid geben. 
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
ich habe gerade noch überprüft, was die Auslastung meiner FritzBox 7390 zu dem Thema sagt. Bisher sieht's so aus, als ob sich da nichts geändert hat.
Gruß,
    Thorsten
FUIP