Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

rtv

Zitat von: reibuehl am 20 Januar 2016, 21:27:02
Nach der Umstellung auf einzelne Readings und hinzufügen von readingXXEncode utf-8 funktionieren bei mir nun auch die Umlaute. Nur zu meinem Verständnis: Wie hätte man das bei extractAllJSON für alle readings definieren müssen?

Hallo! Ich habe auch (bei weather underground) das Problem, dass die Seite korrekt geholt wird und direkt nach dem Update die Readings in Ordnung sind, nach einem Refresh aber die Umlaute nicht richtig dargestellt werden. Würde aber gerne bei extractAllJSON bleiben...

StefanStrobel

Hallo,

ich setze das mal auf die Wunschliste für die nächste Überarbeitung. ExtractAllJSON könnte z.B. ein neues Attribut AllEncode verwenden ...

Gruss
    Stefan

StefanStrobel

Hallo Frank,

was ist denn Dein Anwendungsfall für die matched_readings?
Da HTTPMOD intern asynchron arbeitet und bei einem update-Zyklus die HTTP-Requests einfach in eine Queue packt und jede Response separat ausgewertet wird, ist beim Lesen nicht erkennbar, ob ein Zyklus tatsächlich vorbei ist und wann somit der richtige Zeitpunkt wäre um ein gesamt_matched_readings zu erzeugen...
Vielleicht lässt sich Dein Anwendungsfall ja auch anders lösen?

Gruss
    Stefan

frank

hallo stefan,

ZitatDa HTTPMOD intern asynchron arbeitet und bei einem update-Zyklus die HTTP-Requests einfach in eine Queue packt und jede Response separat ausgewertet wird, ist beim Lesen nicht erkennbar, ob ein Zyklus tatsächlich vorbei ist und wann somit der richtige Zeitpunkt wäre um ein gesamt_matched_readings zu erzeugen...
das hatte ich mir fast schon gedacht. vor allem auch im zusammenhang mit getXXpolldelay eigentlich unmöglich.

anwendung:
ich sammel von unterschiedlichen webseiten bereitgestellte firmware für homematic devices ein.
nach den requests wird gecheckt, ob es neue firmware für die eigenen devices gibt und entsprechend angezeigt. bisher hatte ich nur eine url für die daten und habe MATCHED_READINGS als auslöser (trigger für userreading) für den abschliessenden firmware check genutzt. ausserdem habe ich hier die liste aller aktuellen readings, um auf die daten zuzugreifen. zusätzlich können tote readings mit maxage gelöscht werden. http://www.fhemwiki.de/wiki/HomeMatic_Firmware_Update#Tool_zur_Firmware_Versionspr.C3.BCfung

bei erweiterung auf mehrere webseiten gibt es nun die beschriebenen probleme.

grundsätzlich habe ich nun einigermassen erfolgreich auf 2 userreadings umgebaut.
das erste wird durch MATCHED_READINGS getriggert, sammelt die readings ein und löscht ggf tote readings.
das zweite wird durchs erste getriggert und macht die auswertung.

problematisch wird es, wenn MATCHED_READINGS einen leeren string liefert (zb webseite verändert, oder nicht erreichbar). hier kann ich nicht erkennen, welches get gerade "geliefert" hat, um zb die entsprechenden readings nun zu löschen. wäre es denn möglich, im reading MATCHED_READINGS einen indikator voran zu stellen, um zu erkennen, welches get gerade geliefert hat?

ausserdem wäre es hilfreich, wenn die automatische nummerierung, auch bei nur einem erzeugten reading, die nummerierung benutzen würde. vielleicht könnte man dies abhängig von der benutzung des attributes AutoNumLen einführen, damit es nicht grundsätzlich wirksam ist.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

hartenthaler

Ich möchte die Luftgüteparameter der Berliner Luft auswerten. Aber ich hänge noch etwas mit dem variablen URL-Aufruf im HTTPMOD Modul unter Verwendung von replacement. Die Daten werden jeweils zum Vortag bereit gestellt und sind dann unter einer URL abrufbar in der das Datum vorkommt. In der URL Definition im HTTPMOD verwende ich das Wort "gestern" als Platzhalter und will es nun per replacement ersetzen. Das geht von Hand schon durch die folgende Definition:

