configDb, FileWrite Fileread usw.

Begonnen von Wzut, 17 September 2020, 13:22:19

Vorheriges Thema - Nächstes Thema

Wzut

das Thema war heute mal wieder aktuell in https://forum.fhem.de/index.php/topic,114277.msg1085763.html#msg1085763
um dort nicht weiter OT zu werden konkret die Frage : wie erstelle ich eine Liste von Dateien wenn diese nicht direkt im Dateisystem liegen sondern in einer configDb ?

Zitat von: betateilchen am 17 September 2020, 12:39:54
Kein Entwickler sollte jemals interne Funktionen der configDB.pm in seinen eigenen Modulen direkt verwenden und aufrufen. Die Freiheit, solche Funktionen umzubenennen oder deren Schnittstelle zu ändern, nehme ich mir jederzeit.

ok, kein Problem, allerdings mit dem Wissen wie man es nicht macht komme ich leider nicht weiter. Wie könnte dann eine richtige Lösung aussehen ?
Hier mal was ich heute habe um für FHEMWEB set/get die Dropdownliste zu befüllen :
sub MAX_FileList
{
    my $dir  = shift;
    my $file = shift // '';
    my @ret;
    my $found = (!$file) ? 1 : 0;

    if (configDBUsed()) {
        my @files = split(/\n/x, _cfgDB_Filelist('notitle'));
        foreach my $f (@files) {
            next if ( $f !~ m{\A $dir}xms);
            next if ( $f !~ m{\.max\z}xms);
            $f =~ s/$dir//x;
            $f =~ s/\.max//x;
            next if (!$f);
            $found = 1 if ($f eq $file);
            push @ret, $f;
        }
    }
    else {
        return 0 if (!opendir(DH,$dir));
        while(readdir(DH)) {
            next if ( $_ !~ m{\.max\z}xms);
            $_ =~ s/\.max//x;
            $found = 1 if ($_ eq $file);
            push @ret, $_ if ($_) ;
        }
        closedir(DH);
    }
    return @ret if ($found);
    return 0;
}


   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

rudolfkoenig

Falls betateilchen eine "nicht-interne" Funktion nennt, kann ich gerne eine FileList Funktion bauen.

betateilchen

Ich habe noch nicht genau verstanden, was Wzut da genau machen will, aber ich glaube, dass es schon Mechanismen in FHEMWEB geben könnte, die das Ansinnen out-of-the-box unterstüzen.

@Wzut: schreib mich doch mal per email an und erkläre mir, was Du genau machen möchtest.

Zitat von: rudolfkoenig am 17 September 2020, 14:51:41
Falls betateilchen eine "nicht-interne" Funktion nennt, kann ich gerne eine FileList Funktion bauen.

@Rudi: ich komme gerne auf das Angebot zurück. Ganz so einfach wie bei FileWrite() oder FileRead() ist das nicht, sonst hätte ich längst einen entsprechenden Vorschlag gemacht. Es wären bei FileList() durchaus ein paar Spezialfälle zu berücksichtigen, die Entscheidung anhand von configDBUsed() alleine reicht auf keinen Fall aus, um ein zuverlässig "richtiges" Ergebnis zu liefern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wzut

Zitat von: betateilchen am 19 September 2020, 10:45:41
@Wzut: schreib mich doch mal per email an und erkläre mir, was Du genau machen möchtest.
Done, und für alle anderen : Habe ich mich so unklar ausgedrückt ? Ich will einfach eine Liste der aus dem Modul heraus gespeicherten configs von den MAX Geräten.
Das speichern macht heute FileWrite , das zurück lesen FileRead. In FHEMWEB bekommt der User eine Dropdown Liste welche Geräte bisher gesichert wurden und um diese Liste zu erstellen muss ich ja irgendwie feststellen welche Dateien vorhanden sind, genau das macht die oben gepostet sub.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

betateilchen

Zitat von: Wzut am 19 September 2020, 19:26:34
um diese Liste zu erstellen muss ich ja irgendwie feststellen welche Dateien vorhanden sind, genau das macht die oben gepostet sub.

Genau das macht aber grundsätzlich auch die von FHEMWEB bereitgestellte Funktion FW_fileList() und dabei wird automagisch configDB mit verwurstet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wzut

na prima , dann werde ich das mal mit FW_fileList(%L/^.*max$) probieren :) 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

ich muß das Thema leider nochmal hochholen :(
Ich hatte bei mir umgebaut auf
my @list = FW_fileList('%L/.*max');
Klappt bei mir und den ersten Testern auch wunderbar, aber nun schlägt ein User auf bei dem die Liste leer ist, obwohl im Log Verzeichniss einige Dateien mit der Endung .max liegen.
D.h. doch das bei ihm ( warum auch immer ) %L nicht durch global logdir ersetzt wird ?

Der User ist allerdings für mich keine echte Referenz, da bei ihm die im MAX Modul ebenfalls genutzte sub Logdir() aus fhem.pl nicht gefunden wird.
Er brachte 10_MAX erst dann ans laufen nachdem wir testweise den Einzeiler direkt ins MAX Modul übernommen haben. 
Entweder ist das ne andere Baustelle oder es steht im direkten Zusammenhang mit dem %L Problem, so ganz durchschaue ich es noch nicht. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

betateilchen

Zitat von: Wzut am 18 Oktober 2020, 17:32:54
aber nun schlägt ein User auf bei dem die Liste leer ist, obwohl im Log Verzeichniss einige Dateien mit der Endung .max liegen.
D.h. doch das bei ihm ( warum auch immer ) %L nicht durch global logdir ersetzt wird ?

Der User ist allerdings für mich keine echte Referenz, da bei ihm die im MAX Modul ebenfalls genutzte sub Logdir() aus fhem.pl nicht gefunden wird.

Die Funktion Logdir() gibt es in der fhem.pl erst seit Rev 21337, das war Anfang März diesen Jahres.
Deshalb tippe ich auf ein Altersproblem der eingesetzten FHEM Installation, lass Dir doch mal die Versionsstände nennen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hier hast Du übrigens die Bestätigung für meine Vermutung:


Zitat2020.10.11 16:30:28 0: Server started with 6 defined entities (fhem.pl:21056/2020-01-26 perl:5.028001 os:linux user:fhem pid:24150)

"Frisches" FHEM installiert, aber kein updates gemacht.

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

Wzut

Danke Udo für die Unterstützung, hatte ich glatt übersehen. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher