FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: klaus.schauer am 17 Dezember 2014, 09:55:11

Titel: AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 17 Dezember 2014, 09:55:11
Im Modul EnOcean wird auch AttrFn zur Prüfung der Attributwerte genutzt. Bisher habe ich die Prüfung auch in der Startphase von Fhem eingesetzt. Nun ist es erforderlich, dass die Attribute in Abhängigkeit des Profils (Attibut subDef) geprüft werden müssen. Das geht aber in den Fällen schief, bei denen zum Zeitpunkt der Prüfung das Attribut "subDef" noch nicht gültig ist. Im Augenblick habe ich deshalb die Prüfung während der Startphase deaktiviert (Abfrage der globalen Variablen $init_done).

Ich suche deshalb nach einer Lösung, um dennoch die Attributwerte beim Fhem Start wieder prüfen zu können.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 17 Dezember 2014, 11:53:22
eine NotifyFn, die auf global:INITIALIZED triggert?
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 17 Dezember 2014, 12:59:43
Was soll es bringen, wenn geprüft wird, dass die Intitialisierungphase abgeschlossen ist? Mit dem Hinweis sehe ich keinen Lösungsweg. Schließlich sind ja die Attribute während der Initialisierungsphase zu prüfen.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: herrmannj am 17 Dezember 2014, 13:06:37
fhem lädt die device aus der cfg und setzt die Attribute. Der frühest mögliche Zeitpunkt zur Prüfung ist doch, so wie betateilchen richtig vorschlägt,  global:initialized. (weil vorher kannst Du nicht davon ausgehen das alle attribute geladen sind.)

Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 17 Dezember 2014, 13:26:44
Die Reihenfolge ist doch folgende:


<module>_Initialize()
<module>_Define()
<device>_AttrFn()


Wobei sich die Schritte 2 und 3 beliebig oft wiederholen können (von wenigen Ausnahmen abgesehen).

Erst im letzten Schritt (AttrFn) würde das Attribut subDef gesetzt, von dessen Wert Du irgendwas abhängig machen willst.
Du kannst also in _Initialize() - die ohnehin nur ein einziges Mal ausgeführt wird - überhaupt noch nicht wissen, worauf Du überhaupt reagieren sollst, weil Du weder das device noch das zum Device gehörige Attribut kennst.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 17 Dezember 2014, 14:17:26
Danke für die Erläuterung... das Problem hatte ich ja auch so beschrieben. Nur nach Abschluss der Inititalisierungsphase muss dann dafür gesorgt werden, dass alle oder vorgegebene Attribute abklappert und geprüft werden. Diese Anforderung tritt vermutlich nicht nur im EnOcean-Modul auf. Deshalb wäre eine übergreifende Lösung für AttrFn m. E. sinnvoll.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: herrmannj am 17 Dezember 2014, 14:22:28
Lösung->
Zitat von: betateilchen am 17 Dezember 2014, 11:53:22
eine NotifyFn, die auf global:INITIALIZED triggert?
... in Deinem modul.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 17 Dezember 2014, 14:24:53
(http://www.der206cc.de/forum/images/smilies/schilder/hae.gif)

Zitat von: klaus.schauerNur nach Abschluss der Inititalisierungsphase
Was ist nach Deinem Verständnis eigentlich die "Initialisierungsphase"? Für mich ist das der Zeitpunkt, zu dem das Modul geladen und die <module>_Initialize() einmalig aufgerufen wird.

Zu diesem Zeitpunkt exitieren noch keine Attribute, die man irgendwie prüfen könnte.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 17 Dezember 2014, 15:22:12
Nun ja wir scheinen unterschiedliche Vorstellungen vom Funktionsumfang von AttrFn zu haben. Ich erwartete, dass AttFn auch diese "Sonderfälle" berücksichtigt. M. E. ist es kein guter Weg, immer und immer wieder über solche oder ähnliche Sonderfälle zu stolpern und sie dann in den Modulen selbst zu umschiffen. Nicht jeder, der sich hier "Entwickler" nennt, hat die Zeit, die Lust und das umfassende Wissen über Fhem-Internas, um spezifische und wahrscheinlich redundante Lösungen zu bauen. Die Zeit und den Frust bei der Fehlersuche hätte ich mir gerne geschenkt!
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 17 Dezember 2014, 15:42:25
Zitat von: klaus.schauer am 17 Dezember 2014, 15:22:12
Nun ja wir scheinen unterschiedliche Vorstellungen vom Funktionsumfang von AttrFn zu haben.

Stimmt. Und Du scheinst die Aufgabe von AttrFn() noch nicht verstanden zu haben, obwohl sie in der fhem DevelopmentModuleIntro ziemlich eindeutig beschrieben ist.

ZitatDie Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie ja auch keine Werte dort speichern muss, sondern den Befehl set oder del je nachdem ob ein Attribut gesetzt oder gelöscht wird, den Namen der Geräteinstanz sowie den Namen des Attributs und seinen Wert.

Damit ist das, was Du erwartest nicht einmal ansatzweise angedacht geschweige denn umgesetzt.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: rudolfkoenig am 17 Dezember 2014, 15:50:04
Um das Problem von Klaus zu loesen gibt es mehrere Wege:
a) AttrFn mit einem separaten Argument, der von fhem.pl nach der Initialisierung fuer jeden der definierten Geraete aufgerufen wird
b) eine neue Funktion pro Modul (StartupFinishedFn), der von fhem.pl nach der Initialisierung aufgerufen wird
c) das existierende Interface NotifyFn verwenden.

