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
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.
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
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' => \¨aut_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.
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