Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

ares

Zitat von: FHEMAN am 27 März 2017, 00:31:35
Gibt es so eine Funktion auch für das LAST_RERROR Reading? Ich möchte gerne, dass sich das bei erfolgreichem Response löscht.

Nein, da das Reading den letzten Fehler und nicht den aktuellen Verbindungsstatus anzeigen soll.
Was möchtest Du denn damit erreichen? Eventuell funktioniert ja die Umkehr und Du kennzeichnest nicht aktuelle Daten mit Hilfe von MaxAge als nicht aktuell".

Viele Grüße
Manfred

frank

erfolgreiche aktionen stelle ich durch auswerten des readings MATCHED_READINGS fest.
mit einem notify auf MATCHED_READINGS könntest du es checken und zb das reading LAST_ERROR löschen oder mit setreading überschreiben.
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

Hallo,

anbei eine neue Version zum Testen.
Es gibt jetzt ein Attribut mit Namen removeBuf. Wenn das auf 1 gesetzt wird, löscht HTTPMOD im Read Callback das Internal Buf. Dieses wird von den Fhem HttpUtils erzeugt / verwendet und ist in manchen Anwendungsfällen störend.

Gruss
    Stefan

ares

Hallo Stefan,

funktioniert... Buf wird beim Aktualisieren nach wie vor vorübergehend angezeigt, dann jedoch gelöscht. Nicht ganz perfekt, aber deutlich angenehmer als die dauerhafte Anzeige.

Danke
Manfred

StefanStrobel

Hallo Manfred,

komplett verhindern kann ich die Erzeugung von Buf nicht. Das machen eben die HttpUtils.

Gruss
    Stefan

ares

Zitat von: StefanStrobel am 27 März 2017, 20:24:39
Hallo Manfred,

komplett verhindern kann ich die Erzeugung von Buf nicht. Das machen eben die HttpUtils.

Gruss
    Stefan

Speichern die HttpUtils das sofort als Reading oder machst Du das im Modul? Mit den HttpUtils habe ich mich noch nicht befasst, Dein Modul macht zum Glück soviel, dass ich mich mit meinem Modul einfach drauf gesetzt habe. Aber wenn ich mir das Device ansehe, dann ist es zumindest meistens kürzer, also schon mal sehr angenehm!

Viele Grüße
Manfred

StefanStrobel

Hallo,

Buf ist kein Reading sondern ein Internal bzw. aus Modulsicht einfach nur die Variable $hash->{Buf}.
die HttpUtils verwenden diese Variable beim Lesen der Antwort aus der HTTP-Verbindung.
Das neue Attribut führt dazu dass HTTPMOD die Variable bei der ersten Gelegenheit löscht.
Hübscher könnte es nur werden, wenn man HttpUtils patcht, aber das würde möglicherweise bei anderen Modulen zu Problemen führen.

Gruss
   Stefan

JackWolfskind

#397
Leider gelingt es mir nicht gültige JSON Daten per HTTPMod von einem SolarLog zu erhalten.

Auf dem Raspi per Curl klappt es sogar einzeln die möglichen JSON Werte abzufragen, z.B.so:
curl -X POST -H "Content-Type: application/json" -d '{"782":{"0":null,"1":null,"2":null}} ' solarlog/getjp
liefert mir -> {"782":{"0":"223","1":"0","2":"14"}}
Auch mit NodeRed kriege ich eine korrekte Antwort.

Nur wenn ich das gleiche per HTTPMOd versuche:
attr solarlogJSON getData {"get" :["782":{"0":null,"1":null,"2":null}]}   

