Hilfe benötigt bei notify

Begonnen von Gisbert, 13 August 2017, 11:44:15

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich benötige Unterstützung bei einem notify-Befehl.

Ich möchte das Alter verschiedener Readings überwachen, um mitzubekommen, ob ein Sensor (oder Aktor) gegebenfalls ausgestiegen ist.
Dazu möchte ich die Funktion ReadingsAge() nutzen, die die Dauer in Sekunden seit der letzten Aktualisierung des Readings ausgibt.

Ich habe folgende Devices und Readings, die Readings habe ich mit userReadings selbst definiert:
Device / Reading:
Heizung / Zeitstempel
Haushaltsraum.Ventilator / Zeitstempel
Temp.OG / Zeitstempel
WH3080 / Zeitstempel_Lux.AV
WH3080 / Zeitstempel_Windgust

Leider waren meine Bemühungen bisher erfolglos, ein notify zu kreieren, welches jegliche Devices berücksichtigt, die ein Reading enthaltend "Zeitstempel" haben:
define SensorAktualitaet.notify notify (.*:Zeitstempel.*) {if (ReadingsAge("$NAME","$EVENT","") gt 300) {fhem "set Pushbullet.Nachricht message $NAME $EVENT | Sensor außer Betrieb"}}
Wenn ich es wie folgt probiere, geht es auch nicht:
define SensorAktualitaet.notify notify (Heizung:Zeitstempel|Haushaltsraum.Ventilator:Zeitstempel|Temp.OG:Zeitstempel|WH3080:Zeitstempel_Lux.AV|WH3080:Zeitstempel_Windgust) {if (ReadingsAge("$NAME","$EVENT","") gt 300) {fhem "set Pushbullet.Nachricht message $NAME $EVENT | Sensor außer Betrieb"}}

Wenn ich ein konkretes Beispiel in die Kommandozeile in Fhem eingebe, dann erhalte ich die gewünschte Nachricht in Pusbullet:
{if (ReadingsAge("Heizung","Zeitstempel","") gt 300) {fhem "set Pushbullet.Nachricht message Heizung blablabla | Sensor außer Betrieb"}}

Kann mir jemand in dieser Sache helfen?
Commandref, Wiki und diverse Suchen haben mich noch nicht weitergebracht.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

CoolTux

Zu nächst wäre zu klären was "geht nicht" bedeutet, denn "geht nicht" ist keine Fehlermeldung.
Wird das Notify überhaupt aus gelöst?
Als nächstes wäre meine Empfehlung bei Zahlen mit
>
<
==
<=
>=

Zu arbeiten
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

Versuchs mal Schritt fuer Schritt:
- Im EventMonitor pruefen, ob deine Readings als Event auftauchen
- Aus einer angezeigten Event mit Create/modify device ein notify erstellen
- notify erweitern, dass sie $EVENT und $NAME meldet, entweder per Log (dann landet die Ausgabe in der Logdatei) oder per trigger (und damit im Event-Monitor)
- In der Notify-Detailansicht den Regexp mit dem Change-Wizard erweitern, pruefen.
- Regexp im DEF generalisieren, damit es fuer neue Geraete anspringt.
- Logmeldungen gegen push-Nachricht tauschen.

Falls Du bei einer diesen Stellen Probleme hast, dann beschreibe sie.

Gisbert

#3
Hallo Rudi,

ich bin bis zum Ende der Liste gekommen, mein Fehler liegt aber woanders.

Die Definition sieht wie folgt aus:
defmod Haushaltsraum.Ventilator_notify_1 notify Haushaltsraum.Ventilator:Zeitstempel:.*|Heizung:Zeitstempel:.* {if (ReadingsAge("$NAME","$EVENT","") >= 0) {Log 3, "$NAME $EVENT"}}

Wenn ich "ge" statt ">= "benutze, wird nichts in den Logfile geschrieben.
Der Logfile mit ">=" sieht es wie folgt aus
2017.08.13 13:31:10 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 23077) line 1.
2017.08.13 13:31:10 3: eval: my $EVTPART1='2017-08-13';my $EVENT='Zeitstempel: 2017-08-13 13:31:10';my $NAME='Heizung';my $TYPE='MQTT_DEVICE';my $EVTPART2='13:31:10';my $EVTPART0='Zeitstempel:';my $SELF='Haushaltsraum.Ventilator_notify_1';{if (ReadingsAge("$NAME","$EVENT","") >= 0) {Log 3, "$NAME $EVENT"}}
2017.08.13 13:31:10 3: Heizung Zeitstempel: 2017-08-13 13:31:10

Wenn ich im Ausführungsteil die Pushbulletnachricht eintrage, dann erhalte ich die gewünschten Meldung.
Insofern funktioniert das notify.
Die Fehlermeldungen tauchen aber hartnäckig im Logfile auf und lassen sich auch nicht mit verbose = 0 im notify unterdrücken.

Es gibt aber noch 2 Probleme:

1) Bei der Wetterstation WH3080 habe ich mit userReading die Readings Zeitstempel_Windgust und Zeitstempel_Lux.Av definiert. Diese tauchen eigenartigerweise nicht in der Liste des Change wizards bei notify auf. Andere userReadings des gleichen Devices werden im Change wizard des notifys angezeigt.

2) Das größere Problem ist, dass bei Ausfall eines Sensors kein Event erzeugt wird, d.h. eine Abfrage des ReadingsAge > 300 nutzt mir gar nichts, denn es wird kein Event erzeugt.
So wie ich den notify aufgesetzt habe, wird er niemals das tun, was ich eigentlich vor habe.
Ich bin mir auch nicht sicher, ob es mit notify überhaupt gelingen kann, wenn der entsprechende Sensor tot ist. Man müsste auf irgendwas anderes triggern, oder periodisch abfragen.

Es wird vermutlich mit DOIF gehen; ich werde es damit mal versuchen.
Auch wenn ich hier noch keinen Erfolg hatte, habe ich zumindest verstanden, wie das auslösende Ereignis (Event) in notify funktioniert.

Vielen Dank
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

rudolfkoenig

ZitatReadingsAge("$NAME","$EVENT","")
Versuchs mal mit
ReadingsAge("$NAME","$EVENT",0)

ZitatDiese tauchen eigenartigerweise nicht in der Liste des Change wizards bei notify auf.
Vermutlich weil diese Events noch nicht generiert wurden. eventTypes schreibt alle Event-Typen auf, und der Wizard fragt eventTypes.

ZitatMan müsste auf irgendwas anderes triggern, oder periodisch abfragen.
Da ich DOIF nicht kenne, wuerde ich mit einem at probieren.
Watchdog geht auch, aber da muss man fuer alle Geraete einen separaten watchdog anlegen.