a) und b) muesste implementiert werden, und man muss auch wissen, dass diese Mechanismen existieren.

c) ist schon implementiert, und ich finde es wichtig, wenn jedem Entwickler bewusst ist, was alles ueber NotifyFn empfangbar ist. Wenn man sich auf global Events beschraenken kann, dann sollte man die Funktion notifyRegexpChanged($hash, "global:.*"); aufrufen. Das sorgt dafuer, dass man nur fuer global Events aufgerufen wird, d.h. Systembelastung ist minimal. Den Event-Namen (INITIALIZED) muss man aber weiterhin noch im NotifyFn pruefen.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 17 Dezember 2014, 15:54:49
Zitat von: rudolfkoenig am 17 Dezember 2014, 15:50:04
c) das existierende Interface NotifyFn verwenden.

...

c) ist schon implementiert,

mal schauen, ob er DIR das glaubt :)
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: justme1968 am 17 Dezember 2014, 15:55:01
@rudi: hat es einen grund das du explizit notifyRegexpChanged erwähnst und nicht $hash->{NOTIFYDEV} = "global" ?
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: rudolfkoenig am 17 Dezember 2014, 15:57:42
Nicht unbedingt.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 18 Dezember 2014, 06:28:50
Es gäbe noch eine vierte Variante:

AttrFn speichert die Aufträge und gibt sie erst an die Module weiter, sobald die globale Variable $init_done gesetzt ist.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: rudolfkoenig am 18 Dezember 2014, 08:30:01
Hat auch viele Wenns und Abers:
- Wird AttrFn dann mit allen Attributen auf einmal aufgerufen? Wuerde neues Interface bedeuten
- Wird sie einzeln aufgerufen: Kein Unterschied zum aktuellen Stand.
- AttrFn setzt im $attr alle Parameter, und ruft dann AttrFn auf: geht schief, wenn Parameter A sich darauf verlassen muss, dass Parameter B (z:Bsp. SlowRF) "richtig" gesetzt wurde, und die Reihenfolge falsch ist.

Und es muss implementiert werden, und allen bewusst sein.
Lieber ist allen bewusst, dass es ein NotifyFn gibt.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 18 Dezember 2014, 10:45:38
Zitat von: rudolfkoenig am 18 Dezember 2014, 08:30:01
Lieber ist allen bewusst, dass es ein NotifyFn gibt.

*unterschreib*
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 18 Dezember 2014, 12:46:11
Ich verstehe es nicht; will es auch nicht. Es gibt da eine Funktion, die tut nur teilweise, was sie verspricht. Jetzt fällt das auf und was wird vorgeschlagen... weitermachen wie bisher ... der Nutzer der Funktion möge sich doch selber kümmern. So stelle ich mir die Weiterentwicklung und Verbesserung von Fhem nicht vor.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: rudolfkoenig am 18 Dezember 2014, 12:59:28
Ich sehe es anders. Es gibt eine Funktion (AttrFn), die tut das was sie soll. Fuer Sonderfaelle gibt es auch eine Funktion (NotifyFn). Mir sind keine Gruende bekannt, warum das so nicht funktioniert.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: herrmannj am 18 Dezember 2014, 13:10:08
Ich stimme Rudi zu 100% zu !

Dein Problem liegt genau hier:
Zitat von: klaus.schauer am 17 Dezember 2014, 15:22:12
... Nicht jeder, der sich hier "Entwickler" nennt, hat die Zeit, die Lust und das umfassende Wissen über Fhem-Internas, ....
Bitte was denn sonst ???!
Du hast jetzt mehrfach Hilfe für Dein Problem bekommen, nimm sie an !
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: klaus.schauer am 18 Dezember 2014, 13:46:06
Ich denke wir sollten die Diskussion an dieser Stelle beenden. Sie dreht sich nicht mehr um die Sache selbst. Auch dafür will ich keine Zeit opfern.
Titel: Antw:AttrFn: Prüfung von Attributen während der Fhem-Startphase
Beitrag von: betateilchen am 18 Dezember 2014, 20:05:50
Zitat von: klaus.schauer am 18 Dezember 2014, 12:46:11
Es gibt da eine Funktion, die tut nur teilweise, was sie verspricht.

Sie tut EXAKT das, wofür sie gedacht ist. Dass sie nicht das tut, was Du gerne möchtest, ist ein völlig anderes Problem.