configDB - 99.* Dateien werden mehrfach geladen

Begonnen von betateilchen, 26 April 2014, 11:18:20

Vorheriges Thema - Nächstes Thema

betateilchen

Zitat von: rudolfkoenig am 26 April 2014, 10:03:47

Wir sollten alles auf einem zu bauenden readFile/writeFile umstellen (Argument und Rueckgabe ein array von Zeilen), damit die eigentlichen Funktionen an eine Stelle sind.


Damit hab ich kein Problem. Wobei das mit den Attributen auch dann ein Sonderfall bleibt, da die Attribute nicht als File gelesen, sondern aus der Datenbank selektiert werden. Ich könnte da aber problemlos ein Array mit drei Werten pro Zeile zurückliefern:

<deviceName>, <attrName>, <attrVal>

Hintergrund ist, dass ich in cfgDB_GlobalAttr nicht nur Attribute für "global" setze, sondern auch Attribute für "configdb" die intern für die Verwaltung gebraucht werden.

Die generelle Umstellung bzw. Vereinheitlichung auf readFile/writeFile können wir auch gerne angehen, aber dazu muss ich erst ermitteln, welche der in den letzten Tagen eingebauten Änderungen dadurch noch einmal geändert werden müssen. Das würde ich wegen bevorstehendem Urlaub aber auf Mitte Mai verschieben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig


betateilchen

Für die Attribute kannst Du die Lösung jetzt schon umsetzen:


sub
setGlobalAttrBeforeFork($)
{
  my ($f) = @_;
  my @attributes;
 
  if($f eq 'configDB') {
    @attributes = cfgDB_AttrRead('global');
    #  will return an array with lines like
    #  <deviceName>,<attrName>,<attrVal>
    #  e.g.:
    #  global,verbose,3
    #  configdb,private,1
  } else {
    # @attributes = readGlobalAttributesFromConfigFile
  }


#  if($f eq 'configDB') {
#    cfgDB_GlobalAttr();
#    return;
#  }

  open(FH, $f) || die("Cant open $f: $!\n");
  while(my $l = <FH>) {
    $l =~ s/[\r\n]//g;
    next if($l !~ m/^attr\s+global\s+([^\s]+)\s+(.*)$/);
    my ($n,$v) = ($1,$2);
    $v =~ s/#.*//;
    $v =~ s/ .*$//;
    $attr{global}{$n} = $v;
    GlobalAttr("set", "global", $n, $v);
  }
  close(FH);
}


Du musst dann das Lesen des Arrays und das Setzen der Attribute komplett in der fhem.pl vornehmen, configDB wird da nichts mehr aktiv tun.

Im Moment funktionieren  beide Wege. Sobald Du den Umbau in der fhem.pl umgesetzt hast, werde ich die alte Funktion cfgDB_GlobalAttr() entfernen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: rudolfkoenig am 26 April 2014, 08:57:12
Ich habe
- in setGlobalAttrBeforeFork GlobalAttr aufgerufen.

Diese Änderung und der dadurch notwendig gewordene Umbau in der korrespondierenden configDB-Funktion führt zur Zeit dazu, dass alle 99er Module während des fhem-Start zweimal geladen werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Zitatalle 99er Module während des fhem-Start zweimal geladen werden.

Um klar zu sagen, das ist nur im Fall von configDB. Ich habe ein
if(!$modules{$m}{LOADED});
hinzugefuegt, kannst Du es bitte pruefen, ob es hilft?

betateilchen

Zitat von: rudolfkoenig am 30 April 2014, 12:26:29
Um klar zu sagen, das ist nur im Fall von configDB.

Das hatte ich doch auch in meinem Hinweis geschrieben?

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

rudolfkoenig

ZitatDas hatte ich doch auch in meinem Hinweis geschrieben?

Stimmt, ich wollte es nur fuer die anderen klarstellen, ich meine das war leicht zu ueberlesen.

betateilchen

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

rudolfkoenig

Kannst Du mir bitte das Leben einfacher machen, und etwas gespraechiger sein?
Was funktioniert nicht? Wird es erneut geladen? Woher weisst Du es? Wird es gar nicht geladen? Fehlt dir was anderes?

betateilchen

Die 99er werden immer noch doppelt geladen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Wir sollten auch das Lesen der globalen Attribute standardisieren, damit der Aufruf von GlobalAttr nur jeweils einmal in der fhem.pl durchgeführt werden muss. Eine Möglichkeit, die globalen Attribute aus der configDB zu lesen, um sie in fhem.pl verwenden zu können, hatte ich weiter oben schon beschrieben.

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

rudolfkoenig

ZitatDie 99er werden immer noch doppelt geladen.

Das kann ich nach ein weiteres Mal eine Weile auf dem Code starren immer noch nicht nachvollziehen.
CommandReload setzt $modules->{$m}{LOADED}, und sie wird nur bei einem nicht gesetzten LOADED wieder aufgerufen.

Zitathatte ich weiter oben schon beschrieben.

Waere es moeglich, dass ich fuer desen Zweck auch FileRead (und damit in configDB Fall cfgDB_FileRead) verwende? Oder wenn nicht, dass ich das gleiche Format (attr global xxx yyy) zurueckgeliefert bekomme?

betateilchen

Zitat von: rudolfkoenig am 02 Mai 2014, 16:38:28
Oder wenn nicht, dass ich das gleiche Format (attr global xxx yyy) zurueckgeliefert bekomme?

Also ein Array mit Zeilen, die jeweils einen kompletten fhem-Befehl enthalten? Das ist kein Problem, das kann ich Dir bauen.

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

betateilchen

erledigt.

cfgDB_AttrRead('global')

liefert jetzt ein Array mit folgenden Elementen (ein Arrayelement = 1 Zeile)


attr global group System
attr global logfile ./log/fhem-%Y-%m-%d.log
attr global modpath .
attr global motd none
attr global nrarchive 1
attr global room 99 System
attr global title fhem@MBA
attr global userattr devStateIcon devStateStyle icon sortby webCmd
attr global verbose 3


Diese Funktion funktioniert auch mit jedem anderen Device, nicht nur für 'global'
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Geaendert, mit Dateien getestet & eingecheckt.