FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: pechnase am 07 Februar 2023, 16:07:16

Titel: notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: pechnase am 07 Februar 2023, 16:07:16
zunächst herzlichen Dank an die große FHEM Community und die vielen beantworteten Frragen!

Ich baue gerade für die STYRBAR Fernbedienung von IKEA z.B. einen Dimmer, mit dem ich eine Tradfri LED ein - ausschalte bzw. dimme. Jetzt werde ich noch die Farbtemperatur einbauen. Lampe und Fernbedienung sind nicht direkt gekoppelt sondern 'laufen' über FHEM.

Ich verwende zigbee2mqtt mit einem Sonoff Zigbee 3.0 USB Dongle plus. Lampe und Fernbedienung sind in FHEM als MQTT2_DEVICE vorhanden.

Grundsätzlich könnte ich  jetzt für jede Taskenaktion der Fernbedienung ein eigenes notify definieren, das also nur bei einem bestimmten Tastendruck triggert, oder ich könnte ein allgemeineres notify definieren, das bei allen Tastenaktionen der Fernbedienung triggert und dann im notify über if-Abfrage die gedrückte Taste selektieren.

Gibt es da eine Empfehlung bezüglich Performance? Übersichtlicher würde ich ein notify pro Tastenaktion finden, was aber im max. zu 12 notifies führt:
(Aktion click - hold - release) x 4 Tasten.

Danke für eure Meinung/Empfehlung
Wolfgang
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: Beta-User am 07 Februar 2023, 16:15:09
Na ja, wegen 12 notify wird FHEM nicht gleich in die Knie gehen, aber ein "Einheitsnotify" ist effizienter, da im ersten Schritt nur der Device-Name des triggernden Devices eine Rolle spielt.

Du kannst aber auch direkt Perl aufrufen aus dem MQTT2_DEVICE heraus (aus der readingList). So mache ich das mit den Milight-Fernbedienungen auch...
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: DeeSPe am 07 Februar 2023, 16:15:44
Ich habe für jedes Devices nur ein einziges notify (device:(reading1|reading2):.*) und unterscheide dann per if/elsif/else mittels '$EVTPART0' und '$EVTPART1'.

Gruß
Dan
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: Beta-User am 07 Februar 2023, 16:18:41
...das ist die ineffizienteste Variante, weil bei dieser Art Klammerung kein NOTIFYDEF abgeleitet werden kann und daher gegen alle Events geprüft werden muss ;) ...
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: DeeSPe am 07 Februar 2023, 16:41:47
Zitat von: Beta-User am 07 Februar 2023, 16:18:41
...das ist die ineffizienteste Variante, weil bei dieser Art Klammerung kein NOTIFYDEF abgeleitet werden kann und daher gegen alle Events geprüft werden muss ;) ...

Okay, das war mir so auch noch nicht klar.
Danke für den Hinweis.

Werde mal schauen ob und wie ich das umbauen möchte, obwohl es bei mir bisher keine Probleme gemacht hat.

