Event-on-change-reading: Unterschied zwischen den Versionen
K (Entfernung der nachfolgenden Leerzeichen in Listenaufzählungen des Attributes gem. dieser Diskussion: https://forum.fhem.de/index.php?topic=60557.0) |
K (→Beispiel) |
||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 29: | Zeile 29: | ||
Insbesondere sinnvoll ist der reguläre Ausdruck .* , der alle Readings umfasst: | Insbesondere sinnvoll ist der reguläre Ausdruck .* , der alle Readings umfasst: | ||
:<code><nowiki>attr <device> | :<code><nowiki>attr <device> event-on-change-reading .*</nowiki></code> | ||
So formuliert führt das Attribut dazu, dass alle Readings noch Events erzeugen, aber nur wenn diese sich im Wert ändern. | So formuliert führt das Attribut dazu, dass alle Readings noch Events erzeugen, aber nur wenn diese sich im Wert ändern. | ||
Mit Threshold ist optional ein Wert | Mit Threshold ist optional ein Wert angebbar, um den das "neue" Reading größer oder kleiner sein soll als das vorherige, um ein Event auszulösen. So löst | ||
:<code>attr event-on-change-reading temperature:0.4,humidity:2 </code> | :<code>attr event-on-change-reading temperature:0.4,humidity:2 </code> | ||
nur bei Änderungen der Temperatur um mindestens 0,4 Grad oder Änderung der Luftfeuchtigkeit von 2 % ein Event aus (und damit einen Eintrag ins Logfile). Threshold ist besonders sinnvoll bei sehr fein auflösenden Sensoren, um z. | nur bei Änderungen der Temperatur um mindestens 0,4 Grad oder Änderung der Luftfeuchtigkeit von 2 % ein Event aus (und damit einen Eintrag ins Logfile). Threshold ist besonders sinnvoll bei sehr fein auflösenden Sensoren, um z.B. zu verhindern, dass jede Temperaturschwankung um 0,1 Grad ein Event auslöst. | ||
== Wechselwirkungen == | == Wechselwirkungen == | ||
Wie oben erwähnt steht das Attribut in Wechselwirkung mit den Attributen ''timestamp-on-change-reading'' [[event-on-update-reading]] und [[event-min-interval]], die das Verhalten modifizieren. Dies ist beim Einsatz zu berücksichtigen. | Wie oben erwähnt, steht das Attribut in Wechselwirkung mit den Attributen ''timestamp-on-change-reading'' [[event-on-update-reading]] und [[event-min-interval]], die das Verhalten modifizieren. Dies ist beim Einsatz zu berücksichtigen. | ||
Sind bei einem Device weder ''event-on-change-reading'' noch ''event-on-update-reading'' spezifiziert, werden für alle Readings sowohl bei Änderung als auch bei der Aktualisierung (Update mit dem gleichen Wert) Events erzeugt (Default Verhalten). Sobald jedoch eines der beiden Attribute gesetzt ist, müssen alle Readings, die protokolliert werden sollen bei (mindestens) einem der Attribute berücksichtigt sein. | Sind bei einem Device weder ''event-on-change-reading'' noch ''event-on-update-reading'' spezifiziert, werden für alle Readings sowohl bei Änderung als auch bei der Aktualisierung (Update mit dem gleichen Wert) Events erzeugt (Default Verhalten). Sobald jedoch eines der beiden Attribute gesetzt ist, müssen alle Readings, die protokolliert werden sollen, bei (mindestens) einem der Attribute berücksichtigt sein. | ||
Ist für ein Reading sowohl ''event-on-change-reading'' als auch ''event-on-update-reading'' spezifiziert, wird bei jeder Aktualisierung des Readings ein Event erzeugt, das ''event-on-change'' wird für dieses Reading also außer Kraft gesetzt bzw. "überstimmt". | Ist für ein Reading sowohl ''event-on-change-reading'' als auch ''event-on-update-reading'' spezifiziert, wird bei jeder Aktualisierung des Readings ein Event erzeugt, das ''event-on-change'' wird für dieses Reading also außer Kraft gesetzt bzw. "überstimmt". | ||
== timestamp-on-change-reading == | == timestamp-on-change-reading == | ||
Ist nur event-on-change-reading für ein Reading spezifiziert, entfällt zunächst einmal nur der Trigger, der Zeitstempel wird weiter aktualisiert. Benötigt man jedoch den Zeitstempel der letzten Änderung (z.B. die Ein- oder Ausschaltzeit eines Relais), kann man mithilfe von ''timestamp-on-change-reading'' auch die Aktualisierung des Zeitstempels unterbinden, falls der Wert sich nicht geändert hat. | Ist nur event-on-change-reading für ein Reading spezifiziert, entfällt zunächst einmal nur der Trigger, der Zeitstempel wird weiter aktualisiert. Benötigt man jedoch den Zeitstempel der letzten Änderung (z.B. die Ein- oder Ausschaltzeit eines Relais), kann man mithilfe von ''timestamp-on-change-reading'' auch die Aktualisierung des Zeitstempels unterbinden, falls der Wert sich nicht geändert hat. | ||
== Beispiel == | == Beispiel == | ||
Zeile 56: | Zeile 53: | ||
dafür gesorgt werden, dass jede Stunde auch ohne Werteänderung die Readings dennoch verarbeitet werden, also in z.b. in das Logfile geschrieben werden (findet FHEM zu wenige Ereignisse pro betrachteter Zeitspanne, bleiben Graphen leer oder werden nur teilweise gezeichnet (Plotabriss)). | dafür gesorgt werden, dass jede Stunde auch ohne Werteänderung die Readings dennoch verarbeitet werden, also in z.b. in das Logfile geschrieben werden (findet FHEM zu wenige Ereignisse pro betrachteter Zeitspanne, bleiben Graphen leer oder werden nur teilweise gezeichnet (Plotabriss)). | ||
Das obige Kombination der Attribute führt also dazu, dass ein Event | Das obige Kombination der Attribute führt also dazu, dass ein Event erzeugt wird, wenn der neue Wert wirklich abweichend vom alten Wert ist '''oder''' mindestens ''min-interval'' Sekunden seit dem letzten Event vergangen sind. | ||
Achtung: dies löst wie oben beschrieben ggf. Konstrukte wie <code><nowiki>… notify GeraetXXXX:wert …</nowiki></code> aus. | Achtung: dies löst wie oben beschrieben ggf. Konstrukte wie <code><nowiki>… notify GeraetXXXX:wert …</nowiki></code> aus. | ||
Um ein Threshold für nur | Falls ein Reading namens "unwanted" KEINE Events erzeugen soll, lässt sich das mit | ||
:<code>attr | :<code><nowiki>attr <device> event-on-change-reading (?!unwanted).*</nowiki></code> | ||
unterdrücken. | |||
Wenn KEIN Event bei einem Gerät erzeugt werden soll, lässt sich das mit | |||
:<code><nowiki>attr <device> event-on-change-reading $</nowiki></code> | |||
erreichen. | |||
Um ein Threshold für nur ein Reading zu setzen: | |||
:<code>attr <device> event-on-change-reading Temp.*:0.4,.*</code> | |||
Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen bei jeder Änderung ein Event. | Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen bei jeder Änderung ein Event. | ||
Nur ein Reading mit Threshold berücksichtigen: | Nur ein Reading mit Threshold berücksichtigen: | ||
:<code><nowiki>attr | :<code><nowiki>attr <device> event-on-change-reading Temp.*:0.4</nowiki></code> | ||
Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen keine Event, auch nicht bei Werteänderung. | Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen keine Event, auch nicht bei Werteänderung. | ||
Mit [[event-on-update-reading]] und [[event-min-interval]] kann das Verhalten verfeinert werden. | Mit [[event-on-update-reading]] und [[event-min-interval]] kann das Verhalten verfeinert werden. | ||
== Siehe auch == | == Siehe auch == | ||
Zeile 77: | Zeile 80: | ||
*[[event-min-interval]] | *[[event-min-interval]] | ||
*[[event-aggregator]] | *[[event-aggregator]] | ||
* Benutzungstipps (''Best Practice'') für das Attribut in {{Link2Forum|Topic=36522|LinkText=diesem Forenthread}} | * Benutzungstipps (''Best Practice'') für das Attribut in {{Link2Forum|Topic=36522|LinkText=diesem Forenthread}} | ||
[[Kategorie:Attribut (allgemeingültig)]] | [[Kategorie:Attribut (allgemeingültig)]] |
Aktuelle Version vom 5. Februar 2022, 19:33 Uhr
Mit dem Attribut event-on-change-reading kann für Readings eines Gerätes festgelegt werden, dass nur bei einer Wertänderung ein Event (und damit in der Regel auch ein Log-Eintrag) erzeugt werden soll und nicht bei jedem turnusmäßigen Update des Gerätes.
Wird event-on-change-reading für ein einzelnes Reading gesetzt, werden zunächst alle übrigen Readings nicht mehr protokolliert, erzeugen also keine Events mehr.
Einführung
Grundsätzlich senden Geräte ihre Readings dann, wenn ein Ereignis zu einer Statusänderung führt, also z.b. ein Schalter betätig wird. Allerdings senden die meisten Geräte auch immer Zusatzinformationen, etwa den Batteriestatus, Zieltemperatur, Pairingstatus, PeerList etc.etc.; meist sogar in bestimmten Intervallen (Update) auch ohne das das Reading sich ändert. Einige Geräte wie z.b. Shelly Plugs sind sehr "gesprächig" und senden auch den Status des Tasters mit jedem Update, selbst wenn der Schaltzustand sich nicht ändert.
Dies hat einige Nachteile:
- Aufblähen des Logfiles
- höhere Last der FHEM-Installation, da ein Event vom GeraetXXXX zunächst alle Notifys in FHEM benachrichtigt (d.h. notify, FileLog, sequence, watchdog, DOIF, etc), auch wenn diese mit dem Event nichts anfangen können.
- Konstrukte der Art
… notify GeraetXXXX:wert …
werden unter Umständen immer wieder im Update-Intervall ausgelöst, obwohl der Schaltzustand sich nicht geändert hat. (z.b. bei Shelly Plugs) - EvenMonitor bzw. Telnet Info Timer mitunter unübersichtlich
Mit event-on-change-reading lässen sich für Readings eines Gerätes festgelegt, dass nur bei einer Wertänderung ein Event erzeugt wird und nicht mit jedem Update. Dies adressiert alle oben genannten Nachteile.
Allerdings kann die Nutzung von event-on-change-reading auch selbst Probleme erzeugen:
- Es muss überlegt werden, ob die eigene FHEM Installation an manchen Stellen in bestimmten Intervallen Meldungen benötigt, auch wenn die Werte sich nicht ändern. Dies sind typischerweise Graphen.
- Wird event-on-change-reading für ein einzelnes Reading gesetzt, erzeugen alle übrigen Readings des Gerätes keine Events mehr, auch nicht wenn Werte sich ändern.
Um das Verhalten von event-on-change-reading zu modifizieren und diese Probleme zu lösen, stehen ausserdem die Attribute event-on-update-reading (Reading soll mit jedem Update gesendet werden, auch wenn es sich nicht geändert hat) und event-min-interval ((Reading soll mit Update gesendet werden, wenn seit der letzten Meldung ZeitspanneX vergangen ist) zur Verfügung.
Syntax
Das event-on-change-reading Attribut wird in der folgenden Weise spezifiziert:
attr <device> event-on-change-reading reading1[:threshold][,reading2[:threshold]...n]
Die zu berücksichtigenden Readings sind als durch Komma getrennte Werte anzugeben, können aber auch über reguläre Ausdrücke zusammengefasst werden.
Insbesondere sinnvoll ist der reguläre Ausdruck .* , der alle Readings umfasst:
attr <device> event-on-change-reading .*
So formuliert führt das Attribut dazu, dass alle Readings noch Events erzeugen, aber nur wenn diese sich im Wert ändern.
Mit Threshold ist optional ein Wert angebbar, um den das "neue" Reading größer oder kleiner sein soll als das vorherige, um ein Event auszulösen. So löst
attr event-on-change-reading temperature:0.4,humidity:2
nur bei Änderungen der Temperatur um mindestens 0,4 Grad oder Änderung der Luftfeuchtigkeit von 2 % ein Event aus (und damit einen Eintrag ins Logfile). Threshold ist besonders sinnvoll bei sehr fein auflösenden Sensoren, um z.B. zu verhindern, dass jede Temperaturschwankung um 0,1 Grad ein Event auslöst.
Wechselwirkungen
Wie oben erwähnt, steht das Attribut in Wechselwirkung mit den Attributen timestamp-on-change-reading event-on-update-reading und event-min-interval, die das Verhalten modifizieren. Dies ist beim Einsatz zu berücksichtigen.
Sind bei einem Device weder event-on-change-reading noch event-on-update-reading spezifiziert, werden für alle Readings sowohl bei Änderung als auch bei der Aktualisierung (Update mit dem gleichen Wert) Events erzeugt (Default Verhalten). Sobald jedoch eines der beiden Attribute gesetzt ist, müssen alle Readings, die protokolliert werden sollen, bei (mindestens) einem der Attribute berücksichtigt sein.
Ist für ein Reading sowohl event-on-change-reading als auch event-on-update-reading spezifiziert, wird bei jeder Aktualisierung des Readings ein Event erzeugt, das event-on-change wird für dieses Reading also außer Kraft gesetzt bzw. "überstimmt".
timestamp-on-change-reading
Ist nur event-on-change-reading für ein Reading spezifiziert, entfällt zunächst einmal nur der Trigger, der Zeitstempel wird weiter aktualisiert. Benötigt man jedoch den Zeitstempel der letzten Änderung (z.B. die Ein- oder Ausschaltzeit eines Relais), kann man mithilfe von timestamp-on-change-reading auch die Aktualisierung des Zeitstempels unterbinden, falls der Wert sich nicht geändert hat.
Beispiel
In einer einfachen Anwendung kann, um alle Readings eines Gerätes nur bei Änderungen zu verarbeiten, das Attribut folgendermaßen gesetzt werden:
attr <device> event-on-change-reading .*
Zusätzlich kann mit
attr <device> event-min-interval .*:3600
dafür gesorgt werden, dass jede Stunde auch ohne Werteänderung die Readings dennoch verarbeitet werden, also in z.b. in das Logfile geschrieben werden (findet FHEM zu wenige Ereignisse pro betrachteter Zeitspanne, bleiben Graphen leer oder werden nur teilweise gezeichnet (Plotabriss)).
Das obige Kombination der Attribute führt also dazu, dass ein Event erzeugt wird, wenn der neue Wert wirklich abweichend vom alten Wert ist oder mindestens min-interval Sekunden seit dem letzten Event vergangen sind.
Achtung: dies löst wie oben beschrieben ggf. Konstrukte wie … notify GeraetXXXX:wert …
aus.
Falls ein Reading namens "unwanted" KEINE Events erzeugen soll, lässt sich das mit
attr <device> event-on-change-reading (?!unwanted).*
unterdrücken.
Wenn KEIN Event bei einem Gerät erzeugt werden soll, lässt sich das mit
attr <device> event-on-change-reading $
erreichen.
Um ein Threshold für nur ein Reading zu setzen:
attr <device> event-on-change-reading Temp.*:0.4,.*
Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen bei jeder Änderung ein Event.
Nur ein Reading mit Threshold berücksichtigen:
attr <device> event-on-change-reading Temp.*:0.4
Alle Readings, die mit Temp beginnen, erzeugen nur ein Event, wenn die Änderung >0.4 Grad ist. Alle anderen Readings erzeugen keine Event, auch nicht bei Werteänderung.
Mit event-on-update-reading und event-min-interval kann das Verhalten verfeinert werden.
Siehe auch
- Forenbeitrag
- event-on-update-reading
- event-min-interval
- event-aggregator
- Benutzungstipps (Best Practice) für das Attribut in diesem Forenthread