notify best practice viele notify mit dedizierten trigger oder allg. notify if

Begonnen von pechnase, 07 Februar 2023, 16:07:16

Vorheriges Thema - Nächstes Thema

pechnase

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
2 x RPI mit FHEM 6.3 (RPI B+ & RPI 2B) verbunden über FHEM2FHEM
- HM Fensterkontakte, Rauchmelder, Fernbedienung, Schalter
- Optolink (Selbstbau) Vitotronic 200KW2
- 1-wire DS1820 Temp.Sensoren, TX29DT-IT
- CUL (busware), nanoCUL433, Jeelink (Nachbau), nanoCUL868 WMbus

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

...das ist die ineffizienteste Variante, weil bei dieser Art Klammerung kein NOTIFYDEF abgeleitet werden kann und daher gegen alle Events geprüft werden muss ;) ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

pechnase

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.
2 x RPI mit FHEM 6.3 (RPI B+ & RPI 2B) verbunden über FHEM2FHEM
- HM Fensterkontakte, Rauchmelder, Fernbedienung, Schalter
- Optolink (Selbstbau) Vitotronic 200KW2
- 1-wire DS1820 Temp.Sensoren, TX29DT-IT
- CUL (busware), nanoCUL433, Jeelink (Nachbau), nanoCUL868 WMbus

betateilchen

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

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Benni

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#

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!