[Gelöst] HTTPMOD reading stellt Umlaute als \u00nn dar

Begonnen von Hermann123, 24 Oktober 2024, 22:32:36

Vorheriges Thema - Nächstes Thema

Hermann123

Hallo,

ich habe Probleme mit einer JSON Response die mit HTTPMOD abgefragt wird (Spritpreise von Tankerkönig API abfragen).
Ich habe hier einige Hinweise und Beispiele gefunden, komme aber trotzdem nicht zu einer Lösung und würde mich über
Hilfe freuen!

Wie in dem Listing zu sehen ist, steht im httpBody die Victoriastraße als Victoriastra\u00dfe. Diese Zeichenfolge
wird auch so in das Reading TS2_Strasse übernommen.
Ich habe mit div. Encode und Decode Optionen leider kein anderes Ergebnis bekommen....
Mein letzter Versuch, bevor ich die weiße Fahne gehisst habe war:

reading21Encode utf8und
reading21Decode utf8
Für Hilfestellung wäre ich sehr dankbar...
LG Hermann


Listing
Internals:
   BUSY       0
   DEF        https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002 0
   FUUID      671962e2-f33f-3606-21fc-8659c53518c188f3
   Interval   0
   MainURL    https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       TS_Spritpreise
   NOTIFYDEV  global
   NR         1502
   NTFY_ORDER 50-TS_Spritpreise
   STATE      ???
   TYPE       HTTPMOD
   eventCount 2
   httpbody   {
    "ok": true,
    "license": "CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de",
    "data": "MTS-K",
    "status": "ok",
    "stations": [
        {
            "id": "005056ba-7cb6-1ed2-bceb-9dd1e660cd3c",
            "name": "star Tankstelle",
            "brand": "STAR",
            "street": "Kinderheim-\/Bergstrasse",
            "place": "Marl",
            "lat": 51.664773,
            "lng": 7.123585,
            "dist": 0.7,
            "price": 1.009,
            "isOpen": false,
            "houseNumber": "",
            "postCode": 45770
        },
        {
            "id": "c826d6d2-9b1a-47b0-acc1-9322bdbf99a0",
            "name": "Aral Tankstelle",
            "brand": "ARAL",
            "street": "Victoriastra\u00dfe",
            "place": "Marl",
            "lat": 51.66564,
            "lng": 7.150652,
            "dist": 1.2,
            "price": 1.009,
            "isOpen": true,
            "houseNumber": "174",
            "postCode": 45772
        }
    ]
}
   value     
   CompiledRegexes:
   HttpUtils:
     NAME      
     addr       https://creativecommons.tankerkoenig.de:443
     auth       0
     code       200
     compress   1
     conn      
     data      
     displayurl https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
     header     Content-Type: application/json
     host       creativecommons.tankerkoenig.de
     httpheader HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Thu, 24 Oct 2024 20:07:01 GMT
Content-Type: application/json; charset=utf-8
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: origin, x-requested-with, content-type, accept
Access-Control-Allow-Methods: GET
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
     protocol   https
     redirects  0
     timeout    5
     url        https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
     sslargs:
   QUEUE:
   READINGS:
     2024-10-24 22:07:01   TS2_Strasse     Victoriastra\u00dfe
   REQUEST:
     context    reading
     data      
     header     Content-Type: application/json
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
   defptr:
     readingBase:
       TS2_Strasse reading
     readingNum:
       TS2_Strasse 21
     readingOutdated:
     requestReadings:
       update:
         TS2_Strasse reading 21
Attributes:
   event-on-change-reading .*
   reading21Encode utf8
   reading21Name TS2_Strasse
   reading21Regex "c826d6d2-9b1a-47b0-acc1-9322bdbf99a0"[^}]*"street": "([\w\s\\]+)"
   requestHeader Content-Type: application/json
   room       Garage
   showBody   1
   timeout    5
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

Hermann123

Guten Morgen,

Hat wirklich keiner eine Idee wie ich die Umlaute umwandeln muss um lesbare Texte zu bekommen?

Oder ist der Thread falsch?

Für Hilfe und Unterstützung wäre ich dankbar!

Grüße
Hermann
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

Invers

Ich hab von dieser Geschichte keine Ahnung, aber da keiner antwortet, habe ich mal ne KI gefragt. Die sagt folgendes, aber ohne Gewähr:

"c826d6d2-9b1a-47b0-acc1-9322bdbf99a0"[^}]*"street":\s*"(.*?)"

Hier ein kurzer Überblick:
Damit sollte die Straße ,,Victoriastraße" korrekt als
TS2_Strasse-Reading angezeigt werden. Teste die Anpassung und prüfe, ob die Umlaute jetzt korrekt dargestellt werden.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

betateilchen

Wenn Du schon json zurückbekommst, warum nimmst Du dann HTTPMOD und nicht JsonMod?
Bei mir kommen da out-of-the-box die richtigen Werte inkl. deutsche Sonderzeichen raus, siehe Anhang.

defmod tanker JsonMod file:///tmp/tanker.json
attr tanker readingList complete()

Bei Dir kannst Du natürlich auch die URL angeben, ich hatte einfach den json-Content aus Deinem Beispiel in eine Datei kopiert, da ich keinen API key habe.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Invers am 26 Oktober 2024, 13:33:54Teste die Anpassung und prüfe, ob die Umlaute jetzt korrekt dargestellt werden.

Warum sollte diese regex irgendeinen Einfluss auf die zeichensatzabhängige Darstellung haben? Der Eintrag für die Straße wird doch vollständig ausgelesen, er wird nur falsch dargestellt.

Zitat von: Hermann123 am 24 Oktober 2024, 22:32:36Wie in dem Listing zu sehen ist, steht im httpBody die Victoriastraße als Victoriastra\u00dfe.
Diese Zeichenfolge wird auch so in das Reading TS2_Strasse übernommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hermann123

Zitat von: Invers am 26 Oktober 2024, 13:33:54Ich hab von dieser Geschichte keine Ahnung, aber da keiner antwortet, habe ich mal ne KI gefragt. Die sagt folgendes, aber ohne Gewähr:

"c826d6d2-9b1a-47b0-acc1-9322bdbf99a0"[^}]*"street":\s*"(.*?)"

Die KI hat tatsächlich eine passende regex erstellt.
Aber die etwas andere regex ändert nichts an der Umlaut-Darstellung.

Vielen Dank für Deine Mühe
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

Hermann123

Zitat von: betateilchen am 26 Oktober 2024, 13:51:47Wenn Du schon json zurückbekommst, warum nimmst Du dann HTTPMOD und nicht JsonMod?
Bei mir kommen da out-of-the-box die richtigen Werte inkl. deutsche Sonderzeichen raus, siehe Anhang.

Code Auswählen Erweitern
defmod tanker JsonMod file:///tmp/tanker.json
attr tanker readingList complete()

Vielen Dank :-)

Ich habe das mit jsonMod ausprobiert...funktioniert natürlich wie in Deinem "out of the box sample".
Aber:
  • ich möchte nicht alle readings auswerten (nur brand, street und price). Ich vermute
    allerdings, das es dafür auch eine Lösung gibt.
  • die automatische Differenzierung / Benamung der readings mit stations.n.readingsName würde im weiteren Projekt wahrscheinlich Probleme machen, da sich die Liste ändern kann (je nach Suchradius)
    und >n< somit nicht konstant ist.

Habe es deshalb auch im JsonMod mit
reading21Regex "c826d6d2-9b1a-47b0-acc1-9322bdbf99a0"[^}]*"street": "([\w\s\\]+)"versucht und bekomme das gleiche, falsche Ergebnis.

Könnte man nun ignorieren, den Weg in Deinem Beispiel weiter verfolgen und die Probleme mit >n< später angehen.
Aber
  • Dein Ansatz mit readingList complete() habe ich weder in HTTPMOD noch in JsonMod
    Beschreibungen gefunden. Ich möchte aber gerne nachvollziehen können warum das zu
    dem Ergebnis führt.
  • ich möchte die Mechanismen von HTTPMOD auch verstehen und rausfinden wie man die
    Umlaute mit den offensichtlich dafür gedachten Funktionen rund um Zeichensatz
    Manipulationen vernünftig hinbekommt.

Ich fände es echt super wenn ich hierbei Unterstützung bekomme.....

PS
der API Key ist ein Demo Key. funktioniert, liefert aber nicht die aktuellen Preise.
apikey=00000000-0000-0000-0000-000000000002

LG Hermann
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

betateilchen

#7
Zitat von: Hermann123 am 26 Oktober 2024, 16:33:36Aber:
  • ich möchte nicht alle readings auswerten (nur brand, street und price). Ich vermute
    allerdings, das es dafür auch eine Lösung gibt.
  • die automatische Differenzierung / Benamung der readings mit
    stations.n.readingsName würde im weiteren Projekt wahrscheinlich Probleme machen, da sich die Liste ändern kann (je nach Suchradius)
    und >n< somit nicht konstant ist.

Dann solltest Du die commandref zu JsonMod lesen, natürlich kann man auch einzelne readings erzeugen.
In der commandref zu JsonMod steht complete() sehr wohl beschrieben, genau wie single() für das Erzeugen beliebiger einzelner readings.

readingList
Specifies the access to json elements and their representation as well as formatting as reading.
...
complete();
Automatically creates readings for the entire JSON source. The readings are named after their JSON path.

Der Einfachheit halber hatte ich in meinem Test das Attribut readingList auf complete() gesetzt, daraus resultieren die "nummerierten" und automatisch erzeugten readings.

Nach wie vor sehe ich das Modul JsonMod für Dein Vorhaben als die bessere Wahl zu einer möglichst simplen Lösung.



Zitat von: Hermann123 am 26 Oktober 2024, 16:33:36Habe es deshalb auch im JsonMod mit
reading21Regex "c826d6d2-9b1a-47b0-acc1-9322bdbf99a0"[^}]*"street": "([\w\s\\]+)"versucht und bekomme das gleiche, falsche Ergebnis.

Wie hast Du das denn gemacht? JsonMod kennt doch das Attribut reading21Regex überhaupt nicht.

Zitat von: Hermann123 am 26 Oktober 2024, 16:33:36Dein Ansatz mit readingList complete() habe ich weder in HTTPMOD

Das ist ein Attribut, das es nur in JsonMod gibt, nicht in HTTPMOD.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#8
Zitat von: Hermann123 am 26 Oktober 2024, 16:33:36die automatische Differenzierung / Benamung der readings mit
stations.n.readingsName würde im weiteren Projekt wahrscheinlich Probleme machen, da sich die Liste ändern kann (je nach Suchradius)
und >n< somit nicht konstant ist.

Wie möchtest Du denn die readings benannt haben?

defmod tanker_j JsonMod file:///tmp/tanker.json
attr tanker_j readingList multi(jsonPath('$.stations.[*]'),property('brand'),concat(property('street'),', ',property('price')))

ergibt beispielsweise

2024-10-26 21:55:29 ARAL Victoriastraße, 1.009
2024-10-26 21:55:29 STAR Kinderheim-/Bergstrasse, 1.009

Der Phantasie sind fast keine Grenzen gesetzt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hermann123

Zitat von: betateilchen am 26 Oktober 2024, 21:39:25Der Phantasie sind fast keine Grenzen gesetzt.

.... aber meinem Geist anscheinend ;)

Da muss ich mich erstmal reinfummeln.....morgen wieder....

Danke für Deine Unterstützung!!
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

Hermann123

Zitat von: betateilchen am 26 Oktober 2024, 20:29:36Wie hast Du das denn gemacht? JsonMod kennt doch das Attribut reading21Regex überhaupt nicht.

ZitatDas ist ein Attribut, das es nur in JsonMod gibt, nicht in HTTPMOD.

Sorry, da habe ich mich wohl total verrannt und Blödsinn gepostet.
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

betateilchen

#11
Zitat von: Hermann123 am 26 Oktober 2024, 16:33:36ich möchte nicht alle readings auswerten (nur brand, street und price). Ich vermute allerdings, das es dafür auch eine Lösung gibt.

Der Vollständigkeit halber solltest Du dann aber auch noch die houseNumber zusammen mit street verwenden :)
Man könnte dafür beispielsweise sowas bauen:

defmod tanker_j JsonMod file:///tmp/tanker.json
attr tanker_j readingList multi(jsonPath('$.stations.[*]'),concat(property('id'),'_brand'),property('brand'))\
multi(jsonPath('$.stations.[*]'),concat(property('id'),'_street'),concat(property('street'),' ',property('houseNumber')))\
multi(jsonPath('$.stations.[*]'),concat(property('id'),'_price'),property('price'))

Dann erhält man für jede Tankstelle drei readings, deren Namen mit der 'id' der Tankstelle beginnen:

2024-10-27 09:25:17 005056ba-7cb6-1ed2-bceb-9dd1e660cd3c_brand STAR
2024-10-27 09:25:17 005056ba-7cb6-1ed2-bceb-9dd1e660cd3c_price 1.009
2024-10-27 09:25:17 005056ba-7cb6-1ed2-bceb-9dd1e660cd3c_street Kinderheim-/Bergstrasse

2024-10-27 09:25:17 c826d6d2-9b1a-47b0-acc1-9322bdbf99a0_brand ARAL
2024-10-27 09:25:17 c826d6d2-9b1a-47b0-acc1-9322bdbf99a0_price 1.009
2024-10-27 09:25:17 c826d6d2-9b1a-47b0-acc1-9322bdbf99a0_street Victoriastraße 174

(Anmerkung: bei STAR gibt es keine Hausnummer im Datensatz, obwohl die Tankstelle die Hausnummer 22 in der Kinderheimstr. hat)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hermann123

@betateilchen
Bei mir funktionierrt keins Deiner Beispiele. Weder mit der JSON Datei, noch per WEB.

Internals:
   API_LAST_MSG 200
   API_LAST_RES 1730036321.31843
   DEF        file:///home/pi/tanken.json
   FUUID      671d554a-f33f-3606-7436-24c3b328dadee5c1
   NAME       TS2_Spritpreise
   NEXT       2025-01-01 00:00:00
   NR         1521
   SOURCE     /home/pi/tanken.json ()
   STATE      ???
   SVN        28481 2024-02-05 22:14:33 UTC
   TYPE       JsonMod
   eventCount 11
   CONFIG:
     IN_REQUEST 0
     SOURCE     file:///home/pi/tanken.json
     SECRET:
   OLDREADINGS:
   READINGS:
Attributes:
   interval   0 0 1 1 *
   readingList readingList complete()
   room       Garage
   verbose    5
Im log steht bei den letzten 4 reread Versuchen folgendes (mit verbose=5)
2024.10.27 14:16:53 4: [TS2_Spritpreise] next request: 2025.01.01 00:00:00
2024.10.27 14:16:56 1: PERL WARNING: Argument "" isn't numeric in addition (+) at ./FHEM/98_JsonMod.pm line 1112.
2024.10.27 14:16:56 5: [TS2_Spritpreise] start JsonPath
2024.10.27 14:16:56 1: PERL WARNING: Use of uninitialized value in sprintf at ./FHEM/98_JsonMod.pm line 652.
2024.10.27 14:18:32 5: [TS2_Spritpreise] start JsonPath
2024.10.27 14:18:32 4: [TS2_Spritpreise] $.stations.[*] is empty or missing: discarded
2024.10.27 14:19:29 5: [TS2_Spritpreise] start JsonPath
2024.10.27 14:19:29 4: [TS2_Spritpreise] $.stations.[*] is empty or missing: discarded
2024.10.27 14:22:32 5: [TS2_Spritpreise] start JsonPath
2024.10.27 14:22:32 4: [TS2_Spritpreise] $.stations.[*] is empty or missing: discarded

Ich werde jetzt erstmal mein System und die perl & json Pakete checken.
Wenn das OK ist bzw andere JSON basierte PRG laufen melde ich mich wieder.

Bis hierhin: DANKE
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

TomLee

Zitatfile:///home/pi/tanken.json

Hallo,

überleg doch mal, fällt dir bei der Syntax der Pfadangabe denn nichts auf?
Dazu brauchts doch nicht mal einen Blick in die commandref.

Aber selbst mit richtiger Pfadsyntax hat der User fhem default auch keine Leserechte auf den Ordner, oder hast die angepasst?

Gruß Thomas


TomLee

Mir stellt sich die Frage warum es mit der Angabe des Link zu "invalid server response" kommt.
Wenn man die URL mit dem Demo-API-Key im Browser aufruft bekommt man den Json zurück.

define jm_test JsonMod https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
attr jm_test readingList multi(jsonPath('$.stations.[*]'),concat(property('id'),'_brand'),property('brand'))\
multi(jsonPath('$.stations.[*]'),concat(property('id'),'_street'),concat(property('street'),' ',property('houseNumber')))\
multi(jsonPath('$.stations.[*]'),concat(property('id'),'_price'),property('price'))
#   API_LAST_MSG invalid server response
#   API_LAST_RES 1730039141.32724
#   CFGFN     
#   DEF        https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
#   FUUID      671cfefd-f33f-7844-a112-620cdd50fda45a38
#   NAME       jm_test
#   NEXT       2024-10-27 16:00:00
#   NR         105
#   SOURCE     https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002 (200)
#   STATE      ???
#   SVN        28481 2024-02-05 22:14:33 UTC
#   TYPE       JsonMod
#   eventCount 7
#   CONFIG:
#     IN_REQUEST 0
#     SOURCE     https://creativecommons.tankerkoenig.de/json/list.php?lat=51.662824&lng=7.1338207&rad=1.5&sort=price&type=diesel&apikey=00000000-0000-0000-0000-000000000002
#     SECRET:
#