[HTTPMOD] Umlaute werden falsch dargestellt

Begonnen von Ellert, 02 Februar 2021, 23:52:57

Vorheriges Thema - Nächstes Thema

postman

#15
Moin Stefan,
könntest Du mal das define posten?
Meines sieht so aus:
define Kesselstatus HTTPMOD http://ip-adresse/8005 59
attr Kesselstatus bodyDecode auto
attr Kesselstatus reading01Encode utf8
attr Kesselstatus reading01Name Kesselstatus
attr Kesselstatus reading01Regex 8005 .*:[ \t]+([-]?[\d\.]+[^<]*)
attr Kesselstatus stateFormat { sprintf("%s",ReadingsVal($name,"Kesselstatus",0)) }
attr Kesselstatus verbose 5


Die Attribute habe ich mit
attr Kesselstatus userattr reading01Name reading01Regex readingO1Encode
definiert.
Leider funktioniert es so nicht (siehe Bild) :-[
Heute noch mal ein update ausgeführt

Gruß Uwe
Raspberry Pi Version 2 QUAD-CORE CPU und 1 GB RAM, CUL V3 868 MHz,  stapelbarer CC1101 (SCC) 433 MHz, Enocean-Stick,Jeelink-Stick, BSB-Lanadapter

Spruch eines Ausbilders: Theorie ist, wenn man alles weiss und nichts funktioniert; Praxis ist, wenn alles funktioniert und keiner weiss warum...

StefanStrobel

Hallo Uwe,

am Define kann es nicht liegen und den userattr-Eintrag kannst Du löschen. Der ist überflüssig.
bodyDecode auto ist in Deinem Fall offenbar auch wirkungslos, denn Dein Gerät schickt laut Log keinen charset-Header mit.
Ich glaube dass der HTTP-Body, den Du gepostet hast, durch das Ausschneiden aus dem Browser nicht mehr die gleiche Codierung hat, wie die Originaldaten.
Deshalb kann ich das Problem bisher nicht nachvollziehen.
Kannst Du die Daten (am besten mit den HTTP-Headern) per wget holen und dann posten?

Gruss / Thanx
    Stefan

StefanStrobel

Hallo nochmal,

ich vermute Dein Problem ist gerade anders herum gelagert als ich dachte:
Die Originaldaten von Deinem Gerät sind vermutlich bereits im utf-8 Encoding, auch wenn kein charset-Header geliefert wird.
Da kein Decode gemacht wird, aber danach ein Encode, sieht das Ergebnis falsch aus.
Vermutlich müsstest Du entweder bodyDecode utf8 und reading01Encode utf8 angeben (auto geht ja nicht mangels charset-Header) oder eben reading01Encode none.

Gruss
   Stefan

postman

Hallo Stefan
bodyDecode utf8 ist die Lösung.
Herzlichen Dank für die Hilfe.

Gruß Uwe
Raspberry Pi Version 2 QUAD-CORE CPU und 1 GB RAM, CUL V3 868 MHz,  stapelbarer CC1101 (SCC) 433 MHz, Enocean-Stick,Jeelink-Stick, BSB-Lanadapter

Spruch eines Ausbilders: Theorie ist, wenn man alles weiss und nichts funktioniert; Praxis ist, wenn alles funktioniert und keiner weiss warum...

freetz

Hallo,

ich klinke mich hier mal als Programmierer der Software, um die es geht, ein:
Danke erst einmal, Stefan, für die Problemlösung - ich würde gerne das Problem an der Wurzel lösen und frage mich gerade, warum dieses Problem auftritt, denn sowohl im HTTP-Header als auch im META Tag wird das Charset-Encoding UTF-8 mitgeschickt. Hier der komplette Abruf inkl. HTTP-Headern:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Length: unspecified

<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0,  minimum-scale=1.0">
<title>BSB-LAN</title>
<style>A:link  {color:blue;text-decoration: none;} A:visited {color:blue;text-decoration: none;} A:hover {color:red;text-decoration: none;background-color:yellow} A:active {color:blue;text-decoration: none;} A:focus {color:red;text-decoration: none;}
table {width: 100%;  max-width: 1024px;  margin: auto;}
td {vertical-align: top;}
td.header {vertical-align: middle;}
input {width: 100%; box-sizing: border-box;} select {width: 100%;}</style>
</head><body>
<script>function set(line){
var value = document.getElementById('value'+line).value.replace(/\.$/, '');
value = value.replace(':', '.');
value = value.replace('---', '');
if(isNaN(value)==false || value == ''){
window.open(document.getElementById('main_link').href+'S'+line+'='+value,'_self');
}}
function setbit(line){
var x=document.getElementById('value'+line); var value=0;
for (var i=0; i<x.options.length; i++) {
if(x.options[i].selected){
value=value+eval(x.options[i].value);
}}
window.open(document.getElementById('main_link').href+'S'+line+'='+value,'_self');
}</script>
<font face='Arial'>
<center><h1><a href='/4444/' ID=main_link>BSB-LAN</A></h1></center>
<table align=center><tr bgcolor=#f0f0f0><td class="header" width=20% align=center><a href='/4444/K'>Heizungsfunktionen</a></td><td class="header" width=20% align=center><a href='/4444/K49'>Sensoren</a></td><td class="header" width=20% align=center><a href='/4444/DG'>Zeichne Logdatei</a></td><td class="header" width=20% align=center><a href='/4444/Q'>Prüfe auf neue Parameter</a></td></tr>
<tr bgcolor=#f0f0f0><td class="header" width=20% align=center><a href='/4444/C'>Einstellungen</a></td><td class="header" width=20% align=center><a href='https://1coderookie.github.io/BSB-LPB-LAN/kap08.html#81-auflistung-und-beschreibung-der-url-befehle' target='_new'>URL-Befehle</a></td><td class="header" width=20% align=center><a href='https://1coderookie.github.io/BSB-LPB-LAN/inhaltsverzeichnis.html' target='new'>Handbuch</a></td><td class="header" width=20% align=center><a href='https://1coderookie.github.io/BSB-LPB-LAN/kap15.html' target='_new'>FAQ</a></td></tr></table><p></p><table align=center><tr><td class="header">
<tr><td> 712 Heizkreis 1 - Reduziertsollwert: 21.0 &deg;C</td><td>
<input type=text id='value712' VALUE='21.0'></td><td><input type=button value='Set' onclick="set(712)"></td></tr></td></tr></table>
</body>
</html>


Wo müsste ich hier noch etwas ändern, damit es für die User möglichst transparent läuft?
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

StefanStrobel

Hallo freetz,

mit der HTTP-Response, die Du gepostet hast, sollte HTTPMOD problemlos klarkommen.
Der Default für bodyDecode war mal ein paar Monate auf auto. Das hat aber zu viele Probleme verursacht. Wenn es JSON-Daten waren, dann hat sich der JSON-Parser an den dekodierten Daten verschluckt.
Daher ist er jetzt auf none.

Der Default für das Encoding von Readings ist utf8 sofern nicht explizit bodyDecode none angegeben wird.
Beides zusammen ist zu viel wenn schon utf8-Daten gelesen werden und der Anwender weder bodyDecode noch readingXYEncode angibt.
Wenn Anwender explizit angeben was sie wollen, dann sollte es keine Probleme geben. Aber die Defaults führen in verschiedenen Fällen so oder so zu Problemen.

Vielleicht hat ja noch jemand eine Idee, wie man die Defaults "intelligenter" machen kann...

Gruss
   Stefan

freetz

Hallo Stefan,

danke für die Rückmeldung, dann bin ich erst mal froh, dass es nicht "an mir" liegt - ich denke, UTF-8 als Default macht auf jeden Fall Sinn: ISO-8859-1(?) ist bei den Werten 0x00-0xFF von UTF-8 mit abgedeckt und Standard-ASCII ja sowieso. Und nach über 20 Jahren UTF werden die Ausnahmen auch immer weniger werden :)...

VG, F.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

StefanStrobel

Hallo zusammen,

ich habe hier https://forum.fhem.de/index.php/topic,45176.1035.html nochmal eine neue Version mit geändertem Verhalten zum Testen gepostet.
Es wäre schön wenn Ihr kurz prüfen könntet, ob das für Euch passt.

Gruss
   Stefan