[gelöst] Frage zu $init_done

Begonnen von hjr, 04 Januar 2018, 13:27:52

Vorheriges Thema - Nächstes Thema

hjr

Hi,

Beim dem Fix zu dieses Thema https://forum.fhem.de/index.php/topic,16435.msg742106.html#msg742106 im HCS Modul konnte ich das aus dem Wiki Beitrag  https://wiki.fhem.de/wiki/DevelopmentModuleIntro gelernte nicht ganz wie erwartet umsetzen.

Mit dem Signalisieren von global:INITIALIZED ist $init_done auf 1 gesetzt. Aber bei global:REREADCFG ist $init_done noch nicht gesetzt.

Die Abfrage auf eines der erwartungsmäßig definierten Readings funktioniert als Workaround.

Was habe ich hier nicht richtig gemacht, oder nicht verstanden?

LG

rudolfkoenig

Und wo genau ist das Problem?

betateilchen

Zitat von: hjr am 04 Januar 2018, 13:27:52
Was habe ich hier nicht richtig gemacht, oder nicht verstanden?

Du hast nicht verstanden, dass ein rereadcfg ein laufendes FHEM in einen Zustand versetzt, der weitgehend einem kompletten Start von FHEM entspricht. Eine geladene (laufende) Konfiguration wird verworfen und durch eine neue Konfiguration, die aus den gespeicherten Konfigurationsdaten besteht, wird erzeugt. Das heißt, alle devices werden neu definiert, alle Attribute werden neu gesetzt, das Staefile wird neu gelesen.

Insofern ist das Verhalten, dass $init_done in dieser Zeit nicht gesetzt ist, exakt das einzig richtige Verhalten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hjr

$init_done aus dem Wiki:
ZitatDient der Erkennung für fhem.pl sowie den Modulen, ob FHEM den Initialisierungsvorgang abgeschlossen hat. Beim Starten von FHEM ist $init_done gleich 0. Erst, wenn das Einlesen der Konfiguration, sowie des State-Files (Readings) abgeschlossen ist, wird $init_done auf 1 gesetzt.
Das gleiche Verfahren wird auch bei dem Befehl rereadcfg angewandt. Während rereadcfg ausgeführt wird (Konfiguration löschen, neu einlesen), ist $init_done gleich 0.
Dies ist insbesondere in der Define-Funktion eines Moduls relevant.

Verstehe ich so, dass beim Start von fhem, als auch beim rereadcfg erstmal $init_done:=0 ist, aber wenn das Notify global:INITIALIZE, respective global:REREADCFG verschickt wird würde ich $init_done:=1 erwarten. Soweit meine Erwartungshaltung, wenn ich "Das gleiche Verfahren ..." lese.
Damit hätte ich die Möglichkeit ein Modul in gleicherweise für beide Fälle, wenn auch über die zwei Signale erkennbar, zu stricken. Aktuell wird aber global:REREADCFG verschickt, wenn $init_done noch auf "0" oder undefiniert ist. Welchen Zustand $init_done danach noch einnimmt habe ich nicht geprüft.

Für das HCS Module war relevant zu erkennen, wann das Statefile wieder geladen wurde und alten Readings-Werte wieder da sind. Die scheinen beim global:REREADCFG schon wieder definiert zu sein, allerdings nicht an $init_done == 1 erkennbar.

Problem gibt es eigentlich keines. Ich habe lediglich die API Beschreibung im Wiki anders verstanden als ich implementiert sehe. D.h. es könnte eine schwache API Beschreibung sein, ein Bug, oder mein schwaches Verständnis. Für die ersten zwei Fälle sähe Optionen zur Verbesserung ;-)

LG

justme1968

$init_done ist dazu da in der DefFn zu entscheiden ob es ein von hand eingegebene define zur laufzeit ist oder ob es ein automatisch aufgerufenes define beim einlesen der config ist.

wenn du das INITIALIZE oder REREADCFG event bekommst brauchst du $init_done nicht mehr zu prüfen.

das init_done sich bei den beiden events unterschiedlich verhält ist inkonsistent und könnte mal gleich gezogen werden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

hjr

Bingo, das ergibt Sinn. Vielleicht wäre es wertvoll diese Design Idee auch ins Wiki zu setzen.

Auf jeden Fall kann ich nun das HCS korrigieren, denn es macht wirklich keinen Sinn das $init_done im NotifyFn abzufragen.

Danke