notify funktioniert nur bedingt so wie ich es gerne hätte ...

Begonnen von Spook112, 27 September 2020, 18:08:57

Vorheriges Thema - Nächstes Thema

Spook112

Hi,
folgendes Szenario - und mein Problem damit ...
Mein Gardena Mährobotter meldet regelmäßig -jede Minute - seinen aktuellen Status und schreibt ihn in das Reading state.
Status sind beispielsweise: ok_cutting, ok_searching, ok_charging, error etc.

Nun möchte ich bei Statuswechsel eine Sprachnachricht auf meinem Sonosplayer ausgegeben bekommen.
Das Ausgeben der Sprachmeldungen klappt auch inzwischen.

Also habe ich ein notify erstellt, dass aktuell immer getriggert wird, wenn ein entsprechendes Event auftritt.
Internals:
   CFGFN     
   DEF        SILENO___Tobi:.* {if ($EVENT eq "ok_cutting") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCutting]')}
elsif ($EVENT eq "error") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobok_chargingi:TobiError]')}
elsif ($EVENT eq "") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCharging]')}
elsif ($EVENT eq "ok_searching") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiSearching]')}
}
   FUUID      5f707068-f33f-5fc3-3e2f-f36794e43ef3a1e8
   NAME       NF_SILENO_Tobi_ErrorMessage
   NOTIFYDEV  SILENO___Tobi
   NR         33266
   NTFY_ORDER 50-SILENO___Tobi_notify_1
   REGEXP     SILENO___Tobi:.*
   STATE      inactive
   TRIGGERTIME 1601216734.47818
   TYPE       notify
   READINGS:
     2020-09-27 16:25:38   state           inactive
Attributes:
   disabledAfterTrigger 0


Das Problem - jetzt bekomme ich ca. jede Minute eine Sprachnachricht. Die richtigen zwar, je nach aktuellem Status, aber natürlich viel zu viele.
Eigentlich möchte ich nur einmal eine Nachricht bekommen, wenn der Status sich ändert.
Also wenn er anfängt zu mähen, dass er jetzt mäht, wenn er anfängt zu laden, dass er jetzt lädt etc.

Inzwischen habe ich das Attribut "disabledAfterTrigger" gefunden, das dafür sorgt, dass nach x Sekunden erst wieder getriggert wird.
Das sieht zwar auf den ersten Blick vielleicht wie ein gangbarer Weg aus, denn ich könnte die Anzahl der Sekunden ja entsprechend hoch setzen ...

Das Problem ist nur, dass ich dann auch einen vorherigen (bevor die Anzahl Sekunden abgelaufen sind) Statuswechsel nicht mehr mit bekomme und demzufolge keine Nachricht, weil das Attribut keine Rücksicht auf verschiedene Status nimmt sondern einfach nur die Zeit vorgibt, bevor das nächste Event als Trigger genutzt wird.

Hat jemand eine Idee wie ich das Gewünschte erreichen könnte, nämlich dass immer nur beim ersten Auftreten eines (neuen) Status ein Event getriggert wird oder wie ich erkennen könnte, dass ein selbiger Status vorher schon gesendet worden ist.

In dem Zusammenhang:
Irgendwie kriege ich es nicht hin zum Beispiel auf ein bestimmtes Reading zu triggern - zum Beispiel explizit auf "state" oder "mower-status".

Wenn ich das Folgende versuche funktioniert das Notify gar nicht.
DEF        SILENO___Tobi:state:.* {if ($EVENT eq "ok_cutting") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCutting]')}
elsif ($EVENT eq "error") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobok_chargingi:TobiError]')}
elsif ($EVENT eq "") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCharging]')}
elsif ($EVENT eq "ok_searching") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiSearching]')}
}

Nach meinem Verständnis - und insbesondere wenn ich das mit dem Wizard anlege - müsste das doch eigentlich funktionieren (ja, auch jede Minute aber nicht einmal das)
Eigentlich wollte ich statt "state" auch "mower-status" verwenden, da das schenbar nur bei Statuswechsel gesetzt/getriggert wird und das wäre ja genau das was ich will.

Klappt aber nicht.

Hat jemand einen Tipp und/oder Ideen, wie man das lösen kann?

Danke im Voraus
Michael

Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

mBielemeier

Hallo,
ist das nicht beim Mähroboter mit "event-on-change-reading" zu lösen? Dann wird ein Event fürs Notify nur bei Änderung weitergegen.

Viele Grüße, Manfred
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

Otto123

#2
Hallo Michael,

neben dem Tipp von Manfred, solltest Du Dir den Eventmonitor mal zu Rate nehmen. Und vielleicht mal den Artikel durcharbeiten:
https://wiki.fhem.de/wiki/Notify
Zum Triggern auf state schau bitte mal in die Doku https://fhem.de/commandref_DE.html#notify und dort speziell das Attribute addStateEvent.
Das Triggern auf mower-status kannst Du sicher ganz leicht mit dem Eventmonitor und dem dort unterstützen Anlegen eines notify lösen.
Wenn Du deine Readings für die Nachrichten etwas cleverer wählst könntest Du den ganzen if Zirkus weglassen und einfach so schreiben
set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:$EVENT]
oder je nach dem worauf Du triggerst und Deine Events aussehenset Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:$EVTPART1]

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Spook112

Hallo Otto,
danke für die Tipps, auch wenn sie mich noch nicht zum Ziel geführt haben :-(
Die beiden Seiten (Deine Links) hatte ich mir auch schon mehrfach durchgeleden, aber vermutlich immer noch nicht komplett verstanden :-(
Nach meinem bisherigen Verständnis reagiert SILENO___Tobi:.*  im DEF auf alles was "SILENO___Tobi" an Events schmeisst - und deshalb die IF Abfragen, damit eben nur bei dem jeweiligen Status auch das Gewünschte passiert.
Klappt ja grundsätzlich auch (kann mein Verständnis also nicht ganz falsch sein) - nur eben zu häufig.

Jetzt könnte ich natürlich für jedes einzelne "Statusevent" ein eigeenes Notify machen - und da dann mit dem Attribut "disabledAfterTrigger" jeweils dafür sorgen, dass er nicht alle 60 sec wieder reagiert.
Das erscheint mir aber irgendwie keine elegante Lösung.

Der Vorschlag von mBielemeier bzgl "event-on-change-reading" wird vermutlich das tun was ich mir wünsche- probiere ich noch aus.
Nur das dann eben nur noch das Reading aktualisiert wird.
Dann werde ich wohl etliche Readings da reinschreiben müssen.

Deinen Vorschlag mit den clevereren Readings habe ich ehrlich gesagt noch nicht verstanden.
Müssten dann die Readings (bzw. userattr) so heissen wie das "Statusevent" das der SILENO___Tobi ausgibt - also ok:cutting, error etc?

War das Dein Gedanke?
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

Otto123

Moin,

das Attribute event-on-change-reading setzt Du auf den Wert .* - damit wird für alle Readings nur ein Event erzeugt wenn sich etwas ändert. An dem rest brauchst Du nichts zu ändern!
ZitatMüssten dann die Readings (bzw. userattr) so heissen wie das "Statusevent" das der SILENO___Tobi ausgibt - also ok:cutting, error etc?

War das Dein Gedanke?
Genau das war mein Gedanke.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

Wenn Du nur auf bestimmte "Bereiche" Trickern willst, warum diese nicht gleich am Anfang ausblenden?
also anstatt:
SILENO___Tobi:.*
per RegEx: (Beispiel ungetestet!)
SILENO___Tobi:(Tricker1|Tricker2|TrickerX).*
Eventuell ist das .* auch löschbar .... mußt Du selber raustesten
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Spook112

Danke für die Tips:

Eine Kombination hat die Lösung gebracht:
Im Notify nur noch auf die "Statusevents" reagieren ...
SILENO___Tobi:(error|ok_cutting|ok_charging|ok_searching|.*parked.*)
{if ($EVENT eq "ok_cutting") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCutting]')}
elsif ($EVENT eq "error") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiError]')}
elsif ($EVENT eq "ok_charging") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiCharging]')}
elsif ($EVENT eq "ok_searching") {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiSearching]')}
elsif ($EVENT =~ /parked/) {fhem ('set Sonos_Wohnzimmer PlayURITemp [SILENO___Tobi:TobiParked]')}
}

+
Beim Mäher nur noch bei tatsächlicher Veränderung der Readingwerte ein Event triggern ...
event-on-change-reading .*

Damit bekomme ich nun nur noch Meldungen, wenn sich der Status auch tatsächlich ändert.

Das mit dem Vermeiden der IF/ELSIF Arie durch geschicktere Attributnamen werde ich später auch noch versuchen.
Ich berichte dann.

Bis hierher erst einmal Dank an alle, die mir mit Ihren Tipps wieder mal geholfen haben.
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

Wernieman

Und ich hoffe etwas über Notify und regEx gelernt ...  :D
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html