Internals:
   DEF        http://www.stadtentwicklung.berlin.de/umwelt/luftqualitaet/de/messnetz/tageswerte/download/gestern.html 60
   NAME       Luftguete_Frohnau
   TYPE       HTTPMOD
...
Readings:
     2016-04-09 20:54:09   Zeitpunkt       08.04.16
...
Attributes:
   reading01Expr $val
   reading01Name Zeitpunkt
   reading01Regex Am <b>(.*)</b>
...
   replacement0Mode text
   replacement0Regex (gestern)
   replacement0Value 20160408
   stateFormat Zeitpunkt: SO2:so2tag/so2mittel µg/m³, Ozon: ozon1std/ozon8std µg/m³

Aber nun soll nicht der Text "gestern" in der URL durch den Text "20160408" ersetzt werden, was - wie gesagt - bereits gut klappt, sonder es soll natürlich jeweils das gestrige Datum verwendet werden. Also habe ich den replacement0Mode auf expression gesetzt, aber ich schaffe es nicht den replacement0Value richtig zu formulieren. Auf Shell-Ebene liefert der folgende Code den richtigen Wert:
perl -w -e '@yest=localtime(time-86400);printf "%d%.2d%.2d",$yest[5]+1900,$yest[4]+1,$yest[3];'
Aber wie bekomme ich das richtig in fhem formuliert?

Zum Testen hole ich mir die Seite derzeit alle 60 Sekunden, später will ich dann diesen HTTPMOD-Parameter auf 86400 setzen, also tägliches Abholen, oder macht man das geschickter mit einem at Kommando? Wie?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

Fritz007

Hallo zusammen,

ich bin erst seit Kurzem stolzer Besitzer eines RPI und tüftle grade mit FHEM rum. Zur Zeit versuche ich BACNet-Objektinformationen via Webservice Schnittstelle in FHEM mittels HTTPMOD Modul zu inkludieren.
Habe es meiner Meinung nach auch schon geschafft die Seite samt Informationen auszulesen. Leider bin ich daran gescheitert, Readings zu definieren womit ich den Wert des Present-Value auslesen kann.

Es wäre schön, wenn einer mal einen Blick auf die XML und die importierten Daten schaut und mir vielleicht einen Anstoß gibt, wie ich diese Daten auslesen kann.

Vielen Dank und schönen Gruß

Fritz

frank

Zitat von: hartenthaler am 10 April 2016, 17:56:30
Ich möchte die Luftgüteparameter der Berliner Luft auswerten. Aber ich hänge noch etwas mit dem variablen URL-Aufruf im HTTPMOD Modul unter Verwendung von replacement. Die Daten werden jeweils zum Vortag bereit gestellt und sind dann unter einer URL abrufbar in der das Datum vorkommt. In der URL Definition im HTTPMOD verwende ich das Wort "gestern" als Platzhalter und will es nun per replacement ersetzen. Das geht von Hand schon durch die folgende Definition:

Internals:
   DEF        http://www.stadtentwicklung.berlin.de/umwelt/luftqualitaet/de/messnetz/tageswerte/download/gestern.html 60
   NAME       Luftguete_Frohnau
   TYPE       HTTPMOD
...
Readings:
     2016-04-09 20:54:09   Zeitpunkt       08.04.16
...
Attributes:
   reading01Expr $val
   reading01Name Zeitpunkt
   reading01Regex Am <b>(.*)</b>
...
   replacement0Mode text
   replacement0Regex (gestern)
   replacement0Value 20160408
   stateFormat Zeitpunkt: SO2:so2tag/so2mittel µg/m³, Ozon: ozon1std/ozon8std µg/m³

Aber nun soll nicht der Text "gestern" in der URL durch den Text "20160408" ersetzt werden, was - wie gesagt - bereits gut klappt, sonder es soll natürlich jeweils das gestrige Datum verwendet werden. Also habe ich den replacement0Mode auf expression gesetzt, aber ich schaffe es nicht den replacement0Value richtig zu formulieren. Auf Shell-Ebene liefert der folgende Code den richtigen Wert:
perl -w -e '@yest=localtime(time-86400);printf "%d%.2d%.2d",$yest[5]+1900,$yest[4]+1,$yest[3];'
Aber wie bekomme ich das richtig in fhem formuliert?

Zum Testen hole ich mir die Seite derzeit alle 60 Sekunden, später will ich dann diesen HTTPMOD-Parameter auf 86400 setzen, also tägliches Abholen, oder macht man das geschickter mit einem at Kommando? Wie?
probiere mal so, oder so ähnlich:
sprintf("%d%.2d%.2d",(localtime(time-86400))[5]+1900,(localtime(time-86400))[4]+1,(localtime(time-86400))[3])
das tägliche pollen kannst du auf beide arten machen.
mit at hat wohl den vorteil, dass man den request auf eine bestimmte uhrzeit mit dem "attr my_at alignTime" festlegen könnte. dann müsstest du im def von httpmod für den zyclus "0" setzen und über das at ein "set Luftguete_Frohnau reread" ausführen.
eventuell muss man zum "freischalten" des befehls reread erst das attr enableControlSet setzen. einfach probieren.

so ein attribut wäre für httpmod natürlich auch was feines.  :)

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

frank

Zitat von: Fritz007 am 13 April 2016, 19:36:10
Hallo zusammen,

ich bin erst seit Kurzem stolzer Besitzer eines RPI und tüftle grade mit FHEM rum. Zur Zeit versuche ich BACNet-Objektinformationen via Webservice Schnittstelle in FHEM mittels HTTPMOD Modul zu inkludieren.
Habe es meiner Meinung nach auch schon geschafft die Seite samt Informationen auszulesen. Leider bin ich daran gescheitert, Readings zu definieren womit ich den Wert des Present-Value auslesen kann.

Es wäre schön, wenn einer mal einen Blick auf die XML und die importierten Daten schaut und mir vielleicht einen Anstoß gibt, wie ich diese Daten auslesen kann.

Vielen Dank und schönen Gruß

Fritz
was genau hast du denn schon probiert? das wiki und die commandref kennst du?
es gibt sicherlich viele möglichkeiten. zb mit reading01Name plus reading01Regex

regex kann man zb gut testen https://regex101.com/

eventuell mal diese regex probieren:
"present-value" value="([^"]+)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Fritz007

Hallo Frank,

vielen Dank für dein Feedback. Es funktioniert!
Habe wirklich nicht viel Ahnung davon und habe mir die beiden folgenden attr hinzugefügt:

reading01Name present-value

reading01XPath-Strict /Real[present-value]/text()

Habe mir verschiedene Codes angeschaut wo mit XML-Informationen gearbeitet wurde. Leider habe ich dazu nicht so viel gefunden. Somit kam der zweite attr zustande. Bin davon ausgegangen, dass man evtl. mit XPath mehr Funktionen des BACNet-Objekts nutzen kann. Evtl. Sollwerte verändern etc.

Vielleicht hast du noch einen Rat, wie ich ggf. Sollwerte mit der "set"-Funktion über XPath setzen kann?

Vielen Dank und Grüße
Fritz

StefanStrobel

#159
Hallo Frank,

hier mal ein Zwischen-Update:

Bei ShowMatched wird jetzt auch UNMATCHED_RADINGS und LAST_REQUEST gesetzt. Das sollte für Deinen Fall hilfreich sein. Per Last-Request kannst Du erkennen, welcher Get den Request ausgelöst hat.

Ich hab auch mal ein DeleteReadingOnError, DeleteReadingOnUnmatched sowie AlignTime auf die Wunschliste gepackt. mal sehen wann ich dazu komme.

Gruss
    Stefan

EDIT 28.4.16 Neuere Version in späterem Post

Luigi

Hallo,

ich versuche aus xml Werte mit XPath-Strict auszulesen.

