[gelöst] HTTPMOD - Problem mit Umlaute UTF-8

Begonnen von joesy, 04 November 2016, 15:24:32

Vorheriges Thema - Nächstes Thema

joesy

Hi,

ich habe ein Problem mit dem HTTPMOD Modul. Ich möchte in ftui die Timer meines VDRs anzeigen. Mit Hilfe vom VDR Plugin restfulapi, welches die Timer als JSON zurückliefert, und HTTPMOD war die Anbindung schnell erledigt. Ich habe die Timer als Readings gespeichert. Allerdings gibt es Probleme mit den Umlauten. Die Antwort wird als UTF-8 zurückgeliefert.

JSON Antwort
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, DELETE, PUT
Content-Type: application/json; charset=utf-8
Content-Length: 442
Server: cxxtools-Http-Server 2.2.1
Connection: keep-alive
Date: Fri, 04 Nov 2016 14:19:49 GMT


{"timers":[{"id":"S19.2E-1-1011-11110:0:1478214000:2015:2115","flags":5,"start":2015,"start_timestamp":"2016-11-04 20:15:00","stop_timestamp":"2016-11-04 21:15:00","stop":2115,"priority":50,"lifetime":99,"event_id":17317,"weekdays":"-------","day":"2016-11-04","channel":"S19.2E-1-1011-11110","filename":"Ein Fall f\u00fcr zwei","channel_name":"ZDF HD","is_pending":false,"is_recording":false,"is_active":true,"aux":""}],"count":1,"total":16}

Im fhem.log sieht es eigentlich gut aus. Hier werden die Umlaute korrekt dargestellt. Die Readings und die Werte im DBLog sind jedoch fehlerhaft.

fhem.log
2016.11.04 12:43:50 5: VDRTimer: Read set JSON timers_09_filename as reading timers_09_filename to value Ein Fall für zwei
...
2016.11.04 12:43:50 5: DbLog: logging of Device: VDRTimer , Type: HTTPMOD , Event: timers_09_filename: Ein Fall für zwei , Reading: timers_09_filename , Value: Ein Fall für zwei , Unit:


So sieht dann das Reading und auch der Eintrag im DBLog aus:
Ein Fall f�r zwei


ftui stellt den Wert in einen solchen Fall gar nicht dar, da der Wert als binary interpretiert wird. Ich habe schon verschiedene Parameter für HTTPMOD für Decode/Encode getDecode usw. versucht. Bis jetzt hat sich nichts geändert?

Hier meine aktuelle Konfiguration von HTTPMOD
Definition
define VDRTimer HTTPMOD none 0
attr VDRTimer userattr get01ExtractAllJSON:0,1 get01Name getDecode getHeader1 getHeader2 getHeader3 getURL
attr VDRTimer get01ExtractAllJSON 1
attr VDRTimer get01Name Timers
attr VDRTimer getHeader1 Content-Type: application/json
attr VDRTimer getHeader2 Content-Type: charset=utf-8
attr VDRTimer getHeader3 Accept: */*
attr VDRTimer getURL http://xx.xx.xx.xx:8002/timers.json
attr VDRTimer get01Decode utf-8
attr VDRTimer reading01Decode utf-8


Welche Optionen/Parameter habe ich übersehen. Wo kann ich noch ansetzen.

Danke
joesy

justme1968

deine werte kommen nicht als utf8 sondern als latin1 zurück.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

DazDavid

Ich hänge mich hier mal ran da ich ein Problem mit dem gleichen Modul habe und keine neuen Thread dafür eröffnen möchte.

Ich hänge jetzt schon seit Stunden daran, dass ich über die Google Geocoding API per HTTPMOD eine Adresse aus Koordinaten gewinnen möchte. Dabei übergebe ich die Koordinaten als Variabel was auch alles soweit klappt. Der Aufruf funktioniert und im Feld "Buf" bekomme ich auch die erwarteten Daten zurück.

Was ich absolut nicht gebacken bekomme ist irgendwelche Readings zu erzeugen. Es wird einfach nichts angezeigt. Ich stehe irgendwie ziemlich auf dem Schlauch.

Hier der Auszuf aus meiner fhem.cfg:

define parkLocation HTTPMOD none
attr parkLocation userattr reading01JSON reading01Name reading01Regex set01Data set01Name set01TextArg:0,1 set01URL setHeader1
attr parkLocation reading01JSON formatted_address
attr parkLocation reading01Name Location
attr parkLocation set01Name Coordinates
attr parkLocation set01TextArg 1
attr parkLocation set01URL https://maps.googleapis.com/maps/api/geocode/json?latlng=$val&result_type=street_address&key=XXXXXXXX


Die Antwort der Website ist JSON und sieht etwa so aus (Auszug):
         "formatted_address" : "Straße+Hnr, PLZ+Ort, Deutschland",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : XXXXXXX,
                  "lng" : XXXXXXX
               },
               "southwest" : {
                  "lat" : XXXXXXX,
                  "lng" : XXXXXXX
               }
            },


der Teil den ich gern hätte is hier die erste Zeile "formatted_address". Laut Command Ref und Wiki kann ich den Wert bei JSON relative einfach mit formatted_address.value herausfiltern was aber nicht klappt. Auch mit Regex habe ich es versucht aber ich schaffe es einfach nicht irgendwelche Readings zu bekommen.

Hat irgendwer eine Idee?
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

DazDavid

Ok, ich habe mein Problem mit viel probieren lösen können. Vielleicht hilft es jemanden.

Mein Fehler war das ich set01URL genutzt habe. Für meine Fälle scheint aber get01URL das richtige Attribut zu sein.

hier meine Config:

define parkLocation HTTPMOD none
attr parkLocation userattr get01Name get01URL reading01Name reading01Regex
attr parkLocation enableControlSet 1
attr parkLocation get01Name Coordinates
attr parkLocation get01URL https://maps.googleapis.com/maps/api/geocode/json?latlng=$val&result_type=street_address&key=<API-Key>
attr parkLocation reading01Name Location
attr parkLocation reading01Regex "formatted_address" : "(.*)",
attr parkLocation stateFormat Parklocation: Location


Anschließend kann das Device mit get parkLocation Coordinate x,y aufgerufen werden und es wird umgehend die aufgelöste Adresse ins Reading geschrieben.
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

joesy

@justme1968
In der Json Antwort sehe ich für den Umlaut folgendes Zeichen für das "ü"
\u00fc

Nach meinen Verständnis ist das UTF-8, oder irre ich mich da?

Gruß
joesy

justme1968

sorry. ich hatte nur die dblog zeile gesehen. die ist ziemlich sicher latin-1. da ist nur ein zeichen das nicht als utf8 interpretiert werden kann.

wie zeigt denn fhemweb das reading an?


dein json ist utf8 aber das problem scheint zu sein das decode_json bei zeichen <255 aus dem \u ein \x{..} macht. d.h. es erzeugt kein utf8 2-byte zeichen wie es richtig wäre sondern macht aus dem code point ein 1-byte zeichen das dann als latin-1 erscheint.

ein encode('UTF-8', ...) müsste helfen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

joesy

Das Reading entspricht dem DBLog-Eintrag, also wohl auch Latin1.

Zitatein encode('UTF-8', ...) müsste helfen.

Wo sollte ich denn das einbauen?

Gruss
joesy

joesy

Das Problem ist gelöst. Ich habe mit den Parameter immer das Decoding versucht zu verändern. Aber anscheinend war das Problem bei Encoding, d.h. Perl hat die Wert nicht als UTF-8 interpretiert.

@justme1968
Danke für den Hinweis in die richtige Richtung.

Mit folgenden Attributen funktioniert jetzt das Einlesen korrekt
attr VDRTimer reading01Encode UTF-8
attr VDRTimer get01Encode UTF-8


Gruß
joesy