Notify/DOIF für identische Geräte-Paare vereinfachen

Begonnen von IPWF, 02 September 2023, 19:01:58

Vorheriges Thema - Nächstes Thema

IPWF

Hallo,

bei Änderung des Status eines Sensors (Fenster gschlossen/geöffnet/gekippt) soll ein set-Befehl an ein anderes Gerät (Aktor) gesendet werden. Das ist mit einem Notify oder DOIF leicht zu lösen.
Nun habe ich aber acht (identische) dieser Sensoren, die jeweils einem von acht (ebenfalls identischen) Aktoren zugeordnet sind. Somit bräuchte ich acht Notify, oder eines mit entsprechendem IF-ELSE-Statement, also z.B.:
define FensterNotify notify Sensor_. IF ("$NAME" eq "Sensor_1") (set Aktor_1 $EVENT)
 ELSE (IF ("$NAME" eq "Sensor_2") (set Aktor_2 $EVENT)
 ELSE (IF ("$NAME" eq "Sensor_3") (set Aktor_3 $EVENT)
...
 ELSE (IF ("$NAME" eq "Sensor_8") (set Aktor_8 $EVENT)
) ) ) ) ) ) )
Der besseren Lesbarkeit wegen habe ich in diesem Beispiel Maskierungen ("\" u.ä.) weggelassen.
Dasselbe ließe sich natürlich auch mit einem DOIF lösen.

Meine Frage nun: kann man das irgendwie vereinfachen ?
Mit Templates ginge das z.B., aber dadurch wird es weder wesentlich einfacher noch besser lesbar.
Eine andere Idee wäre, eine Perl-Funktion in 99_myUtils.pm zu schreiben, die aus §NAME die Nummer des Sensors extrahiert und zurückgibt, und diese dann im set-Befehl an "Aktor_" anzuhängen.
Aber gibt es in FHEM vielleicht noch eine andere (einfachere) Möglichkeit, diese Funktionalität mit einem einzigen Notify/DOIF zu erledigen ?

Vielleicht könnt Ihr mir da weiterhelfen ?
FHEM auf Hardkernel ODROID-N2+ mit Ubuntu 22.04 LTS
Funkschnittstelle EnOcean

betateilchen

defmod n_test notify Sensor_\d+:.* {$NAME =~ m/(\d+)/;; fhem("set Aktor_$1 $EVENT")}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

IPWF

Hallo betateilchen,

derartige Ausdrücke sind für jemanden wie mich, der nicht täglich damit zu tun hat, nicht so leicht zu verstehen und für den konkreten Anwendungsfall zu modifizieren. Deshalb sorry für meine späte Reaktion.
Noch schwieriger wird es, wenn man so einen Ausdruck selbst erstellen soll. Deshalb vielen Dank für Deine Hilfe !

Den Ausdruck habe ich getestet. Des Weiteren habe ich versucht, eine Lösung mit Perl-Funktionen zu finden, wozu ich auch noch eine Frage habe (s.u.)

Doch erstmal zu dem von Dir vorgeschlagenen Ausdruck:
defmod n_test notify Sensor_\d+:.* {$NAME =~ m/(\d+)/;; fhem("set Aktor_$1 $EVENT")}So funktioniert es bei mir noch nicht (in einem Notify; kann sein, dass es in DOIF anders ist, das habe ich aber nicht getestet). Die Auwertung des RegEx führt nicht zum gewünschten Ergebnis, weil der Unterstrich fehlt. Mit entsprechender Änderung funktioniert es:
defmod n_test notify Sensor_\d+:.* {$NAME =~ m/_(\d+)/;; fhem("set Aktor_$1 $EVENT")}Oder auch:
defmod n_test notify Sensor_\d+:.* {$NAME =~ m/(_\d+)/;; fhem("set Aktor$1 $EVENT")}
Wie schon erwähnt, habe ich mittlerweile auch eine Lösung mit Perl-Funktionen entwickelt. Zunächst in 99_myUtils.pm, aber dann wurde die so einfach, dass ich sie gleich in einen Perl-Ausdruck gesetzt habe:
defmod n_test notify Sensor_\d+:.* { fhem( "set Aktor".substr($NAME,index($NAME,'_'))." $EVENT" ) }Auch dieser Ausdruck funktioniert in meinem Notify einwandfrei.

Was mich noch interessieren würde: welche Version ist weniger systembelastend ?
Im Internet habe ich vielfach gelesen, dass RegEx-Ausdrücke grundsätzlich langsamer abgearbeitet würden als entsprechende solche mit Perl-Funktionen. Stimmt das ?
Für das hier besprochene Beispiel mag es wenig relevant sein, da es sich um Fenstergriff-Sensoren handelt, die nur bei Betätigung senden, und immer nur einer zur Zeit. Bei anderen Sensoren, z.B. periodisch sendenden, könnte es schon eine Rolle spielen.

Gruß Oliver
FHEM auf Hardkernel ODROID-N2+ mit Ubuntu 22.04 LTS
Funkschnittstelle EnOcean

betateilchen

Zitat von: IPWF am 10 September 2023, 17:13:14Doch erstmal zu dem von Dir vorgeschlagenen Ausdruck:
defmod n_test notify Sensor_\d+:.* {$NAME =~ m/(\d+)/;; fhem("set Aktor_$1 $EVENT")}So funktioniert es bei mir noch nicht (in einem Notify; kann sein, dass es in DOIF anders ist, das habe ich aber nicht getestet).

Kann ich nicht nachvollziehen.

defmod Sensor_1 dummy

defmod Aktor_1 dummy

defmod n_test notify Sensor_\d+:.* {$NAME =~ m/(\d+)/;; fhem("set Aktor_$1 $EVENT")}

Wenn ich dann "set Sensor_1 bla" ausführe, wird Aktor_1 vom notify auf "bla" gesetzt - genau wie gewünscht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

IPWF

Komisch. Bei mir kommt bei Deiner Version im Log die Meldung "Please define device AktorE first".
Bei genauerer Untersuchung habe ich dann festgestellt, dass der Match "m/(\d+)" fehlschlägt (-1; aber nur der im Perl-Ausdruck !). Offenbar wird dann das letzte Zeichen von "$NAME" genommen, also "E" (d.h. $NAME wird anscheinend nicht ausgewertet).
Wirklich nachvollziehen kann ich es auch nicht, aber bei mir isses halt so.
FHEM auf Hardkernel ODROID-N2+ mit Ubuntu 22.04 LTS
Funkschnittstelle EnOcean

rudolfkoenig

ZitatKomisch. Bei mir kommt bei Deiner Version im Log die Meldung "Please define device AktorE first".
Das kann nicht sein: in seiner Version ist Aktor_ (mit Unterstrich) "fest".
Also entweder nicht genau seine Version oder es wird nicht mit exakt diesen Namen (Sensor_1, Aktor_1) experimentiert.

IPWF

Wie gesagt, ich verstehe es auch nicht, aber so stand es halt im Log.
Tippfehler schließe ich aus, da ich den Ausdruck von Betateilchen mit Copy&Paste übernommen habe.
Aber egal, mit der kleinen Änderung funktioniert es ja, und für die Hilfe bin ich dankbar.

Was mich doch noch interessieren würde, ob dieses RegEx-Konstrukt oder das mit Perl-Funkionen die bessere Wahl hinsichtlich der Systembelastung ist. Könnt Ihr Profis dazu was sagen? Im Internet habe ich an verschiedenen Stellen gelesen, dass Perl-Funktionen immer peformanter seien als entsprechende RegEx, aber ich kann die Sachkunde der Autoren nicht beurteilen.
FHEM auf Hardkernel ODROID-N2+ mit Ubuntu 22.04 LTS
Funkschnittstelle EnOcean

Damian

Zitat von: IPWF am 12 September 2023, 19:24:53Was mich doch noch interessieren würde, ob dieses RegEx-Konstrukt oder das mit Perl-Funkionen die bessere Wahl hinsichtlich der Systembelastung ist. Könnt Ihr Profis dazu was sagen?

Die Systembelastung kann man etwas reduzieren, wenn man das NOTIFYDEV-Feature benutzt - das scheint hier nicht der Fall zu sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF