Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

blueberry63

Rückmeldung: mit "bodyDecode utf8" geht es auch nicht. Wie würde denn das Umwandeln eines einzelnen Readings aussehen?

reading24JSON ww1_L\_statetext

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Aurel_B

#1201
Ich glaube "attr blibla reading24Decode utf8" ?

Edit: kann es sein, dass die Encodings eben NICHT in UTF-8 vorliegen? Was für ein Encoding verwendet denn dein Browser (=abzufragende Seite z.B. im Firefox öffnen, Inspektor öffnen -> Netzwerkanalyse -> Seite neu laden und dann unter "Headers" schauen, was für ein Encoding verwendet wird, z.B. "Content-Type: application/json;charset=utf-8" bei mir)?

fireball

Hi, ich habe eine Frage, an der beiß ich mir die Zähne aus, aufgrund der vielen Möglichkeiten...

Ich rufe eine URL auf und parse davon Werte in zwei Readings (globaleSzenen und lastScene).

Internals:
   BUSY       0
   DEF        http://192.168.178.28/ocf/sceneCollection/0 0
   FUUID      61918943-f33f-0804-830d-89dcaff34995df3e
   Interval   0
   MainURL    http://192.168.178.28/ocf/sceneCollection/0
   ModuleVersion 4.1.14 - 19.8.2022
   NAME       HT_Globale_Szenen
   NOTIFYDEV  global
   NR         611
   NTFY_ORDER 50-HT_Globale_Szenen
   STATE      Home
   TYPE       HTTPMOD
   eventCount 9612
   value     
   HttpUtils:
     NAME       
     addr       http://192.168.178.28:80
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl http://192.168.178.28/ocf/sceneCollection/0
     header     
     host       192.168.178.28
     httpheader HTTP/1.1 200 OK
Server: nginx/1.11.5
Date: Tue, 13 Dec 2022 13:06:08 GMT
Content-Type: application/json
Content-Length: 1564
Connection: close
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    80
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /ocf/sceneCollection/0
     protocol   http
     redirects  0
     timeout    2
     url        http://192.168.178.28/ocf/sceneCollection/0
     sslargs:
   OLDREADINGS:
   QUEUE:
   READINGS:
     2022-12-13 14:06:08   SetValues       0,0,0
     2022-12-13 14:06:08   globaleSzenen   Home Away Sleep
     2022-12-13 13:43:42   lastScene       Home
   REQUEST:
     context    get
     data       
     header     
     ignoreredirects 0
     num        01
     retryCount 0
     type       get01
     url        http://192.168.178.28/ocf/sceneCollection/0
     value     
   defptr:
     readingBase:
       globaleSzenen get
       lastScene  get
     readingNum:
       globaleSzenen 01
       lastScene  02
     readingOutdated:
     requestReadings:
       get01:
         globaleSzenen get 01
       get02:
         lastScene  get 02
   lastpoll:
     globaleSzenen 1670935419.77895
     lastScene  1670935419.77895
Attributes:
   enableControlSet 1
   enforceGoodReadingNames 1
   get01JSON  sceneValues
   get01Name  globaleSzenen
   get01RecombineExpr join " ", @matchlist
   get02JSON  lastScene
   get02Name  lastScene
   icon       hm-tc-it-wm-w-eu
   room       WISER
   set01Data  {"isIrrelevant": false,"lastScene": "$val"}
   set01Name  SetValues:Home,Away,Sleep
   set01TextArg 1
   set01URL   http://192.168.178.28/ocf/sceneCollection/0
   stateFormat lastScene



globaleSzenen ist eine Space-seperierte Liste von drei Werten und lastScene ein einzelner Wert.

Aktuell setze ich mit  set01Name  SetValues:Home,Away,Sleep diese 3 Werte manuell als Set-Werte, damit ich beim Set Werte als Auswahl habe.

1. Ich würde gern das ganze dynamische haben und die Liste der Werte die ich mit get01JSON  bekomme, gleich als setListe automatisch zur Verfügung haben?!
2. Die Übergabe bei set HT_Globale_Szenen SetValues (Home,Away,Sleep) soll dann in den POST Request Body unter $val.

Kann mir jemand beim richtigen Ansatz dafür helfen?!
Danke
VG
René