z.b.

<root>
   <temperature id="01" value="8.0"/>
   <temperature id="02" value="-8.0"/>
</root>


mit attr xx reading01XPath-Strict //temperature/@value

werden folgende Readings angelegt:

unnamed01-1   value="8.0"
unnamed01-2   value="-8.0"

Ich möchte aber nur den Wert ohne "value=" im Reading haben.

Wie kann ich das erreichen?

Gruß
Luigi

StefanStrobel

Hallo Luigi,

ich selbst würde es statt mit XPath mit Regex machen.

id="01"[^0-9]+([\-0-9]+) oder ähnlich.

Wenn Du es mit XPath machen möchtest, würde ich einen eigenen Thread aufmachen, dem man ansieht, dass es eine XPath-Frage ist. Vielleicht sieht es dann ein XPath-Experte ;-)

Gruss
    Stefan

frank

#162
Zitat von: StefanStrobel am 16 April 2016, 14:47:59
Hallo Frank,

hier mal ein Zwischen-Update:

Bei ShowMatched wird jetzt auch UNMATCHED_RADINGS und LAST_REQUEST gesetzt. Das sollte für Deinen Fall hilfreich sein. Per Last-Request kannst Du erkennen, welcher Get den Request ausgelöst hat.

Ich hab auch mal ein DeleteReadingOnError, DeleteReadingOnUnmatched sowie AlignTime auf die Wunschliste gepackt. mal sehen wann ich dazu komme.

Gruss
    Stefan
danke, schaue ich mir demnächst genauer an.

edit: LAST_REQUEST funktioniert prächtig!  :)

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

StefanStrobel

#163
Hallo,

hier nochmal eine neue Version. Ich habe versucht eine sinnvolle Interpretation vom DeleteIfUnmatched und DeleteOnError einzubauen:


get|reading[0-9]*DeleteIfUnmatched

If set to 1 this attribute causes certain readings to be deleted when the parsing of the website does not match the specified reading. Internally HTTPMOD remembers which kind of operation created a reading (update, Get01, Get02 and so on). Specified readings will only be deleted if the same operation does not parse this reading again. This is especially useful for parsing that creates several matches / readings and the number of matches can vary from request to request. For example if reading01Regex creates 4 readings in one update cycle and in the next cycle it only matches two times the the readings containing the remaining values from the last round will be deleted.

get|reading[0-9]*DeleteOnError
If set to 1 this attribute causes certain readings to be deleted when the website can not be reached and the HTTP request returns an error. Internally HTTPMOD remembers which kind of operation created a reading (update, Get01, Get02 and so on). Specified readings will only be deleted if the same operation returns an error.

Gruss
    Stefan


Edit 9.5.16: angehängtes Modul entfernt, neue Version in späterem Post

Vize

Guten Abend zusammen,

nachdem ich hier bisher erfolglos versucht habe, über das Heimnetzwerk meinem Stromspeicher die passenden Werte zu entlocken, habe ich nun mal überlegt, ob es nicht auch vielleicht über die öffentliche Internetseite funktioniert.

Mein Problem ist, dass ich auch nach Studium des wikis überhaupt nicht weiß, wie ich HTTPMOD entsprechend einrichten muss, da die Seite einen login benötigt.
Ich habe mir den header etc. der Seite mal mit dem Firefox Inspektor angesehen und die entsprechenden screenshots beigefügt.

Nach dem login gelangt man auf die Übersichtseite, und der Reiter "Antwort" im Firefox Inspektor (https://mein-senec.de/monitoring/json/status/getstatusoverview.php?id=XXXXXXXXXX) liefert genau die Werte, die ich brauche.
Es wird wohl auch ein cookie mit session-id und einem "secret" bei jedem login und/oder nach gewisser Zeit erneuert...

Vielleicht könnt ihr mir ja weiterhelfen und/oder es für einen Dummie wie mich möglichst einfach erklären...  :-[
Mir steht da echt kein Wissen im Weg.

Vielen Dank schonmal für jegliche Hilfe!

Gruß
Andreas