Gruß
Dan
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: pechnase am 07 Februar 2023, 17:50:40
danke für die vielen Antworten. Das hilft.
Vieleicht kann Beta-User noch ein Beispiel bezüglich der Lösung mit readingList und Perl aus dem MQTT2_DEVICE posten, da stehe ich gerade etwas auf dem Schlauch  :( Danke.
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: betateilchen am 07 Februar 2023, 18:17:26
Ich habe für 10 Homematic Fernbedienungen mit insgesamt knapp 100 Tasten nur ein einziges notify...

defmod n_remote_HomeMatic notify .*_Btn_...(Short|Long).* {myRemote($NAME,$EVTPART0)}

Voraussetzung ist lediglich eine konsequent einheitliche Benennung der Tasten.

Die Auswertung erfolgt in einer Funktion in der 99_myUtils.pm.


sub myRemote($$) {
   return if(time() - $fhem_started < 60);
   my ($dev,$evt,$button) = @_;
   ($dev,$button) = split (/_Btn_/,$dev);
   $button //= -1;
#Debug "d:$dev b:$button e:$evt";

   given ($dev) {

      when ('GW1') {
        if ($button == 1) {
   CommandSet(undef,'GW1__Warnung on');
   COmmandSet(undef,'GW1__Entwarnung off');
           #GW1_Btn_01 set GW1__Warnung on; set GW1__Entwarnung off
        }

        if ($button == 2) {
           CommandSet(undef,'GW1__Blitz on');
   CommandSet(undef,'GW1__Warnung on');
   CommandSet(undef,'GW1__Entwarnung off');
           #GW1_Btn_02 set GW1__Blitz on; set GW1__Warnung on; set GW1__Entwarnung off
}

        if ($button == 3) {
           CommandSet(undef,'GW1__Entwarnung on');
   CommandSet(undef,'GW1__Blitz off');
   CommandSet(undef,'GW1__Warnung off');
           #GW1_Btn_03 set GW1__Entwarnung on; set GW1__Blitz off; set GW1__Warnung off;
}

        if ($button == 4) {
#           balkonKnopf                          if ($evt eq "Short");
#           CommandSet(undef,'Licht_Balkon off') if ($evt eq "Long");
}
        break;
  }


      when ('HM_4987D5') {
    # 20 Kanal Wohnzimmer
#        CommandSet(undef,'wz_Licht_Regal on')  if ($button == 1 && $evt eq "Short");
#        CommandSet(undef,'wz_Licht_Regal off') if ($button == 1 && $evt eq "Long");
        CommandSet(undef,'wz_Licht_Regal toggle')  if ($button == 1 && $evt eq "Short");

        CommandSet(undef,'wz_Licht_Bild on')  if ($button == 3 && $evt eq "Short");
        CommandSet(undef,'wz_Licht_Bild off') if ($button == 3 && $evt eq "Long");

        CommandSet(undef,'wz_Licht_Tisch on')  if ($button == 8 && $evt eq "Short");
        CommandSet(undef,'wz_Licht_Tisch off') if ($button == 8 && $evt eq "Long");

        CommandSet(undef,'wz_Licht_Schnaps on')  if ($button == 9 && $evt eq "Short");
        CommandSet(undef,'wz_Licht_Schnaps off') if ($button == 9 && $evt eq "Long");

        CommandSet(undef,'wz_Licht_Bank on')  if ($button == 10 && $evt eq "Short");
        CommandSet(undef,'wz_Licht_Bank off') if ($button == 10 && $evt eq "Long");

        CommandSet(undef,'ez_Licht_Regal on')  if ($button == 11 && $evt eq "Short");
        CommandSet(undef,'ez_Licht_Regal off') if ($button == 11 && $evt eq "Long");

        CommandSet(undef,'wz_office_Kyocera on-for-timer 3600')  if ($button == 12 && $evt eq "Short");
        CommandSet(undef,'wz_office_Kyocera off')                if ($button == 12 && $evt eq "Long");

        CommandSet(undef,'wz_office_Labels on-for-timer 3600')   if ($button == 13 && $evt eq "Short");
        CommandSet(undef,'wz_office_Labels off')                 if ($button == 13 && $evt eq "Long");
       
        CommandSet(undef,'wz_Licht_Schreibtisch toggle')         if ($button == 14 && $evt eq "Short");
        CommandSet(undef,'wz_Licht_Schreibtisch off')            if ($button == 14 && $evt eq "Long");
       
        CommandSet(undef,'wz_office_Ender3 on')                  if ($button == 15 && $evt eq "Short");
        CommandSet(undef,'wz_office_Ender3 off')                 if ($button == 15 && $evt eq "Long");
       
CommandSet(undef,'te_LED on')                            if ($button == 18 && $evt eq "Short");
        CommandSet(undef,'te_LED off')                           if ($button == 18 && $evt eq "Long");

        CommandSet(undef,'BOSE_64CFD96E66BB  channel 3')         if ($button == 20 && $evt eq "Short");
        CommandSet(undef,'BOSE_64CFD96E66BB  off')               if ($button == 20 && $evt eq "Long");
        break;
      }

#      when ('HM_47B269'){ }

      when ('ku_PIR1') {
# d:wz_PIR1 b:Motion e:noMotion
        CommandSet(undef,'ku_TV on')  if ($button eq '01' && $evt eq "Short");
        CommandSet(undef,'ku_TV off') if ($button eq '01' && $evt eq "Long");
break;
  }
...
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: Beta-User am 07 Februar 2023, 18:55:39
Hier noch der link zu der angefragten Lösung für direktes Ausführen via readingList-Perl:
https://forum.fhem.de/index.php/topic,103493.msg1098434.html#msg1098434
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: Benni am 07 Februar 2023, 21:31:17
Zitat von: Beta-User am 07 Februar 2023, 16:18:41
...das ist die ineffizienteste Variante, weil bei dieser Art Klammerung kein NOTIFYDEF abgeleitet werden kann und daher gegen alle Events geprüft werden muss ;) ...

Genau darauf hin habe ich kürzlich mal alle meine notify optimiert. Über 90% haben nun ein NOTIFYDEV.
Das ist in der DEF oftmals nicht sehr elegant, dafür gehe ich aber auch davon aus, dass die so aufs nötigste reduzierte Eventauswertung letztendlich auch für die Performance gut ist.

gb#
Titel: Antw:notify best practice viele notify mit dedizierten trigger oder allg. notify if
Beitrag von: betateilchen am 08 Februar 2023, 18:06:10
NOTIFYDEV wird völlig überbewertet.