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
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...
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
...das ist die ineffizienteste Variante, weil bei dieser Art Klammerung kein NOTIFYDEF abgeleitet werden kann und daher gegen alle Events geprüft werden muss ;) ...
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
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.
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;
}
...
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
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#
NOTIFYDEV wird völlig überbewertet.