Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo Stefan,

ein bisher gut funktionierendes Device spukt auf einmal folgende Einträge im logfile aus:
2021.12.06 21:53:16.477 3: Onvista: error in findvalues for XPathTree: Can't call method "findnodes_as_strings" on an undefined value at .//FHEM/98_HTTPMOD.pm line 1589.

Die dazugehörige URL funktioniert an und für sich, spukt aber vorher den obligatorischen Datenwarnhinweis aus - kann es daran liegen?
Welche Informationen benötigst du eventuell noch, um dir ein Bild zu machen?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

ch.eick

Zitat von: Gisbert am 06 Dezember 2021, 22:21:58
Hallo Stefan,

ein bisher gut funktionierendes Device spukt auf einmal folgende Einträge im logfile aus:
2021.12.06 21:53:16.477 3: Onvista: error in findvalues for XPathTree: Can't call method "findnodes_as_strings" on an undefined value at .//FHEM/98_HTTPMOD.pm line 1589.

Die dazugehörige URL funktioniert an und für sich, spukt aber vorher den obligatorischen Datenwarnhinweis aus - kann es daran liegen?
Welche Informationen benötigst du eventuell noch, um dir ein Bild zu machen?
Hallo Gisbert,
ich denke ein verbose 5 Log wäre ein super Anfang, da sieht man dann was vom Device kommt und wie es gescannt wird.
VG Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

StefanStrobel

Hallo Gisbert,

werden denn noch Readings aktualisiert oder kommt die Meldung bei jedem Request?
Ich würde ja vermuten, dass davor schon ein Timeout oder ein anderer Fehler kommt und dass die Meldung nur eine Folge davon ist, dass keine Daten gelesen werden konnten, aber um das mit Gewissheit sagen zu können, wäre ein längerer Auszug aus dem Log bei verbose 5 (wie von Christian korrekterweise empfohlen) nötig.
Dazu wäre Deine Konfiguration sehr hilfreich.

Gruss
   Stefan

Gisbert

Hallo Stefan,
hallo Christian,

hier ist ein log-Auszug beim Befehl "get Onvista Gold" (es handelt sich um einen Gold-ETF):
2021.12.07 20:24:06.297 5: Onvista: get called with Gold
2021.12.07 20:24:06.298 5: Onvista: get found option Gold in attribute get03Name
2021.12.07 20:24:06.298 4: Onvista: get will now request Gold, no optional value
2021.12.07 20:24:06.300 5: Onvista: AddToQueue adds type get03 to URL https://www.onvista.de/derivate/etc-etn/XETRA-GOLD-DE000A0S9GB0, no data, no headers, retry 0, initial queue len: 0
2021.12.07 20:24:06.300 5: Onvista: HandleSendQueue called from AddToSendQueue, qlen = 1
2021.12.07 20:24:06.300 4: Onvista: HandleSendQueue sends get03 with timeout 10 to https://www.onvista.de/derivate/etc-etn/XETRA-GOLD-DE000A0S9GB0, No Data, No Header
2021.12.07 20:24:06.607 5: Onvista: ReadCallback called from __ANON__
2021.12.07 20:24:06.607 4: Onvista: Read callback: request type was get03 retry 0,
header: HTTP/1.1 308 Permanent Redirect
Server: nginx
Date: Tue, 07 Dec 2021 19:24:06 GMT
Content-Length: 0
Connection: close
x-matched-path: /derivate/[...index]
cache-control: max-age=86400, public
refresh: 0;url=/derivate/ETCs/18869269-A0S9GB-DE000A0S9GB0
location: /derivate/ETCs/18869269-A0S9GB-DE000A0S9GB0
x-vercel-cache: HIT
age: 25850
x-vercel-id: fra1::fra1::nqf25-1638905046430-87b250757190
strict-transport-security: max-age=63072000, no body
2021.12.07 20:24:06.607 5: Onvista: Read callback: body empty
2021.12.07 20:24:06.608 4: Onvista: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2021.12.07 20:24:06.608 5: Onvista: GetCookies is looking for Cookies
2021.12.07 20:24:06.608 5: Onvista: ExtractSid called, context get, num 03
2021.12.07 20:24:06.608 4: Onvista: checking for redirects, code=308, ignore=0
2021.12.07 20:24:06.608 4: Onvista: no redirects to handle
2021.12.07 20:24:06.608 5: Onvista: Read callback sets LAST_REQUEST to get03
2021.12.07 20:24:06.609 5: Onvista: CheckAuth decided no authentication required
2021.12.07 20:24:06.609 5: Onvista: ExtractReading Gold with XPath //h3[contains(.,"Geld")]/../div[contains(.,"EUR")]/span[contains(.,"EUR")]
2021.12.07 20:24:06.609 3: Onvista: error in findvalues for XPathTree: Can't call method "findnodes_as_strings" on an undefined value at .//FHEM/98_HTTPMOD.pm line 1589.

2021.12.07 20:24:06.609 5: Onvista: ExtractReading Gold did not match
2021.12.07 20:24:06.610 4: Onvista: Read response to get03 didn't match any Reading
2021.12.07 20:24:06.662 5: Onvista: HandleSendQueue called from ReadCallback, qlen = 0
2021.12.07 20:24:06.662 5: Onvista: HandleSendQueue found no usable entry in queue


Auszug aus meiner Definition (nur der relevante Part, der nicht funktionierte; andere Abfragen auf einer anderen Seite laufen nach wie vor).
Letztes Reading zu dieser Abfrage: 2021-11-30 16:13:15
defmod Onvista HTTPMOD <IP-Adresse einer anderen Seite, die funktioniert> 1200
attr Onvista enableControlSet 1
attr Onvista event-min-interval .*:15
...
attr Onvista get03Name Gold
attr Onvista get03OExpr $val =~ s/\.//g;; $val =~s/\,/./g;; $val =~s/EUR//g;; $val =~s/\s+$//;; $val
attr Onvista get03Poll 1
attr Onvista get03URL https://www.onvista.de/derivate/etc-etn/XETRA-GOLD-DE000A0S9GB0
attr Onvista get03XPath //h3[contains(.,"Geld")]/../div[contains(.,"EUR")]/span[contains(.,"EUR")]
...


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

StefanStrobel

Hallo Gisbert,

die Seite ist umgezogen und meldet das leider mitt status code 308 statt 301,302 oder 303.
Das ist in den HttpUtils und HTTPMOD nicht implementiert.
Kurzfristig kannst Du einfach Deine Konfiguration anpassen. Die neue URL findest Du im Log.
Unabhängig davon sollte HttpUtils und HTTPMOD erweitert werden, so dass auch 308 erkannt wird.

Gruß
    Stefan

Gisbert

Zitat von: StefanStrobel am 07 Dezember 2021, 21:20:17
Hallo Gisbert,

die Seite ist umgezogen und meldet das leider mitt status code 308 statt 301,302 oder 303.
Das ist in den HttpUtils und HTTPMOD nicht implementiert.
Kurzfristig kannst Du einfach Deine Konfiguration anpassen. Die neue URL findest Du im Log.
Unabhängig davon sollte HttpUtils und HTTPMOD erweitert werden, so dass auch 308 erkannt wird.

Gruß
    Stefan

Hallo Stefan,

ich hab die veränderte URL eingetragen, bekomme aber immer noch keinen Wert rein. Heißt das, dass diese Seite prinzipiell von Fhem HTTPMOD in der jetzigen Fassung nicht auszuwerten ist?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

StefanStrobel

Hallo Gisbert,

vielleicht hat sich nicht nur die URL geändert.
Das müsste man genauer ansehen.

Gruß
    Stefan

rudolfkoenig

Zitatdie Seite ist umgezogen und meldet das leider mitt status code 308 statt 301,302 oder 303.
Das ist in den HttpUtils und HTTPMOD nicht implementiert.
Ich habe 308 in HttpUtils zu der Liste der Redirect-Codes hinzugefuegt, aber ohne eine spezielle Behandlung.

StefanStrobel

@Rudi: Vielen Dank!

@Gisbert: ich habe es gerade mal angesehen und da kommen sehr viele Daten zurück, aber vermutlich ist die Struktur eine neue. Du musst also auch die xpath-Abfrage anpassen. Da bin ich aber nicht der Spezialist.

Gruss
   Stefan

Gisbert

Hallo Stefan,

vielen Dank für deine Unterstützung. Ich bin zu der gleichen Einschätzung gekommen und habe die Konsequenz gezogen diese Abfrage ganz sein zu lassen, da ich nicht wirklich einen Plan habe, diese Daten aus der Seite herauszubekommen.
Für Finanzdaten gibt es spezialisierte Tools; man muss vielleicht nicht versuchen, alles mit FHEM lösen zu wollen.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

gestein

#1120
Hallo,

Mal eine allgemeine Frage: Wie kann ich mit HTTPMOD feststellen, ob eine Seite offline ist?

Bis jetzt lasse ich mir mit dem Attribut "showError" den letzten Fehler anzeigen und suche darin nach dem Text "timed out".
Da aber das Reading nicht gelöscht wird, wenn kein Fehler mehr auftritt, muss ich auch noch die Zeitstempel vergleichen.
Gibt es ein neueres Reading (hier das Reading "mode"), dann wird der Inhalt von "mode" angezeigt.

Bei mir sieht das dann so aus:
stateFormat
{my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0) lt ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}


Gibt es dafür nicht eine allgemeinere, einfachere Methode?

Danke im Voraus
lg, Gerhard

StefanStrobel

Halo Gerhard,

da gibt es mehrere Möglichkeiten:
Zitat
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.

oder (nicht ganz so passend) auch
Zitat
get|reading[0-9]*MaxAge
    Defines how long a reading is valid before it is automatically overwritten with a replacement when the read function is called the next time.
get|reading[0-9]*MaxAgeReplacement
    specifies the replacement for MaxAge - either as a static text or as a perl expression.
get|reading[0-9]*MaxAgeReplacementMode
    specifies how the replacement is interpreted: can be text, expression and delete.

Gruss
   Stefan

gestein

Hallo Stefan,

ich hatte das mit dem Alter eines Readings versucht, aber es klappt nicht so wie gewünscht.
In meinem Device wird das Reading mode zyklisch upgedatet.
Wenn das Device offline ist, soll dort "offline" stehen.

Also habe ich folgendes definiert:
attr Twinkly_icicle_144 reading01MaxAge 120
attr Twinkly_icicle_144 reading01MaxAgeReplacement offline
attr Twinkly_icicle_144 reading01MaxAgeReplacementMode text
attr Twinkly_icicle_144 reading01Name mode


Aber das klappt nicht.

Danke im Voraus
lg, Gerhard

Sailor

Moin zusammen

Ich habe mir fuer meine Tide ein HTTPMOD zusammengestellt was auch sehr gut funktioniert:


Internals:
   BUSY       0
   CFGFN      ./cfg/Room_OS.cfg
   DEF        http://exnatura.de:9099/locations/4073.html 21600
   FUUID      5c4993d2-f33f-02bc-ffab-7b6f3463287b4127
   Interval   21600
   MainURL    http://exnatura.de:9099/locations/4073.html
   ModuleVersion 4.1.10 - 6.7.2021
   NAME       OS_Tide_Stadersand
   NOTIFYDEV  global
   NR         2943
   NTFY_ORDER 50-OS_Tide_Stadersand
   STATE      LW: 14.12.2021 18:58 CET   0.79 HW: 14.12.2021 12:06 CET   3.68
   TYPE       HTTPMOD
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       http://exnatura.de:9099
     auth       0
     code       200
     compress   1
     conn       
     data       
     displayurl http://exnatura.de:9099/locations/4073.html
     header     
     host       exnatura.de
     httpheader HTTP/1.0 200 OK
MIME-version: 1.0
Content-type: text/html
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    9099
     hu_portSfx :9099
     ignoreredirects 1
     loglevel   4
     path       /locations/4073.html
     protocol   http
     redirects  0
     timeout    10
     url        http://exnatura.de:9099/locations/4073.html
     sslargs:
   QUEUE:
   READINGS:
     2021-12-14 09:00:57   High_Tide-1     14.12.2021 12:06 CET   3.68
     2021-12-14 09:00:57   High_Tide-2     

     2021-12-14 09:00:57   Low_Tide-1      14.12.2021 18:58 CET   0.79
     2021-12-14 09:00:57   Low_Tide-2     

   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        http://exnatura.de:9099/locations/4073.html
   defptr:
     readingBase:
       High_Tide-1 reading
       High_Tide-2 reading
       Low_Tide-1 reading
       Low_Tide-2 reading
     readingNum:
       High_Tide-1 02
       High_Tide-2 02
       Low_Tide-1 01
       Low_Tide-2 01
     readingOutdated:
     readingSubNum:
       High_Tide-1 -1
       High_Tide-2 -2
       Low_Tide-1 -1
       Low_Tide-2 -2
     requestReadings:
       update:
         High_Tide-1 reading 02-1
         High_Tide-2 reading 02-2
         Low_Tide-1 reading 01-1
         Low_Tide-2 reading 01-2
Attributes:
   DbLogExclude .*
   alias      Tide Stadersand
   enableControlSet 1
   icon       scene_swimming
   reading01Name Low_Tide
   reading01Regex ((?:\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}.* \d{1}.\d{2})(?=.*Niedrigwasser(\n|$)))
   reading02Name High_Tide
   reading02Regex ((?:\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}.* \d{1}.\d{2})(?=.*Hochwasser(\n|$)))
   room       Outside
   stateFormat LW: Low_Tide-1 HW: High_Tide-1
   timeout    10
   userattr   


Die Ausgabe lautet:
14.12.2021 12:06 CET   3.68

Meine Frage ist: Wie bekomme ich das 1. und 3. Leerzeichen in "<BR>" ersetzt?
14.12.2021<BR>12:06 CET<BR>3.68

Das hat zur Folge, dass es im Browser als
Zitat14.12.2021
12:06 CET
3.68
dargestellt wird.

Ich bin mir sicher, das eines der vielen Attribute mir dies erlauben, aber ich habe nur noch keinen Durchblick welches...

Danke

Gruss
    Sailor
******************************
Man wird immer besser...

StefanStrobel

Hallo Gerhard,

MaxAge wird nur beim nächsten zyklischen Request verarbeitet. Es hat keinen eigenen Timer.
Erklärt es das?

Gruss
  Stefan