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

Hallo,

gibt es eigentlich schon ein Modul, mit dem man Werte vom Webinterface oder Webservice eines Geräts auslesen kann?

Ich habe einen Poolmanager, der Wassertemperatur, Chlor und PH verwaltet. Die Werte kann ich mit dem richtigen Post-Request und passenden Headern bekommen.

Meine erste Idee war, das in einem eigenen Poolmanager-Modul zu realisieren, aber eigentlich könnte man das auch generisch machen, so dass beim define oder mit zusätzlichen sets die URL, Header, Anfragedaten und Polling-Interval definiert werden, dazu Regexes, mit denen man die gewünschten Readings aus dem reply extrahieren kann.

Wenn es sowas noch nicht gibt, würde ich das mal angehen.
Nur wenn es das doch schon gibt, natürlich nicht ;-)

Was meint Ihr?

Gruss
   Stefan

Loredo

Bist du hier schon weiter gekommen?
Ich frage wegen http://forum.fhem.de/index.php/topic,17951.0.html


Ich hätte demnach einen ersten Anwendungsfall für ein solches Modul wie mir scheint ;-)




Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

StefanStrobel

Für den Poolmanager funktioniert der Prototyp inzwischen. Ich bin jetzt dabei das ganze noch etwas allgemeiner zu machen. In den nächsten Tagen sollte es soweit sein, dass ich eine erste Version posten kann.

Meine derzeitige Idee ist dass man nach einem "define" mit URl und "Interval" per "set" Paare mit Reading-Name und Regex setzen kann, so dass das Modul dann per Regex mit $1 das entsprechende Reading aus der HTTP-Antwort holen kann.
Ebenso sollten benötigte HTTP-Header und Post-Daten für die Abfrage per "set" definiert werden können, sonst würde der "define" zu komplex und Leerstellen verwirrend.

Da ich für die Abfrage einen HTTP-Header setzen muss, war auch ein kleiner Patch an HttpUtils nötig - alternativ hätte ich eine eigene HTTP-Routine schreiben müssen. Aber im Kontext langsamer Abfragen wäre das evt. sowieso noch ein Thema. Hat jemand schon in einem Modul die HTTP-Abfragen asynchron implementiert?

Hier schonmal die Änderung an HttpUtils, wie ich sie bei mir gemacht habe.

Boris: liest Du mit? Macht das aus Deiner Sicht so Sinn?

*** HttpUtils.pm   2013-12-25 12:11:00.000000000 -0800
--- HttpUtils-Orig.pm   2013-12-25 11:30:44.000000000 -0800
***************
*** 60,66 ****
  sub
  CustomGetFileFromURL($$@)
  {
!   my ($quiet, $url, $timeout, $data, $noshutdown, $loglevel, $reqheader) = @_;
    $timeout = 4.0 if(!defined($timeout));
    $loglevel = 1 if(!$loglevel);
   
--- 60,66 ----
  sub
  CustomGetFileFromURL($$@)
  {
!   my ($quiet, $url, $timeout, $data, $noshutdown, $loglevel) = @_;
    $timeout = 4.0 if(!defined($timeout));
    $loglevel = 1 if(!$loglevel);
   
***************
*** 114,127 ****
    if(defined($authstring)) {
      $hdr .= "Authorization: Basic $auth64\r\n";
    }
-   if(defined($reqheader)) {
-     $hdr .= $reqheader."\r\n";
-   }
    if(defined($data)) {
      $hdr .= "Content-Length: ".length($data)."\r\n";
!    if ($hdr !~ "Content-Type:") {
!       $hdr .= "Content-Type: application/x-www-form-urlencoded";
!    }
    }
    $hdr .= "\r\n\r\n";
    syswrite $conn, $hdr;
--- 114,122 ----
    if(defined($authstring)) {
      $hdr .= "Authorization: Basic $auth64\r\n";
    }
    if(defined($data)) {
      $hdr .= "Content-Length: ".length($data)."\r\n";
!     $hdr .= "Content-Type: application/x-www-form-urlencoded";
    }
    $hdr .= "\r\n\r\n";
    syswrite $conn, $hdr;

rudolfkoenig

Da zunehmend mehr Geraete per HTTP bedient werden wollen, wollte ich eine nicht blockierende Variante zu Verfuegung stellen, insb. ein generisches HTTP Modul muss es verwenden. Es ist nicht ganz nicht-blockierend: DNS-Lookup und SSL Negotiation sind weiterhin blockierend, aber immmerhin connect und read nicht. Nachteil: das Ergebnis wird zeitversetzt zugestellt, nach JavaScript-Manier durch Aufruf einer Funktion, was man als Parameter uebergibt.

Beispiel:
# Parameters in the hash:
#  mandatory:url, callback
#  optional:hideurl,timeout,data,noshutdown,loglevel
HttpUtils_NonblockingGet({
    url=>"http://192.168.178.112:8888/fhem",
    myParam=>7,
    callback=>sub($$$){ Log 1,"$_[0]->{myParam} ERR:$_[1] DATA:$_[2]" }
})


Da ich dafuer das komplette HttpUtils.pm umgebaut habe und einiges "zu Fuss" machen muss, will ich es nicht sofort einchecken, sondern haenge ich es hier an, bitte gibt mir Feedback. Ich habe es zwar unter OSX, Linux, FritzBox und Windows getestet, jeweils mit und ohne HTTPS, redirection, DNS und connect Problemen, aber wer weiss was ich vergessen habe. Achtung: ein neues fhem.pl von gerade eben ist Voraussetzung!

@Autoren der 17_EGPM2LAN.pm, 30_HUEBridge.pm, 59_WWO.pm, 70_ENIGMA2.pm, 71_YAMAHA_AVR.pm: Bitte statt CustomGetFileFromURL auf GetFileFromURL bzw. GetFileFromURLQuiet ausweichen (== erstes Parameter von CustomGetFileFromURL weglassen), da ich weniger Wrapperfunktionen haben will. Ihr duerft natuerlich gerne HttpUtils_NonblockingGet verwenden :)


@StefanStrobel: ich kann die Aenderungen gerne uebernehmen, aber ich brauche ein diff -u oder svn diff. Am liebsten gegen die neue Version :)

StefanStrobel

Anbei ist meine erste Version eines generischen Moduls um Geräte per HTTP-Interface abzufragen.
Die nächste Version werde ich für das neue NonBlockingGet umbauen.

@Rudolf: nach genau so einem Non-Blocking Get habe ich gesucht! ich werde es gleich testen und dann bei Bedarf auch den Patch anpassen. Für den Poolmanager muss der HTTP Post z.B. einen Content-Type Header mit application/json;charset=UTF-8 enthalten.


Zum Modul:
Ich verwende es für den Poolmanager folgendermassen:

define PM HTTPMOD http://192.168.x.y/cgi-bin/webgui.fcgi 60
set PM AddRequestHeader Content-Type: application/json;charset=UTF-8
set PM AddRequestHeader Accept: */*
set PM RequestData {"get" :["34.4001.value" ,"34.4008.value" ,"34.4033.value"]}
set PM AddMatchPair PH 34.4001.value":[ \t]+"([\d\.]+)",
set PM AddMatchPair CL 34.4008.value":[ \t]+"([\d\.]+)",
set PM AddMatchPair TEMP 34.4033.value":[ \t]+"([\d\.]+)"

attr PM room Pool
attr PM stateFormat {sprintf("%.1f Grad, PH %.1f, %.1f mg/l Chlor", ReadingsVal($name,"TEMP",0), ReadingsVal($name,"PH",0), ReadingsVal($name,"CL",0))}

define FileLog_PM FileLog ./log/PM-%Y.log PM
attr FileLog_PM room Pool


Im Define gibt man URL und Abfrage-Intervall an.
Mit den Sets danach definiert man eventuell benötigte zusätzliche HTTP-Header oder Post Inhalte für die Abfrage.
Die Antwort wird gegen einen Hash ausgewertet. Darin stehen Paare mit je einem Reading-Namen und einer Regex, die aus dem HTTP-Response den passenden Wert holt.
Mit set AddMatchPair kann man den Hash aufbauen.


StefanStrobel

Anbei eine erste Version eines generischen Moduls zur Abfrage von Geräten mit Web-Interface, das HttpUtils_NonblockingGet aufruft.
Ich hoffe ich habe die Verwendung der Http_Utils richtig verstanden. Bei mir scheint es zu funktionieren.

Ebenfalls beigefügt ist ein diff -u um eigene Header an HttpUtils_NonblockingGet übergeben zu können.

rudolfkoenig

#6
ZitatIch hoffe ich habe die Verwendung der Http_Utils richtig verstanden.
Ja, so war das auch gemeint.

Bei der kurzen Uebersicht des Moduls ist mir folgendes aufgefallen:

- ich finde AddMatchPair als Name nicht intuitiv, ich wuerde es in readingsRegexp oder vergleichbares aendern. 

- die Parameter per set zu setzen ist nicht "FHEM-like", "richtig" sind Attribute, und ja, es gibt ein AttrFn.

- mit Attributen hat man das Problem der Listen, dazu gibt es Workarounds:
a) eine Liste von Attribute zulassen: readingsRegexp1,readingsRegexp2...readingsRegexp9
b) Attribute mit Wildcard zulassen, z.Bsp. readingsRegexp.*. Nachteil: in FHEMWEB ist sowas z.Zt. nur ueber Kommandozeile definierbar oder aendernbar, ich waere aber geneigt das zu aendern :)
c) alles als ein Attribut setzen, mit Leerzeichen als Trenner. Es gibt eine Hilfsfunktion attrSplit, der nach / oder , trennt, falls der Attributwert mit diesem Zeichen beginnt, sonst mit Leerzeichen. Sowas ist z.Zt. zwar in FHEM ueblich, aber nicht schoen fuer lange Listen, und verwirrend fuer weiter strukturierte Daten.

- bitte das regexp entweder beim Ausfuehren, oder noch besser beim definieren (AttrFn) per eval pruefen, sonst stuerzt fhem beim ersten  kaputten regexp ab.

StefanStrobel

Dann werd ich das nochmal umbauen.

Ein Problem ist mir auch noch aufgefallen:
Seit ich das neue HttpUtils verwende, und die Readings in der Callback-Funktion setze, wird kein Filelog mehr dafür geschrieben, der Status nicht aktualisiert und das GUI scheint auch nichts mehr von Änderungen an den Readings mitzubekommen.
Muss ich in der Callback-Funktion irgendwelche Notifications anschalten oder ist das noch ein Problem in Fhem.pl?

rudolfkoenig

Ich kann keinen Grund vorstellen.
Kannst Du mir einen Beispiel bauen, den ich auch ohne speziellen Hardware testen kann?

Markus Bloch

Zitat von: rudolfkoenig am 29 Dezember 2013, 19:19:54
@Autoren der 17_EGPM2LAN.pm, 30_HUEBridge.pm, 59_WWO.pm, 70_ENIGMA2.pm, 71_YAMAHA_AVR.pm: Bitte statt CustomGetFileFromURL auf GetFileFromURL bzw. GetFileFromURLQuiet ausweichen (== erstes Parameter von CustomGetFileFromURL weglassen), da ich weniger Wrapperfunktionen haben will. Ihr duerft natuerlich gerne HttpUtils_NonblockingGet verwenden :)

Hi Rudi,

mach ich gerne, aber ist das nicht eben das, was du nicht willst? Du schlägst vor, das wir auf die Wrapper-Funktionen von CustomGetFileFromURL ausweichen. Ich denke du willst diese Wrapperfunktionen nicht oder habe ich das falsch verstanden?

Die HttpUtils_NonBlocking klingt sehr interessant, da mich bezgl. der Blockierung bei einem nicht erreichbaren Server bereits verschiedene Leute fragend kontaktiert hatten.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Ich wollte ja nicht so radikal sein, aber ihr koennt natuerlich auf alle .*GetFileFromURL.* Funktionen verzichten :)
GetHttpFile werde ich aber behalten, man braucht auch was einfaches.

Ich habe HttpUtils.pm eingecheckt, damit es jetzt endlich getestet wird.

StefanStrobel

Anbei ein Entwurf, der mit attr statt mit set arbeitet.
Das ganze klappt bei mir jedoch nur wenn ich Zeile 136 in HttpUtils auskommentiere.

$hash->{NAME} = ""; # Delete might check it

Ansonsten fehlt im hash des Geräts später der Name. Oder habe ich da noch was falsch verstanden?
Ohne die Zeile 136 klappt es auch mit dem Filelog wieder.

Die Attribute habe ich mit readingsName.*, readingsRegex.* etc. in die AttrList gestellt und dann später in der Callback-Funktion mit
foreach my $a (sort (grep (/readingsName/, keys %{$attr{$name}}))) {
die tatsächlich gesetzten Attribute verarbeitet.
Macht das so Sinn in fhem oder gibt es da einen besseren Weg?

Die Beispiel-Konfiguration für einen Poolmanager sieht folgendermassen aus:

define PM HTTPMOD http://192.168.70.90/cgi-bin/webgui.fcgi 60

attr PM requestHeader1 Content-Type: application/json
attr PM requestHeader2 Accept: */*
attr PM requestData {"get" :["34.4001.value" ,"34.4008.value" ,"34.4033.value"]}

