reload <module>

Begonnen von Dirk, 02 Oktober 2013, 15:42:15

Vorheriges Thema - Nächstes Thema

Dirk

Hallo zusammen,

Hat jemand reload <module> schon mal erfolgreich nutzen können?

Ein reload <module> erzeugt regelmässig im Logfile einträge in der FormSubroutine module_Initialize redefined at ...Geänderte Module-Files lassen sich so auch nicht aktivieren.

Was ja auch logisch ist, da ein erneutes laden des Modules dann doppelte globale Funktionsdeklarationen erzeugen würde.
Das gilt übrigens nicht nur für meine Module sondern beispielsweise auch für FS20 usw.

Hab ich die Verwendung von reload und die Beschreibung in der Commandref falsch verstanden?
ZitatReload the given module from the module directory. It is a convenient way to test modules whithout restarting the program.
Oder wo liegt mein Fehler?

Gruß
Dirk

justme1968

die meldung ist eine warnung/hinweis und in diesem fall nicht wirklich ein fehler. es werden beim reaload ja tatsächlich die vorhandenen routinen überschreiben.

so lange ausser den redefined keine weiteren meldungen kommen wird das modul neu geladen, aktiviert und auch verwendet.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Dirk

Zitates werden beim reaload ja die vorhandenen routinen überschreiben.
Das ist das erwartete Verhalten. Und genau das passiert nicht. Meine Änderungen sind erst nach einem kompletten Restart sichtbar.
Daher die Frage.

Weitere Fehler kommen übrigens nicht.

Gruß
Dirk

justme1968

was sind denn das konkret für änderungen die nicht sichtbar sind?

die neu geladenen routinen werden ja nicht alle direkt auch aufgerufen. _Initialize wird direkt aufgerufen aber wenn du z.b. an der DefFn etwas änderst hat das erst auswirkungen wenn du nach dem reload ein neues device dieses typs anlegst bzw. ein altes device mit modify änderst.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

Bei mir funktioniert das mit dem Modul-reload auch problemlos. NIcht vergessen: der Reload führt kein vollständiges rereadcfg durch, dadurch kann es schonmal zu Irritationen kommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

Zitatdie neu geladenen routinen werden ja nicht alle direkt auch aufgerufen.
Das ist Klar

Zitat_Initialize wird direkt aufgerufen aber wenn du z.b. an der DefFn etwas änderst hat das erst auswirkungen wenn du nach dem reload ein neues device dieses typs anlegst bzw. ein altes device mit modify änderst.
Und nun wird mir ahc einiges klar. Danke für den Hinweis
Ich habe auch mit externen Modulen gearbeit die u.a. in FHEM/lib/... liegen
Diese werden natürlich nicht neu geladen.

reload FHEM/lib/... funktioniert so auch nicht, da die / in CommandReload ersetzt werden. Und es wird dann immer versucht dort die Initialize Funktion aufzurufen. Somit kann reload ausschließlich für "echte" FHEM-Module funktionieren.

Ich reloade jetzt meine Module-Files während der Entwicklung ggf. innerhalb der Initialize-Sub im entsprechenden Modul, damit klappt das erst mal. Ggf. überlege ich mir mal einen Patch mit dem man auch files unter FHEM/lib reloaden kann.

Gruß
Dirk

justme1968

was den pfad angeh ist vermulich wirklich ein patch nötig.

ansonsten habe ich mir in meine files einfach eine _Initialize() funktion mit rein geschrieben. die kann ja auch leer sein. dann funktioniert das reload beim entwickeln auch mit hilfs files.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Dirk

Zitatansonsten habe ich mir in meine files einfach eine _Initialize() funktion mit rein geschrieben. die kann ja auch leer sein. dann funktioniert das reload beim entwickeln auch mit hilfs files.
Ja, mit der kleinen Einschränkung dass man seine Helper-Module keinen Namespace verpassen darf. Denn Initialize möchte CommandReload im main Kontext ausführen. Was in meinem Fall natürlich nicht klappt. Dafür hätte ich auch gerne einen Lösung.

Mein aktueller Vorschlag währ reload einen weiteren optionalen Parameter zu spendieren mit dem man eine alternative Initialize-Sub angeben kann.

Gruß
Dirk