FTP Backup - Umlauteproblem

Hallo,

es gibt aktuell noch ein Umlauteproblem beim automatischen Backup der Verlaufsdaten auf FTP. Scheinbar werden dabei Sonderzeichen und Umlaute nicht mit der korrekte Codierung übertragen.
2018-09-03_Homee_FTP_Backup_Umlauteproblem

Offenbar wird hier nicht UTF8 oder ISO-8859-1 als Codierung verwendet. Ein workarround wäre natürlich keine Umlaute zu verwenden, jedoch werden die Namen u.A. im Homekit verwendet und man müsste dann ggf. alle Namen wieder manuell in der Home App anpassen, damit Sie Siri richtig versteht.

Viele Grüße

Tom

Worüber ist werden die Backups gespeichert?
Über eine FritzBox? Oder eine andere NAS-Lösung?

Falls synonogy:
Dort UTF 8 erzwingen

Klugscheißer-Nebenbemerkung zu:

Ein workarround wäre natürlich keine Umlaute zu verwenden

Das ist nur solange korrekt, wie du kein Gerät mit nem Umlaut in der Parameterbezeichnung hast, wie es z.B. bei “Geräuschpegel” der Fall ist.

Auf der Fritzbox kann man UTF m.W. nicht erzwingen. (lasse mich aber gerne eines Besseren belehren) Bei Synology geht das wie bereits erwähnt. Falls man beides hat, kann man sich auch nen Script schreiben, welches die Dateien von der Fritzbox beim Hochfahren des Synology abholt und dabei die Umlaute entsprechend konvertiert.

Ist Synology. Hab die Einstellung gesetzt. Sollte aber nicht die Finale Lösung sein, da murcielago korrekt eingeworfen hat, dass das auf Nicht-Syonlogy FTP Servern zwangsläufig nicht möglich ist.

Ich habe eine zugegebenermaßen alte TerraStation (NAS). Da kann ich auch nichts erzwingen. Habe bisher weder vom Mac noch vom PC Probleme mit den Umlauten gehabt.
Der Verlaufsordner sieht dann so aus:

Bei den Namen der Sensoren/Aktoren kann ich das ggf. noch anpassen und für Alexa den Rufnamen “normal” mit Umlauten eintragen. Bei den Meßwerten geht das allerdings nicht.

Für micht ist das zur Zeit nur ein optischen Problem. Wenn man die Pfade für eine Auswertung in einem anderen Programm eingeben will, wir es dann schon schwieriger…

UTF8 ist absolut ok
Wenn andere das noch nicht können (AVM), ist das kein homee issue

Edit:

Und

https://wiki.filezilla-project.org/Character_Encoding

Moin,

Man kann nicht immer und mit allem auf dem neuesten Stand sein, wenn andere Software kein Problem damit hat, das auf “ältere” Systeme korrekt zu schreiben, frage ich mich ob das wirklich so schwer sein kann. Klar macht homee nichts falsch, aber scheinbar auch nicht alles richtig…

Solange man mit den exportierten Daten eh nichts anfangen kann ist es mir ja egal, aber irgendwann wird der Tag kommen wo das Probleme macht…

Viele Grüße
JayJay

1999 ist lange her:

Zitat aus dem oberen Link (Stack overflow)

In order to support non-English characters, the FTP specifications were extended in 1999 in RFC 2640. This extension requires the use of UTF-8 as the character set. This character set is a strict superset of ASCII, every valid ASCII character is also the same character in UTF-8. The UTF-8 character set can display any valid Unicode character. That includes umlauts, accented letters and also different scripts. This extension is fully backwards compatible with RFC 959. As long as you’re using only English characters, it doesn’t matter if the software you are using supports RFC 2640 or not. However, if you use non-English characters without using RFC 2640 compatible software, there will be problems–problems which are entirely self-made by not obeying the specifications.

EDIT:
Wers nachlesen will, findet RFC 2640 hier.

Genau, das ist mein Problem gewesen. Ich will die Daten in eine DB schubsen und da hat es mein Skript durch die Sonderzeichen komplett quergestellt.

Machen kann, oder will?

Mag sein, das der ein oder andere damit etwas anfangen kann, ich für meinen Teil halte alle bekannten Lösungen für viel zu kompliziert… Passt das so?

Viele Grüße
JayJay

Hast Du Dir mal die Lösung von @xenji angeschaut?
https://www.homeepedia.de/books/homee-metriken/chapter/homee-verlaufsdaten-ftp-export-autom-in-mysql-importieren

Was ich noch empfehlen kann ist ioBroker, den homee Adapter und den SQL Adapter installieren und du kannst entscheiden welche Daten in die DB geschrieben werden sollen. Den Namen für den Datenpunkt selbst bestimmen und somit Umlaute verhindern. Der Vorteil die Daten werden in Echtzeit in die DB geschrieben.

1 „Gefällt mir“

Bei mir ist es z.B. so, dass das NAS nicht die ganze Zeit an ist (insbesondere nicht nachts), mein Fritzbox aber. Letztere nutze ich als FTP für die homee-Backups.

Per Webserver bzw. PHP-Script ziehe ich mir die Dinger dann in ne Datenbank und zur Ablage auf ein anderes Verzeichnis auf dem NAS (also im Prinzip: FTP-Download, Speichern in DB und FTP-Upload, wobei beim letzteres Quell- und Zielsystem quasi identisch sind, nur ne andere Ordnerstruktur). Am Ende wird dann noch nen Webhook abgeschossen, damit homee mich informieren kann, dass die Synchronisation zwischen Fritzbox und NAS abgeschlossen ist. Bin Laie bei PHP und hab mir das Script auch nur Dank des Internets zusammen geklimpert.

Worauf ich hinaus will: Beim ersten Schritt (Dateien von Fritzbox abholen) konvertiere ich die fehlerhaften Umlaute entsprechend im PHP-Script. Und wenn ich das sogar schaffe, dann schafft das jeder. :slight_smile:

2 „Gefällt mir“

Moin,

Und wenn Du das jetzt noch veröffentlichst, dann muß sich das nicht jeder Laie selber zusammen suchen :wink:

Viele Grüße
JayJay

2 „Gefällt mir“

Könnte ich, wenn ich zu Hause wäre bzw. mein NAS an wäre. Bin ich aber nicht bzw. ist es nicht :slight_smile: Aber da ich selbst Laie bin, übernehme ich natürlich keine Gewähr für irgendwas. Gucke aber, dass ich das Script bzw. die entsprechende Stelle später finde. Wie gesagt, ich habe null Ahnung von Webserver, PHP oder sonstwas, kann aber grundsätzlich programmieren.

Könnte aber sein, dass bereits der folgende Befehl das Problem löst:

http://php.net/manual/de/function.utf8-encode.php

Der Rückweg passt besser , du willst ja gerade keinen Unicode

http://php.net/manual/de/function.utf8-decode.php

Meine ich ja :slight_smile: Aber ja, das ist die Textzeile, um die Dateibezeichnungen beim FTP-Download zu konvertieren.

Danke @Kobold

Moin,

so, ich hier jetzt mal der Download von Dateien mit Umlaut-Konvertierung. Meine Architektur sieht so aus:

  • Fritzbox als FTP-Server im homee eingerichtet (ich nutze keinen externen USB-Speicher sondern den internen Speicher vom Fritz-Nas > das Script löscht die Dateien auf der Fritzbox, sodass dort nie wirklich viel Speicherplatz benötigt wird)
  • eigener Benutzer in Fritzbox angelegt, der nur Berechtigung für den zentralen homee-Ordner hat
  • Webserver auf Synology-NAS, wo das PHP-Script liegt

Wie gesagt, ich habe null Ahnung von PHP, Webservern usw. und hab mir den Kram nur aus dem Internet zusammengesucht. Mag sein, dass Namenskonventionen nicht eingehalten werden oder sonstwas. Ob es sicherheitstechnisch so toll ist, nen Nutzer und nen Passwort direkt ins Script zu schreiben bzw. ob es anders geht, weiß ich auch nicht. Andererseits ist der Nutzer auf der Fritzbox auch nur für FTP zugelassen bzw. dort von den Berechtigungen her eingeschränkt.