blueberry63

ZitatEdit: kann es sein, dass die Encodings eben NICHT in UTF-8 vorliegen? Was für ein Encoding verwendet denn dein Browser (=abzufragende Seite z.B. im Firefox öffnen, Inspektor öffnen -> Netzwerkanalyse -> Seite neu laden und dann unter "Headers" schauen, was für ein Encoding verwendet wird, z.B. "Content-Type: application/json;charset=utf-8" bei mir)?

Bei mir sehen die Header-Infos so aus:


GET /xxx/all HTTP/1.1
Host: 192.168.99.208:4321
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1


Hier ist kein "Content-Type" enthalten... (?)

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

l-j-silver

Zitat von: ansgru am 13 Dezember 2022, 08:26:06
Ich glaube "attr blibla reading24Decode utf8" ?

Edit: kann es sein, dass die Encodings eben NICHT in UTF-8 vorliegen? Was für ein Encoding verwendet denn dein Browser (=abzufragende Seite z.B. im Firefox öffnen, Inspektor öffnen -> Netzwerkanalyse -> Seite neu laden und dann unter "Headers" schauen, was für ein Encoding verwendet wird, z.B. "Content-Type: application/json;charset=utf-8" bei mir)?

Hi,

Ökofen nutzt für JSON cp1252. Ich kann aber nicht sagen, ob es mit httpmod unterstützt wird und wie man es richtig verwendet.

Grüße Toni


Aurel_B

Zitat von: blueberry63 am 13 Dezember 2022, 18:31:58
Bei mir sehen die Header-Infos so aus:


GET /xxx/all HTTP/1.1
Host: 192.168.99.208:4321
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1


Hier ist kein "Content-Type" enthalten... (?)

Gruß
Blueberry63

Öffne doch mal die Seite in Firefox (also die URL, die du in HTTPMOD aufrufst). Dann "Strg + I" um die Seiteninformationen anzuzeigen -> Was steht bei Textkodierung? Vielleicht cp1252? Und stimmen die Umlaute wenn du die Seite in Firefox anschaust? Was auch immer hilfreich ist: Quelltext in Notepad++ kopieren, dort kannst du mit den Kodierungen spielen und so herausfinden, welche Kodierung verwendet wird und - falls du eine andere Kodierung auswählst - wie dann die Umlaute dargestellt werden (resp. welche Kodierung es braucht, damit die Umlautet korrekt angezeigt werden).

blueberry63

Ok, hier ist das Ergebnis:

Textkodierung: windows-1252

Und ja: es handelt sich um eine ÖkoFEN-Pelletanlage. Das Problem mit der Decodierung passiert allerdings nur "außerhalb" des Zeitprogramms, nur dann taucht "ß" im Body auf; andere Umlaute gibt es nicht.

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Aurel_B

Zitat von: blueberry63 am 14 Dezember 2022, 13:08:22
Ok, hier ist das Ergebnis:

Textkodierung: windows-1252

Und ja: es handelt sich um eine ÖkoFEN-Pelletanlage. Das Problem mit der Decodierung passiert allerdings nur "außerhalb" des Zeitprogramms, nur dann taucht "ß" im Body auf; andere Umlaute gibt es nicht.

Was passiert bei "attr blibla reading24Decode cp1252" ?

blueberry63

#1208
ZitatWas passiert bei "attr blibla reading24Decode cp1252" ?

Egal, was ich hier auf Reading-Level versuche (cp1525, cp 1525, cp-1525) funktioniert nicht: es kommen überhaupt keine Daten mehr.

Anscheinend muss "bodyDecode" verwendet werden, aber welche Werte kann/muss man hier setzen? Wenn man einen falschen Wert/Syntax einträgt, hängt sich FHEM auf; Fehlermeldung im LOG (Bsp,.):

Unknown encoding 'en-US' at lib/FHEM/HTTPMOD/Utils.pm line 775.


Wenn ich mir die Änderungen in Utils.pm anschaue (mit denen es ja funktioniert), dann wird doch ein "Encoding utf8" erzwungen, oder?

