Modulentwicklung: In AttrFn prüfen auf global initialized?

Begonnen von fhainz, 16 August 2014, 08:52:46

Vorheriges Thema - Nächstes Thema

fhainz

Hallo!

Ich bin dabei mir ein Modul zu schreiben in dem ich Device Names in den Attributen angeben kann. Bei der Eingabe prüfe ich ob das Device vorhanden ist oder ob die angegebene regex stimmt. Das mache ich bisher in der Attr_Fn und das funktioniert auch problemlos.
Wenn ich aber ein neues Device anlege und im Modul den Namen eintrage, wird das attribut nach einem neustart gelöscht da das device ja noch nicht definiert ist weil es in der der cfg nach dem modul define steht.

Kann ich das irgendwie verhindern? Bzw. kann ich in der Attr Fn irgendwie prüfen ob schon alle devices geladen sind? Oder gibt es eine andere/bessere möglichkeit?

Bin für jede Hilfe dankbar, hab im Forum und Wiki nicht viel dazu gefunden.

Grüße

Elektrolurch

Hallo,

mir würde da nur einfallen, dass Du nicht in der AttrFN prüfst, sondern Dir für das device ein notifyFN definierst, welches auf global:INITIALIZED|REREADCFG triggert.


Gruß

Elektrolurch
configDB und Windows befreite Zone!

fhainz

An das hab ich auch schon gedacht, aber wie prüfe ich dann beim eingeben/verändern eines attributes den inhalt?

rudolfkoenig

Die globale Variable $init_done ist nach dem Einlesen der fhem.cfg und fhem.state wahr. Danach wird ein global:INITIALIZED Event getriggert.

-> In AttrFn die Pruefung ueberspringen, wenn $init_done nicht wahr ist, und alle Pruefungen in einem NotifyFn fuer global:INITIALIZED nachholen.

Im Define sollte man $hash->{NOTIFYDEV} = "global"; setzen, dann wird NotifyFn nur fuer global Events aufgerufen.

justme1968

#4
über $init_done kannst du rausfinden ob fhem gerade startet und alles initialisiert wird oder ob schon alles läuft.

wenn du zur laufzeit auf neu angelegte devices reagieren willst brauchst du aber auch noch eine NotifyFn. dort kannst du auch noch auf DEFINED, RENAMED, DELETED und REREADCFG

schau dir mal z.b. readingsGroup oder LightScene an.

da und auch in mailCheck findest du ein beispiel wie beim setzen von attributen wertegeprüft oder auch falsche wieder überschrieben werden.

warum steckst du die device namen in ein attribut und nicht ins define?

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

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

fhainz

Danke, das werde ich versuchen!

Zitat von: justme1968 am 16 August 2014, 09:20:16
warum steckst du die device namen in ein attribut und nicht ins define?
Das Modul war/ist mein erstes Modul mit dem ich perl learning-by-doing betreiben wollte, deswegen gibt es eigentlich keinen wirklichen grund warum ich das in die Attribute gepackt hab. Ich wollte irgendwann mal auch auf renames reagieren (wie zB im readingsHistory Modul) und nur die attribut werte entsprechend umbenennen. Aber da blick ich noch nicht durch wie du das gemacht hast, das ist noch eine Stufe zu hoch für mich :D Die Device Attribute sollen auch alle bis auf 3-5 optional sein.

Was ist der Vorteil wenn ich das im Define erledige?

Grüße

justme1968

vielleicht weniger vorteil als geschmacksache. im define hast du dann alles auf ein mal zusammen. attribute werden nacheinander gesetzt und die reihenfolge ist nicht unbedingt vorhersagbar. wenn also ein attribut von einem anderen abhängt muss man das verücksichtigen.

ansonsten gehört ins define alles was 'zentral' wichtig ist fürs funktionieren. in dir attribute alles was die funktion beeinflusst und auch nachträglich öfter geändert wird.

ein vorteil von attributen ist das immer klar ist welche argumente zu welchem attribut gehören. define kann das parsen unhandlich werden wenn es viele unterschiedliche parameter sind die auch leerzeichen enthalten können.

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

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

fhainz

Ok alles klar. Ich werde mir das alles nochmal durch den Kopf gehen lassen, vielleicht ist wirklich sinnvoller etwas ins define auszulagern.

Danke!

Grüße

Elektrolurch

Hallo,

aber auch wenn das define ausgeführt wird, ist ja nicht sicher, ob die anderen devices dann schon da sind.
Oder habe ich das Problem nicht verstanden?
define und attr werden beim Starten von fhem zu irgend einem beliebigen Zeitpunkt ausgeführt, in beiden Fällen kann man nicht zuverlässig wissen, ob da die anderen devices, die für das Modul / die Instanz wichtig sein sollen, schon vorhanden sind.

Gruß

Elektrolurch
configDB und Windows befreite Zone!