klappt die Zerlegung nicht da ich nur eine ungültige JSON Antwort im BUF bekomme: >:(
2017.04.19 16:08:15 3: solarlogJSON: error while parsing JSON data: , or } expected while parsing object/hash, at character offset 10 (before ":{"0":"171","1":"104...") at (eval 15234) line 1.

buf=HTTP/1.0 200 OK Date: Wed, 19 Apr 2017 16:08:18 GMT Server: IPC@CHIP Content-Type: text/plain {"0":"782":{"0":"171","1":"1040","2":"45"....

Das hier: {"0":"782": ist eindeutig nicht valide, aber warum liefert mir nur HTTPMOD eine falsche Antwort? Ist mein Get falsch formatiert oder geht da was in der Verarbeitung in HTTPMOD durcheinander?
Gruss,
Frank
HW Entwickler mit diversen Raspi Projekten z.B. FHEM, OpenHab, IOBroker, NodeRed, Airconnect,Waermepumpen und Lunos Lueftungssteuerung...

StefanStrobel

Hallo Frank,

warum schickst Du mit HTTPMOD eine andere Anfrage als mit CURL?
{"get" :["782":{"0":null,"1":null,"2":null}]}
statt
{"782":{"0":null,"1":null,"2":null}}

Was für Header schickst Du denn bei HTTPMOD mit?
Wenn Du wirklich die gleiche Anfrage hinschickst, wird auch die gleiche Antwort kommen ...

Gruss
   Stefan

JackWolfskind

 ???da hab ich wohl das PoolManager Beispiel auf deiner? HTTPMOD Wiki Seite voellig falsch verstanden  ;D
Ja wenn ich jetzt das "get" wegmache klappts auch mit der gleichen Antwort !!!
Jetzt ueb ich mich mal am JSON zerlegen  ;)

Vielen Dank fuer die schnelle Antwort!
Frank
HW Entwickler mit diversen Raspi Projekten z.B. FHEM, OpenHab, IOBroker, NodeRed, Airconnect,Waermepumpen und Lunos Lueftungssteuerung...

StefanStrobel

Hallo,

anbei eine neue Version mit verbessertem Warning-Handler für Expressions aus Attributen.
Es wäre schön wenn Ihr kurz prüfen könntet, ob die Version bei Euch Probleme macht, bevor ich sie einchecke.

Gruss / Thanx
    Stefan

andies

Ich habe ein Problem mit dem löschen alter Readings. Hier das Listing
Internals:
   BUSY       0
   DEF        http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg 0
   Interval   0
   LASTSEND   1494963610.13992
   MainURL    http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
   MaxAgeEnabled 1
   ModuleVersion 3.3.11 - 8.5.2017
   NAME       BVG
   NR         122
   STATE      22 min und 17 min (21:40)
   TRIGGERTIME 0
   TRIGGERTIME_FMT
   TYPE       HTTPMOD
   addr       http://transportrest-sbiermann.rhcloud.com:80
   buf
   code       200
   conn
   data
   displayurl http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
   header
   host       transportrest-sbiermann.rhcloud.com
   httpheader HTTP/1.1 200 OK

Date: Tue, 16 May 2017 19:40:11 GMT

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=UTF-8

Content-Length: 389

Vary: Accept-Encoding

Connection: close
   httpversion 1.0
   hu_blocking 0
   hu_filecount 1
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /departureFHEM?from=9051371&provider=Bvg
   protocol   http
   redirects  0
   timeout    30
   url        http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
   value      0
   QUEUE:
   Readings:
     2017-05-16 21:40:12   Uni1            22
     2017-05-15 17:18:58   Uni2            17
     2017-05-15 17:18:58   Uni3            20
   Request:
     data
     header
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
     value      0
   Defptr:
     Readingbase:
       Uni1       reading
     Readingnum:
       Uni1       01
     Readingoutdated:
     Requestreadings:
       Update:
         Uni1       reading 01
   Sslargs:
Attributes:
   alias      X10 ab Oskar-Helene
   enableControlSet 1
   eventMap   /reread:einlesen/
   group      BVG
   reading01-1Name Uni1
   reading01-2Name Uni2
   reading01-3Name Uni3
   reading01MaxAge 60
   reading01MaxAgeReplacementMode delete
   reading01Name Uni1
   reading01OExpr $val
   reading01RegOpt g
   reading01Regex \[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d\d+)\"\]
   reading01URL http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
   room       App,Unsorted
   stateFormat {my $zeit = ReadingsTimestamp("$name","Uni1",0);
$zeit =~ /.* (\d\d:\d\d).*/; # Abruf-Uhrzeit extrahieren
$zeit = sprintf("%.f"." min",ReadingsVal($name,"Uni1","-1"))." und ".
sprintf("%.f"." min",ReadingsVal($name,"Uni2","-1"))." (".$1.")";# Ausgabe Readings
$zeit =~ s/und -1 min//; # evtl fehlendes Reading loeschen
return $zeit}
   timeout    30
   userattr   reading01-1Name reading01-2Name reading01-3Name reading01MaxAge reading01MaxAgeReplacementMode reading01MaxAgeReplacementMode:text,reading,internal,expression,delete reading01Name reading01OExpr reading01RegOpt reading01Regex reading01URL
   webCmd     einlesen


und der Fehler, wenn es denn einer ist, besteht darin, dass die alten Readings erhalten bleiben:
Readings
Uni1 22 2017-05-16 21:40:12
Uni2 17 2017-05-15 17:18:58 <== dieser hier
Uni3 20 2017-05-15 17:18:58 <== und dieser hier
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

StefanStrobel

Hallo andies,

das ist seltsam. Eigentlich sollte unter defptr und readingBase ein Eintrag für die alten Reafings stehen. Der wird von MaxAge verwendet und fehlt bei Dir im Listing.
Bei einem Fhem Neustart sollte dieser Eintrag zudem rekonstruiert werden.

Könntest Du ein Log mit Verbose 5 erzeugen, bei dem man sieht, wie eines der veralteten Readings erzeugt wird und was beim Neustart von Fhem in updateRequestHash passiert?

Oder möchtest Du evt. eher das Attribut deleteIfUnmatched verwenden?

Gruß
    Stefan

andies

Danke für die Hilfe! Ich habe erstmal (von unterwegs) mit verbose 5 einen neuen Abruf gemacht sowie vorab einen Neustart (bei dem aber verbose vergessen). Meine Vermutung ist, dass da schon das Problem erkennbar sein könnte, leider für mich als Anfänger nicht:


2017.05.18 08:26:01 5: BVG: set called with reread
2017.05.18 08:26:01 4: BVG: GetUpdate called (reread)
2017.05.18 08:26:01 4: BVG: AddToQueue adds update, initial queue len: 0
2017.05.18 08:26:01 5: BVG: AddToQueue adds type update to URL http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg, no data, no headers, retry 0
2017.05.18 08:26:01 5: BVG: HandleSendQueue called, qlen = 1
2017.05.18 08:26:01 4: BVG: HandleSendQueue sends request type update to URL http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg, No Data, No Header,
timeout 30
2017.05.18 08:26:01 4: HttpUtils url=http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
2017.05.18 08:26:01 5: HttpUtils request header:
GET /departureFHEM?from=9051371&provider=Bvg HTTP/1.0
Host: transportrest-sbiermann.rhcloud.com
User-Agent: fhem
Content-Length: 0
Content-Type: application/x-www-form-urlencoded

2017.05.18 08:26:04 4: http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg: HTTP response code 200
2017.05.18 08:26:04 4: HttpUtils http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg: Got data, length: 365
2017.05.18 08:26:04 5: HttpUtils response header:
HTTP/1.1 200 OK
Date: Thu, 18 May 2017 06:26:04 GMT
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 365
Vary: Accept-Encoding
Connection: close
2017.05.18 08:26:04 4: BVG: Read callback: request type was update retry 0,
Header: HTTP/1.1 200 OK
Date: Thu, 18 May 2017 06:26:04 GMT
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 365
Vary: Accept-Encoding
Connection: close,
Body: [["X10","S+U Zoologischer Garten","2"],["285","Dahlem Waldfriedhof","2"],["X10","Rammrath-Brücke","6"],["115","U Fehrbelliner Platz","10"],["115","Düppel-Süd, Neuruppiner Str.","12"],["X10","S+U Zoologischer Garten","14"],["285","S+U Rathaus Steglitz","15"],["X10","S Teltow Stadt","19"],["X10","S+U Zoologischer Garten","19"],["285","Dahlem Waldfriedhof","24"]]
2017.05.18 08:26:04 5: BVG: ExtractSid called, context reading, num
2017.05.18 08:26:04 5: BVG: MaxAge: check reading Uni1
2017.05.18 08:26:04 5: BVG: MaxAge: reading Uni1 doesn't come from a -Name attr -> skipping
2017.05.18 08:26:04 5: BVG: MaxAge: check reading Uni2
2017.05.18 08:26:04 5: BVG: MaxAge: reading Uni2 doesn't come from a -Name attr -> skipping
2017.05.18 08:26:04 5: BVG: MaxAge: check reading Uni3
2017.05.18 08:26:04 5: BVG: MaxAge: reading Uni3 doesn't come from a -Name attr -> skipping
2017.05.18 08:26:04 4: BVG: CheckAuth decided no authentication required
2017.05.18 08:26:04 5: BVG: UpdateReadingList created list of reading.* nums to parse during getUpdate as 01
2017.05.18 08:26:04 5: BVG: Read starts parsing response to update with defined readings: 01
2017.05.18 08:26:04 5: BVG: ExtractReading Uni1 with regex /\[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d\d+)\"\]/g ...
2017.05.18 08:26:04 5: BVG: 2 capture group(s), matchlist = 14,19
2017.05.18 08:26:04 5: BVG: FormatReading changed value with Expr $val from 14 to 14
2017.05.18 08:26:04 4: BVG: ExtractReading for reading01-1 sets Uni1 to 14
2017.05.18 08:26:04 5: BVG: FormatReading changed value with Expr $val from 19 to 19
2017.05.18 08:26:04 4: BVG: ExtractReading for reading01-2 sets Uni2 to 19
2017.05.18 08:26:04 4: BVG: Read response to update matched Reading(s) Uni1 Uni2
2017.05.18 08:26:04 5: BVG: HandleSendQueue called, qlen = 0



Gesendet von iPhone mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

PS deleteifunmatched scheint mein konkretes Problem zu lösen.


Gesendet von iPhone mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann