Umlaute unterschiedlich readingsBulkUpdate <=> Refresh Screen

Begonnen von Elektrolurch, 20 April 2021, 12:36:56

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

Folgendes Problem:

Ich bekomme aus OSM Adressdaten und setze diese mit readingsBulkUpdate.
Dadurch werden diese auf dem Bildschirm aktualisiert, ohne dass der ganze Bildschirm neu gezeichnet werden muss.
Allerdings sind Umlaute und "ß" kaputt.
Gebe ich den Inhalt der Readings mit

{ReadingsVal('Teslana','position_addr','nix gefunden')}

aus, so sieht alles ganz ordentlich aus.
Beispiel: Emanuelstraße

Wird die Seite im FF oder Safari mit F5 (neu geladen) sind Umlaute und ß auch korrekt.
Also nur bei "readingsBulkUpdate" funktioniert es nicht korrekt.

Wie könnte man das beheben?

Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Die Beschreibung ist leider zu ungenau:
- was heisst "kaputt"
- wie genau kommt man zu den Daten
- welches Frontend wird mit welchem Style wird verwendet
- wie werden diese zum Browser geschickt (longpoll/websocket)
- was steht im Event-Monitor
- etc.

Ich habe mit einem einfachen Test kein Problem:
fhem> define dummy dummy
fhem> setreading dummy test aaa
FHEMWEB Detailseite fuer dummy oeffnen
fhem> setreading dummy test äöüß

=> Siehe Anhang.

Bei kaputten Umlauten ist haeufig das Encoding das Problem, d.h. meist versucht man FHEM "das alte" latin1 unterzujubeln, FHEM besteht aber auf UTF-8.

Elektrolurch

Hallo Rudi,

also mit "setreading" wird es auch bei mir korrekt angezeigt.

Zu Deinen Fragen:
- was heisst "kaputt"
Es sind irgendwelche Sonderzeichen, auf gut boarisch sagt man "wntlbrnft". Für ß kommt ein ?.

- wie genau kommt man zu den Daten

my $api_uri = "http://nominatim.openstreetmap.org/reverse?format=json&accept-language=de&lat=$la&lon=$lo&zoom=18&addressdetails=12&email=mailaddresse";
#### Get status variables
  my $param = {
'url' => $api_uri,
'hash' => $hash,
'format' => 'json',
'header'  => 
{
'Accept' => "application/json"
},
'timeout' => 10,
'callback' => \&TeslaCar_UpdateAddressCallback
}; # param

Log3 $name, 4, "TC_UpdateAddress: $name request: $param->{url}";

  HttpUtils_NonblockingGet($param);

Zurück kommt dann:

my $JSON = JSON->new->utf8(0)->allow_nonref;

if($err ne "")
{
Log3 $name, 1, "TeslaCar_updateAddressCallback: error while requesting ".$param->{url}." - $err";
} # if error
elsif($data ne "")
{
Log3 $name, 5, "TeslaCar_UpdateAddressCallback: $name returned: \n$data";

my $parsed = eval {$JSON->decode ($data)};
if($@)
{
Log3($name,1,"TeslaCar_UpdateAddressCallback: $name - JSON error requesting data: $@");
} # json parse error
else
{
# readings

my $short = $parsed->{address};
...
readingsBeginUpdate($hash);
if($address && readingsval($hash,'position_addr','') ne $address)
{
Log3($name,1,"Callback: position_addr $address");
readingsBulkUpdate($hash,'position_addr',$address,1);
...


- welches Frontend wird mit welchem Style wird verwendet
WEBphone mit
longpoll 1
stylesheetPrefix darksmallscreen

- was steht im Event-Monitor
Die log-Ausgabe  sieht korrekt aus:

2021.04.21 11:35:03 1: Callback: position_addr Roggensteiner Straße
2021.04.21 11:36:04 1: Callback: position_addr Roggensteiner Straße 29

Fährt gerade:
Update Bildschirm:

Dachauer Straße 86
]/cod]
im log
[code]
2021.04.21 11:40:07 1: Callback: position_addr Dachauer Straße 86

Wie schon oben beschrieben, reload des Browsers und dann ist die Anzeige wieder korrekt.

Elektrolurch


configDB und Windows befreite Zone!

rudolfkoenig

Ich habe mir aus deinen Programmteilen eine standalone Testfunktion geschrieben:
sub
umlaut_test($)
{
  my ($hash, $err, $data) = @_;

  if(!defined($err) && !defined($data)) {
    my $param = {
      'url' => "http://nominatim.openstreetmap.org/reverse?format=json&".
                "accept-language=de&lat=8.56&lon=39.41&addressdetails=12",
      'header'  => { 'Accept' => "application/json" },
      'hash'    => $hash,
      'callback' => \&umlaut_test
    };
    return HttpUtils_NonblockingGet($param);
  }

  $hash = $hash->{hash};
  Log 1, "GOT:\n$data";
  my $JSON = JSON->new->utf8(0)->allow_nonref;
  my $parsed = eval {$JSON->decode ($data)};
  my $dn = $parsed->{display_name};
  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash,'display_name',$dn,1);
  readingsEndUpdate($hash, 1);
}

danach in einem Test-Fhem
fhem> define dummy dummy
fhem> setreading dummy display_name Bla
ausgefuehrt, danach die Detailseite fuer dummy geoeffnet, und
fhem> { umlaut_test($defs{dummy}) }
ausgefuehrt.

Siehe Anhang => Could not reproduce.

Elektrolurch

Hallo Rudi,

danke für die Bemühungen.
Wenn ich

$data = decode('utf8',$data);

in den CallBack einfüge, dann kommen auch die Umlaute korrekt.
Verstehen tue ich allerdings nicht, warum der Browser es korrekt anzeigt, aber bei mir mit dem Update über readingsBulkUpdate die Umlaute bei den Straßennamen nicht korrekt kommen.

Na ja, jetzt geht es ja....

Elektrolurch

configDB und Windows befreite Zone!