98_dummy.pm - Funktion nach define aufrufen

Begonnen von betateilchen, 19 Februar 2023, 14:35:00

Vorheriges Thema - Nächstes Thema

betateilchen

Momentan bin ich auf der Suche nach einer Möglichkeit, nach dem define eines dummy devices eine Funktion aufzurufen.
Ziel ist es, über eine Funktion in der 99_myUtils.pm den dummy mit readings zu befüllen.

Ein notify auf global:DEFINED.dummyTest funktioniert grundsätzlich im laufenden Betrieb, aber nicht beim FHEM Start.
Ein notify auf global:INITIALIZED wäre eine Lösung, die würde mir aber nicht so besonders gut gefallen, weil sie nicht in direktem Bezug zum dummy-Device steht.

Testweise habe ich mir das dummy-Modul um eine AttrFn() erweitert, in der ein Attribut onDefineFn ausgewertet wird.


sub
dummy_Attr(){
  my @a = @_;

  $a[2] = "" if(!defined($a[2]));
  $a[3] = "" if(!defined($a[3]));

  if($a[2] eq "onDefineFn") {
    if($a[0] eq "set"){
      InternalTimer(0,$a[3],$a[1],1);
    }
    return;
  }
}


Das funktioniert für meine Zwecke grundsätzlich wie gewünscht, ist aber in dieser einfachen Ausprägung sehr intolerant gegenüber Fehleingaben (ein nichtexistierender Funktionsname hat beispielsweise "schlimme" Auswirkungen) und würde erstmal einen weiteren Ausbau in Richtung Fehlerbehandlung erfordern, um es betriebssicher zu machen.

Bin für jede konstruktive Idee dankbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatBin für jede konstruktive Idee dankbar.
Im dummy comment oder userattr setzen, und in der vom global:INITIALIZED aufgerufenen Funktion auf Geraete filtern, die dieses Attribut haben. Ueber das Attribut koennte man Parameter an die Funktion uebergeben.

betateilchen

Hallo Rudi,
danke für die Idee, aber ich möchte ja nicht zwingend für jedes dummy-device die gleiche Funktion aufrufen.

Dann müsste ich entweder sämtliche möglichen Fallunterscheidungen in der Funktion machen - inklusive des Filterns - oder ich muss für mehrere Funktionen mit mehreren notify arbeiten und da auch wieder überall filtern. Deshalb war ja meine Idee, die gewünschte Funktion direkt im entsprechenden dummy device angeben zu können - auch wegen der Nachvollziehbarkeit innerhalb des device, wo die Werte herkommen.

Wie oben beschrieben - mein Test mit dem zusätzlichen Attribut macht genau das: im attr wird eine Funktion angegeben, die nach $init_done aufgerufen wird.
Alternativ hatte ich auch getestet, den Funktionsaufruf als optionalen Parameter direkt im define mit anzugeben, was auch funktionieren würde. Das Attribut gefällt mir aber besser, weil es weniger invasiv ist und die simple Syntax einer dummy-Definition nicht verändert.

Vermutlich ist das eine Funktionalität, die außer mir bisher niemand vermisst hat.
Vielleicht baue ich mir für meine Zwecke einfach ein "privates" dummy-Modul 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

archetype könnte uU. ähnliches, ist aber dann vermutlich auch nicht einfacher zu konfigurieren wie dein notify.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: betateilchen am 19 Februar 2023, 22:48:10
Vielleicht baue ich mir für meine Zwecke einfach ein "privates" dummy-Modul

Done, die Attributlösung inklusive der Prüfung, ob die angegebene Funktion auch tatsächlich existiert, bevor sie im Attribut akzeptiert wird.

Wer sich dafür interessiert, findet die Variante 98_btdummy.pm in ./contrib/betateilchen
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!