attr PM readingsName1 PH
attr PM readingsRegex1 34.4001.value":[ \t]+"([\d\.]+)",

attr PM readingsName2 CL
attr PM readingsRegex2 34.4008.value":[ \t]+"([\d\.]+)",

attr PM readingsName3 TEMP
attr PM readingsRegex3 34.4033.value":[ \t]+"([\d\.]+)"

attr PM room Pool
attr PM stateFormat {sprintf("%.1f Grad, PH %.1f, %.1f mg/l Chlor", ReadingsVal($name,"TEMP",0), ReadingsVal($name,"PH",0), ReadingsVal($name,"CL",0))}

define FileLog_PM FileLog ./log/PM-%Y.log PM
attr FileLog_PM room Pool


rudolfkoenig

ZitatDas ganze klappt bei mir jedoch nur wenn ich Zeile 136 in HttpUtils auskommentiere.

Sorry, hab nur mit einem leeren $hash experimentiert, deswegen ist es mir nicht aufgefallen.
Habs jetzt gefixed und eingecheckt.

ZitatMacht das so Sinn in fhem oder gibt es da einen besseren Weg?
Ich finde es ok, und es faellt mir nichts besseres ein.

Jetzt fehlt noch testen und Doku mit einfachen Beispielen, und dann sollte es eingecheckt werden.

StefanStrobel

Hier eine neue Version mit einer verbesserten Fehlerbehandlung und etwas Doku (ich hoffe das Format ist ok so - habe es von einem anderen Modul übernommen).
Es würde mich freuen wenn jemand andere Anwendungsfälle hat und das Modul testen kann.

UliM

Hi Stefan,
ich find die Idee klasse und bin sicher, das auch selbst nutzen zu können und damit ein paar eigene Schmalspur-Parser sersetzen zu können.

Wäre es möglich, dass Du noch 1-2 erklärte Beispiel-Konfigs im Wiki hinterlegst?
In dem o.g. Beispiel ist für mich nicht klar, ob "34.4008.value" irgendwo im html-code der angeforderten Seite auftaucht oder ein beliebiger Name ist oder die 34.4008 irgendeine steuernde Funktion hat.
Auch ist mir nicht klar, was es mit den Header-Attributen auf sich hat, denn die Header-Info kommt doch mit der angeforderten Seite zurück?

Beste Grüße,
Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

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