Autor Thema: AttrFn sollte nach dem setzen eines Attributes in $attr ausgeführt werden  (Gelesen 2247 mal)

Offline Markus Bloch

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 3628
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)

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 21897
>  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.

Offline Markus Bloch

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 3628
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)

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2030
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

Offline zap

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3235
    • HMCCU
Gibt es inzwischen eine Möglichkeit, eine Funktion nach dem Setzen eines Attributs aufzurufen?
2xCCU3, diverse Komponenten (Fenster, Rolladen, Themostate, Stromzähler, Steckdosen ...)
FHEM mit Raspi für CCU Integration.
IOBroker für UI (VIS), Hue, Sonos usw.
Maintainer der Module FULLY, Meteohub und HMCCU (Schnittstelle CCU-FHEM = best of both worlds approach

Offline zap

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3235
    • HMCCU
Hat sich erledigt. FHEM generiert ein globales Event, wenn ein Attribut gesetzt oder gelöscht wurde.
2xCCU3, diverse Komponenten (Fenster, Rolladen, Themostate, Stromzähler, Steckdosen ...)
FHEM mit Raspi für CCU Integration.
IOBroker für UI (VIS), Hue, Sonos usw.
Maintainer der Module FULLY, Meteohub und HMCCU (Schnittstelle CCU-FHEM = best of both worlds approach

 

decade-submarginal