Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo,

hast Du mal  bodyDecode = none ausprobiert (siehe oben)

Gruss
   Stefan

Rudibarani

Zitat von: StefanStrobel am 28 Oktober 2020, 11:09:07
Hallo,

hast Du mal  bodyDecode = none ausprobiert (siehe oben)

Gruss
   Stefan

Perfekt - dann klappt alles wieder. Vielen Dank!

gehlbel

Zitat von: StefanStrobel am 27 Oktober 2020, 13:06:16
Ich habe versucht bei der Überarbeitung auch ein paar Altlasten auszumisten. Dazu gehört auch, dass ich ursprünglich beim Aufruf der HttpUtils einfach den HTTPMOD-Device-Hash verwendet habe und keinen eigenen Hash. Das habe ich jetzt geändert. Dadurch sind auch die ganzen Hash-Keys verschwunden, die HttpUtils gesetzt hat. Für den Fall, dass sie doch noch jemand sucht, habe ich den Übergabe-Hash für HttpUtils als $hash->{HttpUtils} referenziert.
Das bisherige $hash->{addr} ist daher jetzt immer noch als $hash->{HttpUtils}{addr} erreichbar, aber die Anzeige in Fhemweb ist nicht mehr voll mit Internals, die kaum jemand brauchen kann.
Ebenso habe ich Internals wie LASTSEND, von dem ich ausgegangen bin, dass es keiner braucht, in .LASTSEND umbenannt, so dass es nicht mehr angezeigt wird.
Wenn noch mehr Leute das benötigen, kann ich die Umbenennung auch rückgängig machen bzw. die Keys von HttpUtils wieder in den Device-Hash kopieren.

Hallo Stefan,

danke für Deine ausführliche Beschreibung und ich kann Deine Argumentation gut nachvollziehen.
Ich möchte auf der einen Seite nicht auf "alte" Keys setzten, die es dann evtl. irgendwann in der Form nicht gibt, deshalb habe ich mich heute daran versucht meine devices umzubauen, ist mir aber leider nicht gelungen ... hast Du evtl. eine Idee wie ich folgendes lösen kann:

- im Rahmen eines Replacements aus dem Internal MainURL nur die BaseURL "http(s)://Host:Port" ohne Pfad verwenden kann (z.B. https://x.y.z:nnn)
- wie ich erkennen kann ob der letzte Aufruf erfolgreich war, oder nicht und das Reading LAST_ERROR geschrieben wurde

Danke für Deine Untersützung.
Grüße
Béla

betateilchen

#963
Zitat von: gehlbel am 28 Oktober 2020, 21:08:55
- im Rahmen eines Replacements aus dem Internal MainURL nur die BaseURL "http(s)://Host:Port" ohne Pfad verwenden kann (z.B. https://x.y.z:nnn)

mit ^.*:\d+ regexen :)


sub test {
  my $url = "http(s)://Host:12345/hier/kommt/ein/Pfad";
  $url =~ /(^.*:\d+)/;
  return $1;
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

StefanStrobel

Zitat von: gehlbel am 28 Oktober 2020, 21:08:55
- wie ich erkennen kann ob der letzte Aufruf erfolgreich war, oder nicht und das Reading LAST_ERROR geschrieben wurde

eine Variante wäre deleteOnError:
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.

dann sind die spezifizierten Readings weg wenn der letzte Request nicht erfolgreich war.

Gruss
   Stefan

gehlbel

Danke an Euch beide das hat mein Thema gelöst  :) und ich kann jetzt updaten.

Schöne Grüße
Béla

Wolle02

Ich wollte aus einer alten FHEM Installation folgendes HTTMOD Device in meine neue FHEM Installation übernehmen:

defmod Pegelstand_Bodensee HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json?ids=aa9179c1-17ef-4c61-a48a-74193fa7bfdf&includeTimeseries=true&includeCharacteristicValues=true&includeCurrentMeasurement=true 0
attr Pegelstand_Bodensee userattr readingEncode
attr Pegelstand_Bodensee enableControlSet 1
attr Pegelstand_Bodensee extractAllJSON 1
attr Pegelstand_Bodensee readingEncode utf8


In der alten FHEM Installation mit HTTPMOD Modulversion 3.5.? hat diese Definition problemlos funktioniert.

In meiner aktuellen FHEM Installation habe ich die aktuelle HTTPMOD Modulversion 4.0.12.
Leider funktioniert damit die o.g. Definition nicht mehr. Ich habe auch schon versucht das ganze neu anzulegen; leider ebenfalls ohne Erfolg.

Ein Reread des Devices mit Verbose 5 bringt mir im Logfile folgenden Output:

2020.11.05 11:12:38 5: Pegelstand_Bodensee: set called with reread
2020.11.05 11:12:38 4: Pegelstand_Bodensee: GetUpdate called (reread)
2020.11.05 11:12:38 5: Pegelstand_Bodensee: AddToQueue adds type update to URL https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json?ids=aa9179c1-17ef-4c61-a48a-74193fa7bfdf&includeTimeseries=true&includeCharacteristicValues=true&includeCurrentMeasurement=true, no data, no headers, retry 0, initial queue len: 0
2020.11.05 11:12:38 5: Pegelstand_Bodensee: HandleSendQueue called from HTTPMOD::AddToSendQueue, qlen = 1
2020.11.05 11:12:38 4: Pegelstand_Bodensee: HandleSendQueue sends update with timeout 2 to https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json?ids=aa9179c1-17ef-4c61-a48a-74193fa7bfdf&includeTimeseries=true&includeCharacteristicValues=true&includeCurrentMeasurement=true, No Data, No Header
2020.11.05 11:12:39 5: Pegelstand_Bodensee: ReadCallback called from __ANON__
2020.11.05 11:12:39 4: Pegelstand_Bodensee: Read callback: request type was update retry 0,
header: HTTP/1.1 200 OK
Date: Thu, 05 Nov 2020 10:12:39 GMT
Server: Apache
ETag: "cfaf9b111de457257d6f78d66ecbcd5381e8531f6467060bf0d1332602b0bfbe-gzip"
Cache-Control: max-age=0, private, no-cache, no-store, must-revalidate, proxy-revalidate, no-transform
Expires: Thu, 05 Nov 2020 10:13:00 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: script-src 'self' https://pegelonline.wsv.de https://maps.googleapis.com 'unsafe-inline' 'unsafe-eval'
Referrer-Policy: origin-when-cross-origin
Strict-Transport-Security: max-age=31536000; includeSubDomains
Access-Control-Allow-Origin: *
Content-Length: 564
Connection: close
Content-Type: application/json;charset=UTF-8, body length 1408
2020.11.05 11:12:39 5: Pegelstand_Bodensee: Read callback: body
[
  {
    "uuid": "aa9179c1-17ef-4c61-a48a-74193fa7bfdf",
    "number": "906",
    "shortname": "KONSTANZ",
    "longname": "KONSTANZ",
    "km": 0.0,
    "agency": "REGIERUNGSPRÄSIDIUM FREIBURG",
    "longitude": 9.172833233102148,
    "latitude": 47.66789422885012,
    "water": {
      "shortname": "BODENSEE",
      "longname": "BODENSEE"
    },
    "timeseries": [
      {
        "shortname": "W",
        "longname": "WASSERSTAND ROHDATEN",
        "unit": "cm",
        "equidistance": 15,
        "currentMeasurement": {
          "timestamp": "2020-11-05T10:30:00+01:00",
          "value": 368.0,
          "trend": 1,
          "stateMnwMhw": "normal",
          "stateNswHsw": "unknown"
        },
        "gaugeZero": {
          "unit": "m. ü. NHN",
          "value": 391.89,
          "validFrom": "2004-04-14"
        },
        "characteristicValues": [
          {
            "shortname": "MW",
            "longname": "Mittel der Tageswasserstände ",
            "unit": "cm",
            "value": 341.0,
            "timespanStart": "2006-11-01",
            "timespanEnd": "2015-10-31"
          },
          {
            "shortname": "MNW",
            "longname": "Mittel der Niedrigwasserstände ",
            "unit": "cm",
            "value": 262.0,
            "timespanStart": "2006-11-01",
            "timespanEnd": "2015-10-31"
          }
        ]
      }
    ]
  }
]
2020.11.05 11:12:39 4: Pegelstand_Bodensee: BodyDecode found charset header and set decoding to UTF-8 (bodyDecode was set to auto)
2020.11.05 11:12:39 4: Pegelstand_Bodensee: BodyDecode is decoding the response body as UTF-8
2020.11.05 11:12:39 3: Pegelstand_Bodensee: error while parsing JSON data: malformed UTF-8 character in JSON string, at character offset 178 (before "\x{fffd}IDIUM FREIBU...") at lib/FHEM/HTTPMOD/Utils.pm line 644.

2020.11.05 11:12:39 5: Pegelstand_Bodensee: GetCookies is looking for Cookies
2020.11.05 11:12:39 5: Pegelstand_Bodensee: ExtractSid called, context reading, num 0
2020.11.05 11:12:39 4: Pegelstand_Bodensee: checking for redirects, code=200, ignore=0
2020.11.05 11:12:39 4: Pegelstand_Bodensee: no redirects to handle
2020.11.05 11:12:39 5: Pegelstand_Bodensee: Read callback sets LAST_REQUEST to update
2020.11.05 11:12:39 5: Pegelstand_Bodensee: CheckAuth decided no authentication required
2020.11.05 11:12:39 3: Pegelstand_Bodensee: no parsed JSON structure available
2020.11.05 11:12:39 5: Pegelstand_Bodensee: Read starts parsing response to update with defined readings:
2020.11.05 11:12:39 4: Pegelstand_Bodensee: Read response to update didn't match any Reading
2020.11.05 11:12:39 5: Pegelstand_Bodensee: HandleSendQueue called from HTTPMOD::ReadCallback, qlen = 0
2020.11.05 11:12:39 5: Pegelstand_Bodensee: HandleSendQueue found no usable entry in queue


Kann mir jemand helfen was ich in der neuen Modulversion in der Definition ändern muss?
Da die gesamte Doku auf Englisch ist tue ich mich hiermit zugegebener Maßen etwas schwer.  :-[

frank

eventuell dein "doppeltes" de/encoding.

1. automatisches body decoding wegen header eintrag.
2. attr readingEncode

ich würde mal versuchen:
entweder:
1. attr readingEncode löschen
oder:
2. "attr bodyDecode none" ergänzen.
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

Wolle02

Super. Das war es.

2. "attr bodyDecode none" ergänzen.

Damit scheint es wieder zu laufen.

Die erste Alternative hat nicht funktioniert.

Vielen herzlichen Dank.


ch.eick

Hallo zusammen,
ich habe hier "HTTPMOD komplexes Anmeldeverfahren Python Keygenerator" mal ein komplexeres Problem ausgelagert.
Über Hilfe würde ich mich sehr freuen.
Gruß
    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,

ich habe das Gefühl, dass der Default "auto" für bodyDecode mehr Probleme macht als dass er nützt.
Eventuell sollte ich den Default wieder zurückändern, so dass ohne Angabe von bodyDecode auch nichts dekodiert wird.
Oder dass zumindest bei utf-8 kein decode gemacht wird, wenn nichts anderes konfiguriert ist.

Was meint Ihr?

Gruss
    Stefan

plin

Im Zuge der Realisierung der PV-Überwachung gab es Probleme bei der Ausführung von perl-Code der in "{}" eingebettet war. Im FHEM-Log tauchte hinter dem Code ein ominöses "/gee" auf. Eine Suche ergab dann

98_HTTPMOD.pm:            $match = eval {$string =~ s/$regex/$value/gee};
98_HTTPMOD.pm:                Log3 $name, 3, "$name: Replace: invalid regex / expression: /$regex/$value/gee - $@";

das dies wohl vom HTTPMOD stammt.
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

ch.eick

Zitat von: plin am 10 November 2020, 15:56:15
Im Zuge der Realisierung der PV-Überwachung gab es Probleme bei der Ausführung von perl-Code der in "{}" eingebettet war. Im FHEM-Log tauchte hinter dem Code ein ominöses "/gee" auf. Eine Suche ergab dann

98_HTTPMOD.pm:            $match = eval {$string =~ s/$regex/$value/gee};
98_HTTPMOD.pm:                Log3 $name, 3, "$name: Replace: invalid regex / expression: /$regex/$value/gee - $@";

das dies wohl vom HTTPMOD stammt.

Ich ergänze dann noch den Perl Code

replacement04Value {my $NAME = "PV_Anlage_1_API" ;;fhem("deletereading ".$NAME." message");;fhem("deletereading ".$NAME." auth.*");;my @chars=('a'..'z','A'..'Z','0'..'9'); my $r; foreach(1..16) {$r.=$chars[rand @chars];};; fhem("setreading ".$NAME." auth_randomString64 ".$r);; $r;;}


In dieser Version  von HTTPMOD lief es noch

FVERSION 98_HTTPMOD.pm:0.228400/2020-09-24
ModuleVersion 3.5.22 - 7.2.2020


Viele Grüße
   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 Christian,

vielen Dank für die Ergänzung. Jetzt erahne ich zumindest worum es geht :-)
Könntet Ihr noch den Rest der relevanten Konfiguration sowie ein Log mit Verbose 5 posten?

Gruss
   Stefan

ch.eick

Zitat von: StefanStrobel am 10 November 2020, 17:44:29
vielen Dank für die Ergänzung. Jetzt erahne ich zumindest worum es geht :-)
Könntet Ihr noch den Rest der relevanten Konfiguration sowie ein Log mit Verbose 5 posten?

In Zeile 47 , damit Du nicht zuviel suchen musst :-)
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