Zeile 33/34:
Code: [Auswählen]
#use Encode          qw(decode encode);
use Encode          qw(decode encode encode_utf8);
und Zeile 692/693:
Code: [Auswählen]
# my $decoded = eval { decode_json($buffer) };
my $decoded = eval { decode_json(encode_utf8($buffer)) };


Muss man hier vielleicht ansetzen?


Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

StefanStrobel

Hallo,

die JSON-Verarbeitung passiert in HTTPMOD nach dem bodyDecode und vor dem enode / decode der Readings.
Wenn sich die JSON-Bibliothek an Sonderzeichen verschluckt, dann kann das nur durch korrekte Umwandlung vorher beseitigt werden.
Dazu ist bodyDecode da. Eigenlich sollte bodyDecode cp1251 die richtige Einstellung sein. Es sei denn die Perl-Funktion decode kommt mit dein Eingangsdaten auch nicht klar, weil es noch eine andere Kodierung ist.
Dass ein encode auf utf-8 vorab die richtige Lösung sein soll, wundert mich. Bleiben dabei die Umlaute und das ß korrekt erhalten??
Das würde wieder dagegen sprechen dass der Eingangstext cp1252 ist.
Könnte jemand eine Datei mit den Originaldaten posten, damit ich das testen kann?

Gruss
   Stefan

l-j-silver

#1210
Zitat von: StefanStrobel am 15 Dezember 2022, 19:07:17
Hallo,

die JSON-Verarbeitung passiert in HTTPMOD nach dem bodyDecode und vor dem enode / decode der Readings.
Wenn sich die JSON-Bibliothek an Sonderzeichen verschluckt, dann kann das nur durch korrekte Umwandlung vorher beseitigt werden.
Dazu ist bodyDecode da. Eigenlich sollte bodyDecode cp1251 die richtige Einstellung sein. Es sei denn die Perl-Funktion decode kommt mit dein Eingangsdaten auch nicht klar, weil es noch eine andere Kodierung ist.
Dass ein encode auf utf-8 vorab die richtige Lösung sein soll, wundert mich. Bleiben dabei die Umlaute und das ß korrekt erhalten??
Das würde wieder dagegen sprechen dass der Eingangstext cp1252 ist.
Könnte jemand eine Datei mit den Originaldaten posten, damit ich das testen kann?

Gruss
   Stefan

Hallo Stefan,

Json_decode funktioniert nur mit utf-8 encoded strings.

Ich kann dir nachher gerne eine Datei mit Original Daten senden.

Grüße Toni

blueberry63

ZitatBleiben dabei die Umlaute und das ß korrekt erhalten??

Wenn ich die ÖkoFEN-API über die URL im Browser aufrufe, werden in der Ausgabe die Umlaute richtig  dargestellt (hier: ß).

Soll ich meine Ausgabe auch noch hier posten? 
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

StefanStrobel

Vielen Dank, ich schau es mir an.

Gruss
   Stefan

StefanStrobel

Hallo,

anbei eine neue Version zum Testen.
Es gibt ein neues Attribut bodyEncode. Wenn man das auf utf8 setzt, dann wird für den body nach einem eventuellen Decode noch ein encode mit utf8 aufgerufen. Möglicherweise sollte das sogar immer gemacht werden, ich möchte jedoch vermeiden, dass es dadurch bei Leuten, die es bisher ohne encode verwenden zu Verhaltensänderungen kommt.

Gruss
   Stefan


l-j-silver

Zitat von: StefanStrobel am 17 Dezember 2022, 15:29:06
Hallo,

anbei eine neue Version zum Testen.
Es gibt ein neues Attribut bodyEncode. Wenn man das auf utf8 setzt, dann wird für den body nach einem eventuellen Decode noch ein encode mit utf8 aufgerufen. Möglicherweise sollte das sogar immer gemacht werden, ich möchte jedoch vermeiden, dass es dadurch bei Leuten, die es bisher ohne encode verwenden zu Verhaltensänderungen kommt.

Gruss
   Stefan

Hallo Stefan,

vielen Dank. Für mich hat es geklappt.

vielleicht sollte noch eine Prüfung eingebaut werden, wenn ein falscher Wert eingegeben wird.

Ich hatte zuerst versehentlich "attr Heizung bodyDecode uff8" eingegeben und da hat sich fhem aufgegangen.

Danke.

Grüße Toni