FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Markus Bloch am 13 März 2013, 23:13:18

Titel: AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: Markus Bloch am 13 März 2013, 23:13:18
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
Titel: Aw: AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: rudolfkoenig am 14 März 2013, 08:54:29
>  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.
Titel: Aw: AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: Markus Bloch am 14 März 2013, 16:50:50
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
Titel: Aw: AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: Reinerlein am 14 März 2013, 18:25:51
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
Titel: Antw:AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: zap am 11 Februar 2020, 18:11:04
Gibt es inzwischen eine Möglichkeit, eine Funktion nach dem Setzen eines Attributs aufzurufen?
Titel: Antw:AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden
Beitrag von: zap am 11 Februar 2020, 18:35:10
Hat sich erledigt. FHEM generiert ein globales Event, wenn ein Attribut gesetzt oder gelöscht wurde.