Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

xml in myUtils improtieren und in Readings ausgeben - Codierungsfehler?

Begonnen von Invers, 14 August 2024, 19:37:45

Vorheriges Thema - Nächstes Thema

Invers

Ich habe eine Sub in myUtils mit Hilfe von ChatGPT eingefügt, die eigentlich auch funktioniert, aber die Umlaute werden nicht korrekt dargestellt, sondern statt dessen Sonderzeichen Fragezeichen in einer Raute. Die Versuche von ChatGPT dies zu beseitigen, blieben leider ohne Erfolg.

Hier mal ein Beispiel, im Browser ist alles richtig dargestellt und im Reading dan so z.B.:
pure fm - berlins electronic radio - now ON-AIR: Kids� ft. Robins - Better Days


sub fetch_and_save_radio_info {
    my $url = 'http://192.168.178.78/YamahaExtendedControl/v1/tuner/getPlayInfo';
    my $ua = LWP::UserAgent->new;
    my $response = $ua->get($url);

    if ($response->is_success) {
        my $json = decode_json($response->content);

        return undef unless exists $json->{dab};

        my $sender = $json->{dab}->{service_label};
        my $dls = $json->{dab}->{dls};

        # Variablen für Titel setzen
        my ($current_title, $next_title) = ("", "-");

        # Überprüfe auf verschiedene Muster
        if ($dls =~ /^JETZT ON AIR :: (.*?) :: (.*)$/) {
            # Variante mit "JETZT ON AIR ::", Doppelpunkte werden durch " - " ersetzt
            $current_title = "$1 - $2";
        } elsif ($dls =~ / --- /) {
            # Zwei Titel vorhanden, trennt den String bei ' --- '
            ($current_title, $next_title) = split(/ --- demn.chst: /, $dls);
        } else {
            # Nur ein Titel vorhanden, speichere diesen als current_title
            $current_title = $dls;
        }

        # Speichern in den FHEM-Dummy
        fhem("setreading DI_SenderTitel Sender $sender");
        fhem("setreading DI_SenderTitel Titel_Gerade $current_title");
        fhem("setreading DI_SenderTitel Titel_Demnaechst $next_title");
    } else {
        warn "Fehler beim Abrufen der Daten: ", $response->status_line, "\n";
        return undef;
    }
}

Gibt es da einen einfachen Weg zur Korrektur?

Für Hilfe, Tipps und Infos diesbezüglich wäre ich sehr dankbar.

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

  • Der Umweg über LWP::UserArgent ist komplett überflüssig, FHEM stellt eigene Funktionen für den Aufruf einer URL bereit, z.B. GetFileFromURL()
  • Für die Konvertierung von/nach UTF8 gibt es ebenfalls Funktionen in FHEM utf8ToLatin1() und latin1ToUtf8()

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Invers

Vielen Dank für die Tipps.

Ich habe deine Empfehlungen eingearbeitet, kann aber die Funktionalität meines Code noch nicht bestätigen, mangels gelieferter Umlaute.
uPDATE: Alles funktioniert. Nochmals vielen Dank.
Der neue Code sieht so aus:

sub fetch_and_save_radio_info {
    my $url = 'http://192.168.178.78/YamahaExtendedControl/v1/tuner/getPlayInfo';

    # Verwende die FHEM-eigene Funktion GetFileFromURL
    my $response_content = GetFileFromURL($url);

    if ($response_content) {
        # Konvertiere den Inhalt von Latin-1 nach UTF-8
        my $utf8_content = latin1ToUtf8($response_content);

        my $json = decode_json($utf8_content);

        return undef unless exists $json->{dab};

        my $sender = $json->{dab}->{service_label};
        my $dls = $json->{dab}->{dls};

        # Variablen für Titel setzen
        my ($current_title, $next_title) = ("", "-");

        # Überprüfe auf verschiedene Muster
        if ($dls =~ /^JETZT ON AIR :: (.*?) :: (.*)$/) {
            # Variante mit "JETZT ON AIR ::", Doppelpunkte werden durch " - " ersetzt
            $current_title = "$1 - $2";
        } elsif ($dls =~ / --- /) {
            # Zwei Titel vorhanden, trennt den String bei ' --- '
            ($current_title, $next_title) = split(/ --- demn.chst: /, $dls);
        } else {
            # Nur ein Titel vorhanden, speichere diesen als current_title
            $current_title = $dls;
        }

        # Speichern in den FHEM-Dummy
        fhem("setreading DI_SenderTitel Sender $sender");
        fhem("setreading DI_SenderTitel Titel_Gerade $current_title");
        fhem("setreading DI_SenderTitel Titel_Demnaechst $next_title");
    } else {
        warn "Fehler beim Abrufen der Daten von der URL: $url\n";
        return undef;
    }
}
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

Invers

Zitat von: betateilchen am 14 August 2024, 19:49:56
  • Der Umweg über LWP::UserArgent ist komplett überflüssig, FHEM stellt eigene Funktionen für den Aufruf einer URL bereit, z.B. GetFileFromURL()
  • Für die Konvertierung von/nach UTF8 gibt es ebenfalls Funktionen in FHEM utf8ToLatin1() und latin1ToUtf8()


wo findet man denn Funktionen, wie z. B. latin1ToUtf8 ?
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

JoWiemann

Zitat von: Invers am 15 August 2024, 11:42:06wo findet man denn Funktionen, wie z. B. latin1ToUtf8 ?

Hallo,

nur, in dem man es weiß oder in die fhem.pl schaut. Ist schon interessant, was man da so alles an Nützlichem findet.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Zitat von: JoWiemann am 15 August 2024, 11:50:45in dem man es weiß oder in die fhem.pl schaut

oder hier im Forum mal die Suche benutzt, bevor man eine Frage stellt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Invers

Zitat von: betateilchen am 15 August 2024, 14:51:35
Zitat von: JoWiemann am 15 August 2024, 11:50:45in dem man es weiß oder in die fhem.pl schaut

oder hier im Forum mal die Suche benutzt, bevor man eine Frage stellt.
Du kannst mal getrost davon ausgehen, dass ich immer die Suche nutze, bevor ich hier Fragen stelle. Um das zu wissen, bin ich ja schon lange genug dabei. Ich bekomme auch noch dazu oft mit, dass Andere darauf verwiesen werden. Ich lese hier auch täglich, ohne zu fragen.


Zitat von: JoWiemann am 15 August 2024, 11:50:45
Zitat von: Invers am 15 August 2024, 11:42:06wo findet man denn Funktionen, wie z. B. latin1ToUtf8 ?

Hallo,

nur, in dem man es weiß oder in die fhem.pl schaut. Ist schon interessant, was man da so alles an Nützlichem findet.

Grüße Jörg
Danke, guter Tipp. Mir wäre das nicht in den Sinn gekommen, da mal rein zu sehen.
Ich ging immer davon aus, dass man so etwas in der Commandref oder einer anderen Liste finden würde.
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