Es tut bei mir das, was es tun soll, nämlich:

  • Dateien von Fritzbox auf Webserver runterladen, welcher auf nem Synology-NAS läuft
  • Genauer gesagt, wird die Funktion ftp_downloadAll rekursiv aufgerufen und dabei die komplette Ordnerstruktur aus dem Quellverzeichnis in das Zielverzeichnis übertragen (ich habe z.B. je einen Unterordner für das Backup und die Werte aus den Geräten im zentralen homee-Ordner der Fritzbox)
  • Der Parameter $ftp_server_down beinhaltet die IP-Adresse der Fritzbox
  • Der Parameter $ftp_user_name_down ist der Nutzername in der Fritzbox für den FTP-Download
  • Der Parameter $ftp_user_pass_down ist das Passwort in der Fritzbox für den o.g. Nutzer
  • $dir_remote beinhaltet den Root-Pfad in der Fritzbox (bei mir in der Fritzbox hat der Benutzer nur Zugriff auf den homee-FTP-Ordner und nicht auf das ganze Fritz-NAS, deswegen nur “.” als Wert)
  • $dir_store beinhaltet die Pfadangabe für den Webserver, d.h. im konkreten Fall wird in dem Ordner, wo das Script liegt, ein Unterordner “tmp” angelegt und dort wird die komplette Ordnerstruktur aus der Fritzbox (homee-Ordner) erstellt bzw. die Dateien kopiert
  • Die Dekodierung der Umlaute erfolgt mit dem Befehl utf8_decode
  • Mit dem globalen Paramter _DELETESERVERFILES kann man steuern, ob die Dateien auf der Fritzbox gelöscht werden > da ich keinen externen Speicher an der Fritzbox habe, lösche ich die Dateien dort > es ist anzuraten, den parameter auf “false” zu setzen, während man testet (sonst sind die Dateien mit den komischen Symbolen weg und man muss erst wieder manuell welche rüberschaufeln, was ja bisher nur für Backups geht, wo es keine Umlaute gibt. Muss man also bis zum nächsten Tag warten…glaub mir, das nervt :slight_smile:)

Code:

<?php

define("_DELETESERVERFILES", true); // delete files from ftp server after download

//****************************************************************************************************************************************
//Global parameters for download functions
//****************************************************************************************************************************************
$ftp_server_down = "192.XYZ.ABC.1"; //host name / ip of download server
$ftp_user_name_down = "fritz_box_download_user"; // Username download server
$ftp_user_pass_down = 'fritz_box_download_user_password'; // Password download server
$dir_remote = "."; //name of download folder of the download server / "." if directory is to be read from root
$dir_store = "tmp"; //name of download folder in PHP file root directory

$conn_id_down = ftp_ssl_connect($ftp_server_down)
or die("<span style='color:#FF0000'><h2>Couldn't connect to $ftp_server_down</h2></span>");

$login_result_down = ftp_login($conn_id_down, $ftp_user_name_down, $ftp_user_pass_down);
if ((!$conn_id_down) || (!$login_result_down)) {
    die("<span style='color:#FF0000'><h2>You do not have access to this ftp server!</h2></span>");
}

//Call main function
$error = ftp_downloadAll($conn_id_down, $dir_remote, $dir_store, true); // Use "." if you want to download from root directory / second parameter specifies the download directory

//close FTP connection
ftp_close($conn_id_down);

function ftp_downloadAll($conn_id_down, $dir_remote, $dir_local, $firstcall)
{
    $download_error = false;
    $path = $dir_local . "/" . $dir_remote;
    $path = utf8_decode($path);

    /*
    - this ensures, that all files are downloaded, also containing special characters like "ä,ö,ü",
    but there might be no conversion (e.g. from Fritzbox) but "weird" symbols
    - however, it works to download all files
     */
    ftp_raw($conn_id_down, 'OPTS UTF8 ON');
    if ($dir != ".") {

        if (ftp_chdir($conn_id_down, $dir_remote) == false) {
            //echo ("<BR>Change Dir Failed: $dir<BR>\r\n");
            return;
        }

        if (!(is_dir($path))) {
            mkdir($path);
        }

        chdir($path);
    }

    $contents = ftp_nlist($conn_id_down, ".");
    foreach ((array) $contents as $file) {

        if ($file == '.' || $file == '..') {
            continue;
        }

        if (@ftp_chdir($conn_id_down, $file)) {
            //if it is a subfolder > move to next folder-level by recursive call
            ftp_chdir($conn_id_down, "..");
            ftp_downloadAll($conn_id_down, $file, ".", false);
        } elseif (!empty($file)) {

            $file_utf8 = utf8_decode($file); //translate file name to UTF-8

            if (ftp_get($conn_id_down, $file_utf8, $file, FTP_BINARY)) //download file
            {

                if (_DELETESERVERFILES == true) {
                    // try to delete file from server
                    if (ftp_delete($conn_id_down, $file)) {

                    } else {
                        $download_error = true;
                    }

                }

            } else {
                $download_error = true;

            }
        }
    }

    if ($firstcall == false) {
        ftp_chdir($conn_id_down, "..");
    }

    chdir("..");
    return $download_error;
}
?>
2 „Gefällt mir“

Ich hab den Code mal über vorformatierten Text besser lesbar gemacht…