Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hi Ronny,

Zitat von: FHEMAN am 20 März 2017, 00:17:02
Kann ich das alles in ein Define stecken?
Nehme ich dafür set01Data, set02Data (um das Input Field eines vorherigen Requests zu nutzen)? Werden die nacheinander abgearbeitet?
Ist set01Data genau so zu benutzen wie requestData?
Muss ich dann für jedes set einen Header (Content-Type etc.) set01Header etc. bauen, auch wenn der gleich ist?
Kann ich das extrahierte Input irgendwie on-the-fly als url-encoded abspeichern zur weiteren Nutzung?

die Attribute set01... gehören zum ersten Set. set02 zu einem zweiten Set.
Wenn Du die POST-Daten für den ersten Set auf mehrere Attribute verteilen möchtest, kannst Du set01Data01, set01Data02 etc. verwenden, Die werden verkettet.
set01Data wird ansonsten wie requestData verwendet, gilt aber für den Set-Befehl.
Um die Header nicht immer wieder zu kopieren kannst Du auch statt set01Header setHeader verwenden. Diese Attribute werden dann für alle Sets verwendet.
Speichern in einer Datei habe ich eigentlich nicht vorgesehen. Die Idee wäre eher die relevanten Daten eines früheren Requets in Readings zu legen und beim nächsten Request über die Replacement-Attribute wieder einzubauen.

Gruss / viel Erfolg
   Stefan

ares

Zitat von: FhemPiUser am 11 März 2017, 20:37:21
Gibt es die Möglichkeit mit einem attribut HTTPMOD zu sagen, dass es nur einen Teil einer HTTP-Seite abrufen soll? Ich möchte eine Webseite parsen, die ziemlich lang ist, benötige aber eigentlich nur die ersten 2kbyte. Optimal wäre, wenn ich ihm sagen könnte, er soll nur die ersten 2 kbyte abrufen...

Zitat von: StefanStrobel am 12 März 2017, 16:09:14
Hallo FhemPiUser,

so eine Möglichkeit gibt es derzeit nicht.

Gruss
    Stefan

Hallo Stefan,

an langen HTTP-Seiten stört mich aktuell eher das laaaaaange Internal buf.
Kann man das vielleicht ohne großen Aufwand optional "nicht" bzw. mit ".buf" statt "buf" speichern oder hast Du andere Vorschläge für eine kürzere Anzeige?

Viele Grüße
Manfred

BillyPbg

[quote author=StefanStrobel link=topic=45176.msg608865#msg608865 date=1490046826]
...
ich verstehe zwar nicht was Dein Abfallkalender mit HTTPMOD zu tun hat,
aber spontan würde ich die entsprechenden Zeilen in Deine MyUtils.pm fixen.
...


Hallo Stefan,

was HTTPMOD mit dem ('MUELL'-)Calendar-Modul zu tun hat, versteh' ich auch nicht.
Ich kann Dir jedoch mein Recherche-Ergebnis mitteilen...

Nachdem ich nicht vom Fach bin, habe ich nach der Methode "Try and Error", unterstützt durch 'Winmerge' das Folgende herausgefunden:

Die Meldungen werden ausgelöst, unabhägig voneinander, in Zeile 473, 503, 539 und 1685:  Jeweils " $SIG{__WARN__} = 'DEFAULT'; " (Siehe Anlage, mit '#Bi' versehene Zeilen)
Seitdem ich diese Zeilen ausge-'#' hatte, war alles unauffällig.
Ich hoffe, Du kannst damit was anfangen...

Wenn ich Dir mit weiteren Zulieferungen zum Nachbau weiterhelfen kann, gerne.

VG.
BillyPbg

PS:
Danke für Deinen Fix-Vorschlag, wurde sofort umgesetzt, hatte aber keine Auswirkung auf das Fehlerbild.

StefanStrobel

Hallo,

das ist vermutlich die falsche Stelle.
Ich definiere vor der Evaluation von Perl-Code aus Attributen einen eigenen Handler für Warnings um eben diese Warnings besser ins Log zu packen. Direkt danach setze ich den Handler zurück auf Default.
Wenn Du diese Zeilen auskommentierst ist es klar dass die Warnings nach wie vor abgefangen werden. Damit bekämpfst Du aber nur das Symptom und nicht die Ursache...

Wenn Du wie von mir empfohlen den Code in Deiner MyUtils an allen relevanten Stellen änderst, so dass ein undef als Rückgabewert des Get-Aufrufs erkannt wird, wäre das am saubersten.
Die Änderung in Zeile 411 alleine reicht natürlich noch nicht.

Gruss
    Stefan

StefanStrobel

Hallo Manfred,

wegen der langen Anzeige von buf werde ich mir was überlegen.

Gruss
   Stefan

JoeALLb

Zitat von: StefanStrobel am 21 März 2017, 18:13:28
Hallo Manfred,

wegen der langen Anzeige von buf werde ich mir was überlegen.

Gruss
   Stefan
An diesen Wunsch hänge ich mit dran, mein buf bringt einen Handybrowser zum Absturz.

Danke, SG Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

FHEMAN

Zitat von: StefanStrobel am 20 März 2017, 23:23:23
Hi Ronny,

die Attribute set01... gehören zum ersten Set. set02 zu einem zweiten Set.
Wenn Du die POST-Daten für den ersten Set auf mehrere Attribute verteilen möchtest, kannst Du set01Data01, set01Data02 etc. verwenden, Die werden verkettet.
set01Data wird ansonsten wie requestData verwendet, gilt aber für den Set-Befehl.
Um die Header nicht immer wieder zu kopieren kannst Du auch statt set01Header setHeader verwenden. Diese Attribute werden dann für alle Sets verwendet.
Speichern in einer Datei habe ich eigentlich nicht vorgesehen. Die Idee wäre eher die relevanten Daten eines früheren Requets in Readings zu legen und beim nächsten Request über die Replacement-Attribute wieder einzubauen.

Gruss / viel Erfolg
   Stefan

Okay, ich habe es nun in zwei separate Defines gepackt und lese die Readings mit notify aus. Das klappt ganz gut.
Nun ist es so, dass wenn ein readingXRegex nicht matcht, dass dann trotzdem etwas im Reading stehen bleibt. Ich würde es gerne leer haben, um mit einem Event darauf zu reagieren. Also wenn die Seite nichts anzeigt, dann soll das Reading gelöscht werden.
Gibt es dafür eine Einstellung?

Viele Grüße
Ronny

PS: Schöner Timestamp übrigens von Deinem Posting :)
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

ares


frank

Zitat von: FHEMAN am 22 März 2017, 02:38:35
Okay, ich habe es nun in zwei separate Defines gepackt und lese die Readings mit notify aus. Das klappt ganz gut.
Nun ist es so, dass wenn ein readingXRegex nicht matcht, dass dann trotzdem etwas im Reading stehen bleibt. Ich würde es gerne leer haben, um mit einem Event darauf zu reagieren. Also wenn die Seite nichts anzeigt, dann soll das Reading gelöscht werden.
Gibt es dafür eine Einstellung?

Zitatget|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 this 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 then the readings containing the remaining values from the last round will be deleted.
Please note that this mechanism will not work in all cases after a restart. Especially when a get definition does not contain its own parsing definition but ExtractAllJSON or relies on HTTPMOD to use all defined reading.* attributes to parse the responsee to a get command, old readings might not be deleted after a restart of fhem.
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

mahowi

Zitat von: mahowi am 14 März 2017, 23:31:22
Kann ich eigentlich auch irgendwie ein "HTTP DELETE" mit HTTPMOD abschicken? Ich kann bei meiner Heizungssteuerung (tado°) per PUT in den manuellen Modus mit einer bestimmten Temperatur schalten. Um aber wieder in den Automatikmodus zu gehen, muß ich die manuelle Kontrolle per "DELETE" wieder löschen. Die Beschreibung gibt es unter /api/v2/homes/<homeID>/zones/1/overlay auf The Tado API v2 in Stephen C Phillips' Blog.
Weiß dafür jemand ne Antwort? Oder vielleicht eine Möglichkeit, das mit FHEM Mitteln anders zu machen?
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

frank

Zitat von: mahowi am 22 März 2017, 10:11:30
Weiß dafür jemand ne Antwort? Oder vielleicht eine Möglichkeit, das mit FHEM Mitteln anders zu machen?
hast du mal versucht den angegebenen curl-befehl auf perl-ebene mit dem befehl system oder qx zu senden?
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

mahowi

Stimmt, daran hatte ich gar nicht gedacht. Das müsste gehen. Sollte auch mit Perl und HTTP::Request->new(DELETE => $url); funktionieren.

Schön wäre natürlich, wenn das auch direkt in HTTPMOD möglich wäre.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

StefanStrobel

HTTPMOD verwendet bisher die HttpUtils von Fhem als Basis.
Um Delete zu unterstützen, müssten diese erweitert werden.
Da der Anwendungsfall aber extrem selten ist, vermute ich dass es sinnvoller ist in so einem Fall eine individuelle Lösung zu suchen (externer Aufruf oder Perl code ...)

Gruss
    Stefan

mahowi

Ok. Ich hatte mir die HttpUtils.pm noch nicht so genau angesehen. Im Wiki habe ich nur den Eintrag über $param->{method} gefunden:
ZitatDie HTTP-Methode, welche zur Abfrage verwendet werden soll. Sofern keine Daten übertragen werden ist dies standardmäßig "GET", ansonsten "POST". Es können aber auch andere Methoden verwendet werden.
Standardwert: "GET"

Den Parameter scheint es aber nur bei HttpUtils_BlockingGet zu geben, zumindest laut Wiki.

Aber Du hast recht, der Anwendungsfall für was anderes als POST oder GET ist wirklich selten.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

FHEMAN

Hallo Manfred, hallo Frank, danke für Eure Hinweise. (Ich hatte mich zuletzt am veralteten Wiki aufgehalten) Mit readingXDeleteIfUnmatched funktioniert es nun.

Gibt es so eine Funktion auch für das LAST_RERROR Reading? Ich möchte gerne, dass sich das bei erfolgreichem Response löscht.

Gruß
Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB