AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden

Begonnen von Markus Bloch, 13 März 2013, 23:13:18

Vorheriges Thema - Nächstes Thema

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

>  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.

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Reinerlein

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

zap

Gibt es inzwischen eine Möglichkeit, eine Funktion nach dem Setzen eines Attributs aufzurufen?
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

zap

Hat sich erledigt. FHEM generiert ein globales Event, wenn ein Attribut gesetzt oder gelöscht wurde.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB