(FHEM) Notify

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Beschreibung

Eventhandler (Hinweis: Kommt noch in den Steckbrief.)

Mit dem Notify-Element lassen sich Kommandos in Abhängigkeit von Ereignissen auslösen. (Command|DeviceModule|HelperModule) (Hinweis: Kommt noch in den Steckbrief.)

Ereignisse > Liste aus Notify-Elementen > Elementfilter > Filterregeln ergeben Treffer  > Kommandos werden ausgeführt

Ereignisse sind alle Kommunikationspakete von und zum FHEM-Server. Die Ereignisse werden chronologisch in einer Liste abgelegt. Die aktuellen Ereignisse der Liste kann man sich mit Hilfe des Eventmonitor anschauen. Hier werden alle Kommunikationspakete von FHEM nach einem Muster aufbereitetet und angezeigt. Die alten, also alle vor dem aktuellen Zeitpunkt, aufgetretenen Ereignisse werden in einer Datei (FileLog) oder in einer Datenbank (DbLog) abgelegt.

Durch das FHEM-Kommando define vom Typ notify werden Filterregeln (Suchmuster oder Reguläre Ausdrücke) in die Liste der Eventhandler eingetragen. Alle Events werden der Reihe nach auf Übereinstimmungen mit den Filterregeln geprüft. Sobald eine Filterregel einen Treffer (Match) ergibt werden die Kommandos des entsprechenden Evennthandlers ausgeführt.

Syntax

Allgemeine Syntax des Define-Kommandos aus der FHEM-Referenz.

define [option] <name> <type> <type-specific> 

Für die Definition eines Notify-Elements ergibt sich der obligatorische Parameter <type> zu 'notify' und <type-specific> sind hier <pattern> und <command> also

define <name> notify <pattern> <command>

Wie auch in der Befehlsreferenz nachzulesen ist, hat das notify-Element bei der Defintion keine Optionen.

Ein Beispiel für ein Beschreibungsverwirrung sei nachfolgend dies angeführt:

define <NAME> notify <REGEXP> <command> 

Diese Syntaxdarstellung aus dieser Quelle unterscheidet sich von der aus der Referenz. Das hier <NAME> in Großbuchstaben geschrieben wurde mag man noch verkraften, dass aber <pattern> auf <REGEXP> reduziert wird förderte meine Verwirrung. Da auch noch gelegentlich von Suchmustern geschrieben wird, war mein erster Gedanke: Da haben Rudolf König et al. eine eigene Filtersyntax in FHEM rein programmiert. Dem scheint aber nicht so zu sein. Bei Gelegenheit vergewissere ich mich mal im Quellcode, oder einer der Beteiligten klärt mich auf.

Parameter

<name>

Mit <name> lässt sich das notify-Element eindeutig identifizieren. Als gültige Zeichen für die Wahl eines eindeutigen Namens gelten die Großbuchstaben (A-Z), die Kleinbuchstaben (a-z), der Unterstrich (_) und der Punkt (.). Also keine Umlaute und kein SZ. Beim Doppelpunkt scheint es Unstimmigkeit gegeben zu haben. Siehe hierzu. Das hat sich wohl seit Revision 13938 geklärt: Der Doppelpunkt ist in Namen nicht mehr erlaubt! Verwechselungsgefahr mit einem Doppelpunkt als Trennzeichen. Siehe hierzu Gerätename und fhem.pl: forbid

Der Name dient als Etikett des Notify-Elements und hat sonst keine weitere Bedeutung. Eine Systemtatik bei der Namenswahl, auch bei Devices, ist hilfreich.

<pattern>

Ein Suchmuster (Filterregel) das durch einen Regulären Ausdruck gebildet wird. Ein sehr gelungene und hilfreiche Auflistung zum entwerfen der Filterregeln befindet sich hier.

Die scheinbar am haeufigsten in der FHEM-Dokumentation zu findende Regel ist '.*'. Ein kurzer Blick in das CheatSheet offenbart, dass der Punkt genau irgendein Zeichen (ohne Zeilenumbruch) "matcht". Steht also im Pattern ein Punkt an einer Stelle, darf im Teststring (Event) an dieser Stelle ein beliebiges Zeichen stehen, dass der Filter ein "Match" liefert und damit die Filterregel einen Treffer hat und die notify-Kommandos ausgeführt werden. Das zweite Zeichen, der Stern, steht bei den Quantifiers (deu: Anzahl angebend) und bedeutet, dass die voranstehende Entsprechung, in unserem Beispiel der Punkt, keinmal, einmal oder mehrfach vorkommen darf. Der Stern entspricht der alternativen Schreibweise {0,}.

Weitere Beispiele findet man auf z.B. dieser Wikiseite

Eine extrem hilfreiche Seite zum Testen von Regulären Ausdrücken findet man hier.

notifyRegexpCheck

Ob der Regex "optimiert" ist sieht man daran, dass FileLog/Notify/etc ein Internal NOTIFYDEV hat, mit der Liste der betroffenen Quellen.

Pruefen kann man den Regex mit Code: { notifyRegexpCheck('...meinRegexp...') }

count TYPE=notify
count TYPE=notify:FILTER=NOTIFYDEV!~.+
list TYPE=notify:FILTER=NOTIFYDEV!~.+ DEF

<command>

Laut Aussage der Referenz muss die Ersetzung von <command> eine der 3 Befehlstypen entsprechen.

* FHEM-Befehle, mehrere FHEM-Befehle werden durch Semikolon (;) getrennt. (Achtung: siehe unten Escape-Zeichen)
* Shell-Befehle ""
* Perl-Ausdrücke {}

Das Beispiel aus der Referenz empfinde ich der Kategorie "Der Laie staunt, der Fachmann wundert sich" entsprungen.

Das 'set lamp off' einen FHEM-Befehl darstellt hat man schnell erfasst. Im Shell-Befehl '"fhem.pl 7072 "set lamp off""' steckt allerdings schon mehr drin. Auf die Idee fhem.pl himself als Programm zur Übergabe des String "set lamp off" an Port 7072 zu benutzen wäre ich ohne den Hinweis auf die Client-Form wohl nie gekommen. Da fallen mir andere Kandidaten wie telnet oder besser noch netcat eher ein. Man beachte auch die verschachtelten doppelten Anfuehrungszeichen. Das letzte Beispiel (Perl-Ausdruck) setzt voraus, dass man weisz oder vermutet, dass es im Perl-Programm ein Unterroutine (sub) namens fhem gibt, der man als Parameter eine FHEM-Befehl uebergeben kann. Das muss ich bei Gelegenheit ...

Bei der Wahl des Kommandotyps stellt die obige Liste vielleicht auch eine Rangfolge dar. Man sollte erst versuchen mit FHEM-Befehlen zu arbeiten. Erst wenn das nicht gelingt auf "externe Hilfe" durch Shell-Befehle zurückgreifen und als letztes Mittel Perlcode generieren.

Diesem Hinweis muss ich noch nachgehen: ...können Sie als <command> auch eine Liste von Geräten angeben (siehe devspec beim Befehl set) oder eine Struktur schalten (siehe structure).

Interessant ist auch der Hinweis im fhem - für Einsteiger Seite 27: Bei Aufzählungen keine Leerstellen vor und nach den Semikola!

Man schaue sich das zweite Beispiel der Befehlsreferenz an:

define lampoff at 07:00 set Lamp1 off;; set Lamp2 off

Und da ist sie wieder, die Verwirrung.

Mehrere FHEM-Kommandos hintereinander werden mittels Semikolon (;) getrennt. Weil Semikola auch in perl-Code oder Shell-Programmen benutzt werden, müssen sie mittels doppelten Semikola geschützt werden.

Set

active

Aktiviert das entsprechende Gerät (wieso Gerät? hier ist doch das Notify-Element gemeint!)

inactive

Deaktiviert das Notify-Element. Mit 'active' im Wechsel kann man das notify-Element damit nach Bedarf ein- und ausschalten. Ergänzung aus der Referenz: Beachte den leichten semantischen Unterschied zum disable Attribut: "set inactive" wird bei einem shutdown automatisch in fhem.state gespeichert, es ist kein save notwendig. Der Einsatzzweck sind Skripte, um das notify temporär zu deaktivieren. Das gleichzeitige Verwenden des disable Attributes wird nicht empfohlen.

addRegexpPart

addRegexpPart <device> <regexp> Fügt ein regexp Teil hinzu, der als device:regexp aufgebaut ist. Die Teile werden nach Regexp-Regeln mit | getrennt. Achtung: durch hinzufügen können manuell erzeugte Regexps ungültig werden.

removeRegexpPart

removeRegexpPart <re> Entfernt ein regexp Teil. Die Inkonsistenz von addRegexpPart / removeRegexPart-Argumenten hat seinen Ursprung in der Wiederverwendung von Javascript-Funktionen. Den Zusammenhang zu JS habe ich noch nicht.

Get

keine

Attributes

disable

disabledForIntervals

disabledAfterTrigger <sekunden> deaktiviert die Ausführung für <sekunden> nach dem das notify ausgelöst wurde.

addStateEvent

Das mit dem state Reading verknüpfte Event ist speziell, da das dazugehörige Prefix "state: " entfernt wird, d.h. $EVENT ist nicht "state: on", sondern nur "on". In manchen Fällen ist es aber erwünscht das unmodifizierte Event zu bekommen, d.h. wo "state: " nicht entfernt ist. Für diese Fälle sollte addStateEvent auf 1 gesetzt werden, die Voreinstellung ist 0 (deaktiviert).

Achtung:

* dieses Attribut muss beim Empfänger (notify, FileLog, etc) gesetzt werden.
* dieses Attribut zeigt nur für solche Geräte-Events eine Wirkung, die readingFnAttributes unterstützen.

forwardReturnValue

Rückgabe der Werte eines ausgeführten Kommandos an den Aufrufer. Die Voreinstellung ist 0 (ausgeschaltet), um weniger Meldungen im Log zu haben.

ignoreRegexp regexp

Es ist nicht immer einfach ein Regexp zu bauen, was etwas _nicht_ matcht. Dieses Attribu hilft in diesen Fällen: das Event wird ignoriert, falls den angegebenen Regexp matcht. Syntax ist gleich wie in der Definition.

readLog

Das notify wird für Meldungen, die im FHEM-Log erscheinen, ausgegeführt. Das "Event-Generierende-Gerät" wird auf dem notify selbst gesetzt. Z.B. kann man mit folgendem notify auf die Startup Meldung reagieren:

       define n notify n:.*Server.started.* { Log 1, "Wirklich" }
       attr n readLog

perlSyntaxCheck

Nach dem Setzen des globalen Attributes perlSyntaxCheck wird eine Syntax-Prüfung der Anweisung durchgeführt bei jeder Änderung (define oder modify), falls die Anweisung Perl ist, und FHEM bereits gestartet ist.

Readings

Die Referenz macht keine Angaben zu den Readings. Ein Reading wird in meinem Beispiel erzeugt.

state

z.B.

state active 2020-12-27 20:17:30

GUI Definition

Wenn man eine Zeile im Eventmonitor auswählt, also mit der Maus markiert und auf den Button 'Create/Modify Device' drückt ergibt sich bei mir ein solches Bild: FHEM Create Modify notify.png



Die 'Raw definition' ergab sich zu:

defmod FHT_454b_notify_1 notify FHT_454b:actuator:.100% {}

setstate FHT_454b_notify_1 2020-12-27 23:01:06
setstate FHT_454b_notify_1 2020-12-27 20:17:30 state active

Trial and Error

Wir naehern uns den Notifies mal auf leisen Sohlen.

Man nehme am besten einen simplen Schalter.

L Kueche Bar FHEM Device

In meinem Fall musste das Licht ueber dem Tresen (Bar) in der Kueche herhalten.

Beispiele

Tipps

Da ich bei mir das refresh-Attribut des Web Devices auf 30 Sekunden gestellt habe, leert sich damit auch der Inhalt des Eventmonitor alle 30 Sekunden. Ein Arbeiten mit Filtern und/oder dem Create/Modify Device wird damit erschwert. Hilfreich waere eine automatische Aenderung der Refreshzeit beim Aktivieren des Webmonitors und ein Zurücksetzen auf den vorherigen Wert nach dem Verlassen des Event-Monitors.

list modify setreading trigger Perl specials

Request for Comments


Kommentar hinzufügen
TippvomTibb freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, registriere dich bitte oder melde dich an.