Notify nur bei Änderung von "state"

Begonnen von Benwish, 30 Juni 2015, 07:46:21

Vorheriges Thema - Nächstes Thema

Benwish

Hallo zusammen,

ich habe mir für mein erstes Projekt ein kleines Notify für meine Fensterkontakte gemäß der fhemwiki gebaut. Dieses setzt den Dummy "AlleFensterZu" entweder auf wahr oder falsch (später will ich eine kleine Status-LED ansteuern) und schickt eine Push-Nachricht wenn ich den Dummy "AlarmAnlage" auf on habe und ein Fensterkontakt von closed auf open geht:

define FensterbewegungErkannt notify (HebeSchiebeTuer|Seitentuer|Kuechenfenster|Haustuer) {\
my $r1 = $value{"HebeSchiebeTuer"};;;;\
my $r2 = $value{"Seitentuer"};;;;\
my $r3 = $value{"Kuechenfenster"};;;;\
my $r4 = $value{"Haustuer"};;;;\
my $r5 = $value{"AlarmAnlage"};;;;\
if ($r1 eq "closed" && $r2 eq "closed" && $r3 eq "closed" && $r4 eq "closed") {\
fhem "set AlleFensterZu wahr";; \
if ($r5 eq "on") { fhem "set pushmsg message 'Alle Fenster wieder geschlossen' 'room:Erdgeschoss'";; }\
} else {\
fhem "set AlleFensterZu falsch";;\
if ($r5 eq "on") { fhem "set pushmsg message 'ALARM! Alarmanlage ist aktiv und die/das $NAME wurde geöffnet!' 'room:Erdgeschoss'";; }\
}\
}


Das Ganze funktioniert super.
Nun wollte ich gestern noch den Batteriestatus der Türkontakte verarbeiten, damit ich eine Push-Nachricht bekomme, wenn die Batterie zur Neige geht:

define BatterieWarnung notify .*:battery:.* set pushmsg message 'Batteriemeldung von $NAME: $EVENT'

Auch das klappt sehr gut. Einziges Problem was ich nun habe:
Wenn ich die Batteriewarnung teste ("trigger Haustuer battery:warning") reagiert auch das "FensterbewegungErkannt" notify.
Ich tippe als blutiger Anfänger jetzt darauf, dass das Suchmuster in diesem Notify  auf alle Events der Devices reagiert. Ich hatte dann mal versucht das ganze anzupassen indem ich nur den "state" Wert angegeben habe:
(HebeSchiebeTuer:state:.*|Seitentuer:state:.*|Kuechenfenster:state:.*|Haustuer:state:.*)

Wenn ich dies über einen trigger teste (trigger Haustuer state:open) dann reagiert das Notify. Leider aber nicht, wenn ich ein Fenster in Echt öffne...
Kann mir vielleicht jemand einen Tipp geben, wie ich an dieser Stelle weiter komme?

Über jegliche Hilfestellung wäre ich dankbar :-)

P.S. Falls es hilft noch die Informationen zu dem Device als Bild

Hollo

Um ehrlich zu sein, bezweifle ich gerade, dass Dein notify überhaupt wie gewünscht funktioniert (hab aber nicht in den Wiki-Artikel geguckt).
Sinngemäß reagiert Dein notify auf irgendwas Deiner Türen und Fenster, dann guckst Du ob alle zu sind und dann machst Du was.

Das kannst Du doch viel einfacher haben... fasse die Türen und Fenster in einer structure zusammen und mach Dein notify auf die structure.
Dann kannst Du sogar noch zu/gekippt/offen unterscheiden und es lässt sich jederzeit per WebIf erweitern.

Beispiel für 2 Fenster bei mir (die anderen haben noch keine Kontakte)

Internals:
   ATTR       Fenster
   CFGFN      /opt/fhem/FHEM/geraete.cfg
   DEF        Fenster wz_Fenster ba_Fenster
   NAME       FensterDG
   NR         406
   NTFY_ORDER 50-FensterDG
   STATE      closed
   TYPE       structure
   Content:
     ba_Fenster closed
     wz_Fenster closed
   Readings:
     2015-06-30 06:52:59   LastDevice      wz_Fenster
     2015-06-30 06:52:59   LastDevice_Abs  wz_Fenster
     2015-06-30 06:52:59   state           closed
Attributes:
   clientstate_behavior relative
   clientstate_priority open tilted closed
   devStateIcon open:fts_window_1w_open tilted:fts_window_1w_tilt closed:fts_window_1w
   group      HomeStatus
   icon       fts_window_1w
   room       Wohnung

FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Benwish

Zitat von: Hollo am 30 Juni 2015, 08:36:49
Um ehrlich zu sein, bezweifle ich gerade, dass Dein notify überhaupt wie gewünscht funktioniert (hab aber nicht in den Wiki-Artikel geguckt).
Sinngemäß reagiert Dein notify auf irgendwas Deiner Türen und Fenster, dann guckst Du ob alle zu sind und dann machst Du was.

Genau das "irgendwas" ist mein Problem. Das notify reagiert auf State-Änderungen (open / closed) genauso wie z.B. auf Veränderungen des Battery Readings (ok / warning).
Structure kannte ich noch gar nicht, das schaue ich mir auf jeden Fall gerne mal an :)
Aber dennoch wüsste ich gerne, wie ich ein Notify nur auf ein bestimmtes Reading oder ein bestimmtes Internal lauschen lassen kann. :)
Oder lauscht ein Notify grundsätzlich IMMER auf jedes Event des angegebenen Devices?

Hier btw. das Codebeispiel aus der Wiki (http://www.fhemwiki.de/wiki/Notify)
define nt.allerolloszu notify (R1ZU|R2ZU|R6ZU) {
my $r1 = Value("R1ZU");;
my $r2 = Value("R2ZU");;
my $r3 = Value("R6ZU");;
if ($r1 eq "on" && $r2 eq "on" && $r3 eq "on") {
  fhem "set LEDalleRolloZu on"
} else {
  fhem "set LEDalleRolloZu off"
}
}

nojo0812

Das oder die gewünschten Events kannst du hinter den Devices angeben, z.B.

define FensterbewegungErkannt notify (HebeSchiebeTuer|Seitentuer|Kuechenfenster|Haustuer):open

oder

define FensterbewegungErkannt notify (HebeSchiebeTuer|Seitentuer|Kuechenfenster|Haustuer):(open|closed)





Gesendet von meinem Nexus 5 mit Tapatalk


Benwish

Hallo nojo0812,

so funktioniert es. Vielen Dank! :-)

Gibt es irgendwo eine ausführliche Erklärung, wie diese RegEx funktionieren? Ich hätte jetzt gedacht, ich müsste als Filter immer Device:Reading:Wert angeben. Dein Ausdruck (der ja funktioniert) macht ja nur Device:Wert. Irgendwie blicke ich da noch nicht durch. :)

Hollo

Vielleicht hilft Dir die Erläuterung zu notify in der commandref weiter.   ;)
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

stromer-12

Zitat von: Benwish am 01 Juli 2015, 07:48:32
Gibt es irgendwo eine ausführliche Erklärung, wie diese RegEx funktionieren? Ich hätte jetzt gedacht, ich müsste als Filter immer Device:Reading:Wert angeben. Dein Ausdruck (der ja funktioniert) macht ja nur Device:Wert. Irgendwie blicke ich da noch nicht durch. :)

Das Reading state ist ein Sonderfall, da fehlt der Readingname im Event.
Es gibt aber das Attribut addStateEvent um für das Notify den Readingnamen sichtbar zu machen.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

heiko.ne

Wenn man bei einem Notify nur auf ein bestimmtes Reading aus einem Element reagieren möchte, dann klappt es zum Beispiel so:

define Names_des_Notify notify (Name_überwachtes_Element:Reading_des_überwachten_Elements.*) {Event}

Wichtig ist das ".*" damit es funktioniert.

Gruß
Heiko

danillo

Hallo Heiko,

ich wollte das jetzt für meine Nuki-Bridge anwenden:
aber DEF
ZitatNBridge1:state.* {fhem("set Telegram message Nuki-Bridge is ".ReadingsVal("NBridge1","state",""))}
führt zu gar nichts.
wenn ich nur DEF
ZitatNBridge1 {fhem("set Telegram message Nuki-Bridge is ".ReadingsVal("NBridge1","state",""))}
verwende, bekomme ich dauernd den Status gesendet. Aber das ist ja alle paar Sekunden. Ich hätte ihn aber gerne nur bei Änderungen.
Woran kann das liegen?

CoolTux

Bei der Bridge ein Attribut event-on-change-reading setzen. Kannst .* nehmen.

Dann musst du nicht mehr ins Perl wechseln


set Telegram message Nuki-Bridge is [NBridge1:state]


Sollte so klappen.
Du kannst aber auch einfach das Event anfassen


set Telegram message Nuki-Bridge is $EVENT

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

danillo

Danke CoolTux, jetzt klappt's!
Ich hab jedoch event-on-change-reading explizit auf state gesetzt, da es auch ein Reading mit Zeitstempel gibt. Sonst liefert das immer ein Event.

Falls es jemand nachbauen will. Ich habe ein altes Handy als Nuki-Bridge verwendet, aber ich denke, es funktioniert genauso mit einer Hardware-Bridge.

Also die Nukibridge heißt NBridge1, Mein TelegramBot heißt hier Telegram

Bei NBridge1 habe ich das Attribut event-on-change-reading auf state gesetzt.

Das Notifymit dem Namen notify_nuki sieht so ausdefine notify_nuki notify NBridge1 set Telegram message Nuki-Bridge is $EVENT

Jetzt sendet mir der TelegramBot immer eine Nachricht, wenn etwas mit der Bridge ist. Entweder bekomme ich die Nachricht "Nuki-Bridge is connected" oder "Nuki-Bridge is not connected".

CoolTux

Zitat von: danillo am 04 August 2017, 20:57:30
Danke CoolTux, jetzt klappt's!
Ich hab jedoch event-on-change-reading explizit auf state gesetzt, da es auch ein Reading mit Zeitstempel gibt. Sonst liefert das immer ein Event.

Falls es jemand nachbauen will. Ich habe ein altes Handy als Nuki-Bridge verwendet, aber ich denke, es funktioniert genauso mit einer Hardware-Bridge.

Also die Nukibridge heißt NBridge1, Mein TelegramBot heißt hier Telegram

Bei NBridge1 habe ich das Attribut event-on-change-reading auf state gesetzt.

Das Notifymit dem Namen notify_nuki sieht so ausdefine notify_nuki notify NBridge1 set Telegram message Nuki-Bridge is $EVENT

Jetzt sendet mir der TelegramBot immer eine Nachricht, wenn etwas mit der Bridge ist. Entweder bekomme ich die Nachricht "Nuki-Bridge is connected" oder "Nuki-Bridge is not connected".



define notify_nuki notify NBridge1.(not.connected|connected) set Telegram message Nuki-Bridge is $EVENT


Versuche mal so. Aber das event-on-change-reading musste auf .* setzen

not connected
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