Autor Thema: [gelöst] Frage zu $init_done  (Gelesen 616 mal)

Offline hjr

  • Developer
  • New Member
  • ****
  • Beiträge: 32
[gelöst] Frage zu $init_done
« am: 04 Januar 2018, 13:27:52 »
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
« Letzte Änderung: 05 Januar 2018, 16:33:56 von hjr »

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 19370
Antw:Frage zu $init_done
« Antwort #1 am: 04 Januar 2018, 15:50:53 »
Und wo genau ist das Problem?

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15220
  • s/fhem\.cfg/configDB/g
Antw:Frage zu $init_done
« Antwort #2 am: 04 Januar 2018, 16:20:39 »
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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 14.12.2018 - 18:30 Uhr

Offline hjr

  • Developer
  • New Member
  • ****
  • Beiträge: 32
Antw:Frage zu $init_done
« Antwort #3 am: 04 Januar 2018, 18:04:31 »
$init_done aus dem Wiki:
Zitat
Dient 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

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17769
Antw:Frage zu $init_done
« Antwort #4 am: 04 Januar 2018, 18:09:59 »
$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.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH
Informativ Informativ x 1 Liste anzeigen

Offline hjr

  • Developer
  • New Member
  • ****
  • Beiträge: 32
Antw:Frage zu $init_done
« Antwort #5 am: 05 Januar 2018, 10:09:34 »
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