Hallo zusammen,
ich bin im Rahmen meine Modul-Entwicklung auf das Phänomen gestoßen, dass eine AttrFn in einem Modul nicht via AttrVal() auf den neuen Wert zugreifen kann.
Dies sollte meine Meinung aber möglich sein, da ich in einigen Fällen eine Unterfunktion nur mit $hash als Argument um auf Basis dieses neuen Attributes eine Datei neu einzulesen.
Allerdings ist zu diesem Zeitpunkt in das Attribut noch nicht in $attr niedergeschrieben. Dies währe allerdings meine Erwartung um quasi modulinterne Funktionen direkt mit dem neuen Attribut starten zu können.
Es währe daher toll, wenn die AttrFn erst nach der Zuweisung in $attr aufgerufen werden könnte.
Vielen Dank
Gruß
Markus
> Es währe daher toll, wenn die AttrFn erst nach der Zuweisung in $attr aufgerufen werden könnte.
AttrFn wird sowohl bei entfernen wie auch beim setzen der Attribute aufgerufen, was genau passiert sollte aus den Argumenten entnommen werden.
Zitat von: rudolfkoenig schrieb am Do, 14 März 2013 08:54> Es währe daher toll, wenn die AttrFn erst nach der Zuweisung in $attr aufgerufen werden könnte.
AttrFn wird sowohl bei entfernen wie auch beim setzen der Attribute aufgerufen, was genau passiert sollte aus den Argumenten entnommen werden.
Ich rufe aber in der AttrFn z.B. eine Funktion auf um z.B. eine Datei einzulesen:
FB_CALLMONITOR_loadPhonebookFile($hash);
Wenn diese Funktion im Rahmen der Ausführung via AttrVal auf dieses Attribut zugreifen möchte, dann ist dieses Attribut noch nicht in $attr geschrieben.
Ich habe mir aktuell dadurch beholfen:
sub
FB_CALLMONITOR_Attr($@)
{
my (@a) = @_;
my $hash = $defs{$a[1]};
my $name = $hash->{NAME};
if($a[0] eq "set")
{
if($a[2] eq "reverse-search" or $a[2] eq "reverse-search-phonebook-file")
{
$attr{$name}{"reverse-search-phonebook-file"} = $a[3] if($a[2] eq "reverse-search-phonebook-file");
FB_CALLMONITOR_loadInternalPhonebookFile($hash);
}
if($a[2] eq "reverse-search-cache-file")
{
$attr{$name}{"reverse-search-cache-file"} = $a[3];
FB_CALLMONITOR_loadCacheFile($hash);
}
Der Wert wird vor einem solchen Funktionsaufruf direkt in $attr geschrieben. Dann funktioniert auch der Aufruf von AttrVal() in diesen Unterfunktionen.
Ich bitte dich lediglich in
fhem.pl Zeile 1846 hinter Zeile 1856 zu verschieben.
Viele Grüße
Markus
Hi Markus,
soweit ich das verstanden habe, geht es darum, dass man entweder eine AttrFn definiert, die dann auch die Zuweisung selber durchführen muss, oder eben nicht, dann macht es FHEM selber.
Das bedeutet, dass du in der AttrFn selber in der Hand hast, ob und wie das Attribut zur Laufzeit übernommen werden soll. Es kann ja z.B. Attribute geben, die zum Definitionszeitpunkt etwas beeinflussen, aber selber gar nicht "zugewiesen" werden.
Wenn du selber zuweist, dann muss deine AttrFn etwas zurückliefern, was zu true evaluliert. Wenn du etwas zurückgibst, was zu false evaluiert, dann weist FHEM das Attribut selber zu (aber natürlich erst nach deinem Aufruf)...
Grüße Reinerlein
Gibt es inzwischen eine Möglichkeit, eine Funktion nach dem Setzen eines Attributs aufzurufen?
Hat sich erledigt. FHEM generiert ein globales Event, wenn ein Attribut gesetzt oder gelöscht wurde.