Gelöst - Notify RegEx löst nur zum Teil aus

Begonnen von ftsinuglarity, 01 August 2018, 15:42:08

Vorheriges Thema - Nächstes Thema

ftsinuglarity

Hallo zusammen,

ich habe ein Notify für einen Bewegungsmelder, das ich nicht korrekt zum Auslösen bringen kann.
Der Bewegungsmelder an sich ist per MQTT eingebunden, und übermittelt auf:subprocess.Popen(['/usr/bin/mosquitto_pub', '-u', 'user', '-P', '12345','-h', '192.168.x.x','-t','Wohnung/KUE/Bewegungsmelder/stat','-m','on'])  bzw. 'off'seine Werte "on|off" an FHEM,

...wo es mitsubscribeReading_state Wohnung/KUE/Bewegungsmelder/stat
getriggert wird.  Soweit läuft es perfekt.

Jetzt soll damit natürlich auch etwas passieren. Ich schalte damit zb die Ofenecke nach 20 Sekunden Aktivität an. Dazu brauche ich eine Glättung der getriggerten Meldungen des Bewegungsmelders.
Das habe ich so gemacht, das es ein 2. Reading "state_sum" im Device Bewegungsmelder gibt.
Das wird sofort mit "move" gefüllt, wenn eine Bewegung registriert wird.
Um den Wert "stop" zu erhalten, darf sich das state mit dem Wert "off" 5 Sekunden lang nicht verändert haben .. also keine Bewegunge registriert für 5 Sekunden

Ich rufe über das EVENT "on|off" eine Funktion auf, die das bewerkstelligen soll.sub bewegung   ...
    if($event eq "on") {
           fhem("setreading Bewegungsmelder state_sum move");   ...
   
   elsif($event eq "off") {
            fhem("defmod wd_Bewegungsmelder_Ofenecke watchdog Bewegungsmelder:off.* 00:00:05 Bewegungsmelder:on.*  {fhem(\"setreading Bewegungsmelder state_sum  stop\")}");
            ...


Letztendlich möchte ich nun auf "state_sum" reagieren, nicht auf die zu oft getriggerten Events vom MQTT Device.
Dazu muß das Reading state_sum beim setzen selbst auch triggern, worauf ich dann reagieren würde. Das passiert über setreading ...

Und hier habe ich das Problem. stop kommt an, move nicht.
Ich mache hier anscheinend mit der RegEx irgendwas falsch, denn ein Notify nur auf .*state_sum.* reagierend macht es korrekt. Sowie ich die gleiche Syntax zusammen mit (on|off|,*state_sum.*) eintrage, wird nur noch stop durchgelassen.

Im Detail:
funktionierendes Notify:
defmod n_Bewegungsmelder notify Bewegungsmelder.*state_sum.*) {  print ($NAME,$SELF,$EVENT) }
Ausgabe:
bm_Kueche n_Bewegungsmelder state_sum: move
Bewegungsmelder n_Bewegungsmelder state_sum: stop

Wenn ich jetzt on|off mit hinzugebe, kommt nur noch "on|off|stop" durch, move nicht:
defmod n_Bewegungsmelder notify Bewegungsmelder :(on|off|.*state_sum.*) { print ($NAME,$SELF,$EVENT) }
Ausgabe:
Bewegungsmelder n_Bewegungsmelder state_sum: stop


Hier das komplette list vom Bewegungsmelder:


Internals:
   CFGFN     
   IODev      MQTT_Broker
   NAME       Bewegungsmelder
   STATE      off
   TYPE       MQTT_DEVICE
   .attraggr:
   .attreocr:
     state
     .*state_sum.*
   .attreour:
     state
     .*state_sum.*
   .attrminint:
   .qos:
     *          0
   .retain:
     *          0
   READINGS:
     2018-08-01 15:01:07   Module          0
     2018-08-01 14:58:16   state           off
     2018-08-01 14:58:21   state_sum       stop
     2018-08-01 14:58:16   transmission-state incoming publish received
   message_ids:
   sets:
   subscribe:
     Wohnung/KUE/Bewegungsmelder/stat
   subscribeExpr:
     ^Wohnung\/KUE\/Bewegungsmelder\/stat$
   subscribeQos:
     Wohnung/KUE/Bewegungsmelder/stat 0
   subscribeReadings:
     Wohnung/KUE/Bewegungsmelder/stat:
       cmd       
       name       state
Attributes:
   IODev      MQTT_Broker
   devStateIcon on:own-woman off:audio_repeat .*:audio_repeat .*:audio_repeat .*:audio_repeat
   event-on-change-reading state,.*state_sum.*
   event-on-update-reading state,.*state_sum.*
   group      IT
   icon       it_camera
   room       FHEM->- Bridges->MQTT,Räume->Küche
   subscribeReading_state Wohnung/KUE/Bewegungsmelder/stat
   userattr   st_type_update st_type_update_map structexclude


Sowas wie: event-on-update-reading state,.*state_sum.*  sind schon Verzweiflungstaten :D


Was passt hier nicht ?

Otto123

#1
Moin,

ehrlich gesagt kann ich der Erklärung des Problems nicht ganz folgen.
Was mir auffällt: Bewegungsmelder :(.*state_sum.*) es muss meiner Meinung nach Bewegungsmelder:(.*state_sum.*) heissen. Wobei die Klammern in dem Fall überflüssig sind.
Ich weiß nicht was passiert wenn zwischen Gerät und : ein Leerzeichen steht. Wahrscheinlich wird auf alles von Bewegungsmelder getriggert und der Rest als Ausführungsteil behandelt.
https://commandref.fhem.de/commandref_DE.html#notify
Zur Unterstützung und Fehlersuche kann vielleicht noch der überarbeitete Artikel im Wiki helfen.

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

ftsinuglarity

Hallo Otto,

Zitat von: Otto123 am 02 August 2018, 09:37:20Moin,

ehrlich gesagt kann ich der Erklärung des Problems nicht ganz folgen.
Was mir auffällt: Bewegungsmelder.*state_sum.*) es muss meiner Meinung nach Bewegungsmelder:(.*state_sum.*) heissen. Wobei die Klammern in dem Fall überflüssig sind.
Ich weiß nicht was passiert wenn zwischen Gerät und : ein Leerzeichen steht. Wahrscheinlich wird auf alles von Bewegungsmelder getriggert und der Rest als Ausführungsteil behandelt.
https://commandref.fhem.de/commandref_DE.html#notify
Zur Unterstützung und Fehlersuche kann vielleicht noch der überarbeitete Artikel im Wiki helfen.

Gruß Otto

oh, wie mans macht ... :) Ersteinmal Danke für die Geduld dir das trotzdem durchzulesen. 
Eigentlich gehts nur um das Notify .. der Rest warum und wieso sollte nur den Rahmen aufzeigen, vlt gäbe es ja insg. bessere Ideen.
Das Leerzeichen war ein Versehen. Ich hab Bezeichnugen, ums etwas verständlicher zu machen, umgeschrieben, das war bestimmt nicht der einzige Übertragungsfehler ... das ist glaub ich nicht mein Problem.
Also kurz, vergiss das drumherum ;) Der watchdog aus der Funktion zB war an der Stelle falsch, da zu spät gesetzt.

Ich versuch das eigentliche Problem nochmal in Kurzform zu beschreiben:

Device Bewegungsmelder mit Reading "state_sum"defmod Bewegungsmelder MQTT_DEVICE
Bewegungsmelder->R:state_sum


1. Notify "n_Bewegungsmelder_mqtt" -> setzt mit "Glättung/Verzögerung" das Reading state_sum
defmod Bewegungsmelder bm_Kueche:(on|off) { call_sub($EVENT) }

Der Aufruf in der Funktion call_sub macht letztlich:
fhem("setreading Bewegungsmelder state_sum move"); 
 
was das 2. Notify "n_Bewegungsmelder_move" auslösen soll -> auf dieses Reading reagiere ich dann mit den Geräten, nicht auf das state vom 1. Notify, da das zu oft getriggert wird.
defmod n_Bewegungsmelder_move notify Bewegungsmelder:(.*state_sum.*)  {  ..do_something.. }

Und genau das klappt nicht so recht.


..... beim Zusammentragen hier bin ich gerade auf etwas gestoßen, 
fhem("setreading Bewegungsmelder state_sum move"); setzt nicht auf "move",  laut Notify Ausgabe wird "incomming" getriggert .. . jetzt bin ich komplett überrascht  .. ich schau mir das erstmal an und schreib dann was dazu .. vlt hat sichs ja dadurch schon...

Otto123

setreading Bewegungsmelder state_sum move
Das Suchmuster für einen Event auf das reading state_sum im Gerät Bewegungsmelder würde ich prinzipiell so verfassen:
Bewegungsmelder:state_sum.*Und gezielter dann eventuell so:
Bewegungsmelder:state_sum.(on|off|move).*Wobei wenn Du immer setreading selbst machst, dann reicht exakt:
Bewegungsmelder:state_sum.(on|off|move)
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

frank

hallo ftsinuglarity,

kann es sein, dass du eine schleife gebaut hast?
also ein event eines devices (soll) löst über notify und setreading erneut ein event in diesem device aus.
solche schleifen versucht fhem zu verhindern.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

ftsinuglarity

#5
Zitat von: Otto123 am 02 August 2018, 15:17:34
setreading Bewegungsmelder state_sum move
Das Suchmuster für einen Event auf das reading state_sum im Gerät Bewegungsmelder würde ich prinzipiell so verfassen:
Bewegungsmelder:state_sum.*Und gezielter dann eventuell so:
Bewegungsmelder:state_sum.(on|off|move).*Wobei wenn Du immer setreading selbst machst, dann reicht exakt:
Bewegungsmelder:state_sum.(on|off|move)

Danke Otto, das sieht sehr gut aus, hat aber auch nicht funktioniert. Jetzt ist mir auch klar warum, liegt nicht an deinem Statement:
trotz klarem: setreading Bewegungsmelder state_sum move
steht im Log:
2018-08-02_15:23:45 Bewegungsmelder state_sum: move
Den Doppelpunkt hinter state_sum habe ich die ganze Zeit ignoriert  (sehe ich auch übers Notify, wenn ich keine RegEx angebe) .. hätte ich mal nicht. Keine Ahnung wo der jetzt herkommt, schau ich gleich.

Wenn ich deine RegEx anpasse und sowas schreibe:
Bewegungsmelder :state_sum.*:.(on|off|move|stop) { .. }greift das trotzdem nicht. Egal wie ich Wildcards setze, es will nicht.

Sollte nicht spätestens das hier funktionieren? :
Bewegungsmelder :.*state_sum.*:.*(on|off|move|stop).* { .. }
Sieht zwar wild aus, sollte aber für mein Verständnis alles abdeckeln (der Doppelpunkt als solches ist hier vermutlich das Problem, weil er interpretiert wird in .* .. kann das sein?)
.* steht doch für alles beliebige oder gar nichts, korrekt?

ftsinuglarity

#6
Zitat von: frank am 02 August 2018, 15:25:05
hallo ftsinuglarity,

kann es sein, dass du eine schleife gebaut hast?
also ein event eines devices (soll) löst über notify und setreading erneut ein event in diesem device aus.
solche schleifen versucht fhem zu verhindern.
Hallo Frank,
ich denke nicht.
Es wird zwar in ein Device geschrieben, aber aus einem Reading der Wert gezogen (state on|off) (kommt vom Bewegungsmelder per MQTT),
und dann per Funktion das Reading state_sum auf move oder stop gesetzt. Auf Reading state_sum reagieren dann meine Geräte. Meinst du noch was anderes ?

Otto123

#7
Ja stimmt, hinter dem reading setzen steht meist(immer?) ein :

Dann würde ich es so machen:
Bewegungsmelder:state_sum:.(on|off|move)
Wobei der Eintrag im Log das Eine ist, das Wichtige ist der Event im Eventmonitor
https://wiki.fhem.de/wiki/Notify
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

ftsinuglarity

#8
Zitat von: Otto123 am 02 August 2018, 15:56:48
Ja stimmt, hinter dem reading setzen steht meist(immer?) ein :

Dann würde ich es so machen:
Bewegungsmelder:state_sum:.(on|off|move)
Wobei der Eintrag im Log das Eine ist, das Wichtige ist der Event im Eventmonitor
https://wiki.fhem.de/wiki/Notify
Ich glaub ich hab schon alle Varianten durch .. da will nix. Ich denke ich schau mal lieber wo der Doppelpunkt auf einmal herkommt.. im Notify siehts genaus aus


trotzdem zum Verständnis:
Warum greift das hier nicht einfach alles ab ? (Es sei denn der Doppelpunkt ist hier wirklich n Problem)
Bewegungsmelder :.*state_sum.*:.*(on|off|move|stop).* { .. }

ftsinuglarity

#9
Der Doppelpunkt ist nicht die ganze Fehlerquelle.

Ich hatte eingangs ja schon erwähnt, das "setreading Bewegungsmelder state_sum move" nicht recht ankommt, bzw nicht richtig getriggert wird. Irgendwo ist hier der Wurm drin.

Folgendes passiert:
1. Bewegungsmelder setzt per mqtt subscribe reading das "state" vom Bewegungsmelder Device in FHEM auf on|off
2. Das 1. Notify reagiert auf on|off korrekt, und ruft die Funktion call_sub($EVENT) auf
3. Die Funktion setzt per "setreading Bewegungsmelder state_sum move"  das Reading.
4. Im Log .. steht nichts.
5. Im 2. Notify sehe ich es, wenn ich dort keine RegEx einfüge (das eben besprochene Doppelpunkt Problem)

Das FHEM Device Bewegungsmelder steht auf:
event-on-change-reading .*
event-on-update-reading .*


Das LogDevice auf:
./bm-kue-%Y-%m.log Bewegungsmelder .. also Durchzug
Ich verstehe nicht, warum im Log nichts ankommt. Was vlt auch andere Probleme nach sich zieht



Edit:

Rufe ich direkt in der Komandozeile : setreading Bewgungsmelder state_sum move auf, erscheint es im Log und im Notify

Ein später in der Funktion aufgerufenes:
fhem("defmod ".$wd_timer_ofen." watchdog ".$dev.":off.* ".$time." ".$dev.":on.*  {fhem(\"setreading ".$dev." ".$event_reading." stop\")}");
.. also nochmal verschachteltes und in einen watchdog gepacktes : setreading Bewgungsmelder state_sum stop   
.. das haut hin. Das erscheint im Log und im Notify 
Ich schreibe das, weil es aus irgendeinem Grund vlt einen Unterschied macht, ob setreading aus einer Funktion oder vom Watchdog aufgerufen wird. Ich wüßte nicht warum, aber wer weiß

Das ist im Moment aber alles abgeschaltet, ich setze in der Funktion nur setreading .. , sonst nichts






Otto123

Wenn Du in der FHEM Kommandozeile ein setreading Bewegungsmelder state_sum moveabsetzt, musst Du im EVENTMONITOR einen Event sehen. Wenn nicht wird kein notify darauf anspringen.

ich würde event-on.* erstmal löschen!

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

ftsinuglarity

#11
Zitat von: Otto123 am 02 August 2018, 16:41:18
Wenn Du in der FHEM Kommandozeile ein setreading Bewegungsmelder state_sum moveabsetzt, musst Du im EVENTMONITOR einen Event sehen. Wenn nicht wird kein notify darauf anspringen.

ich würde event-on.* erstmal löschen!

Gruß Otto
Jup :) .. genau. Das passiert auch. Nur nicht aus der Funktion, why ever.

Sind nicht gesetzte event-on.*  das gleiche wie = Reagiere auf alles ?


Edit: rausgelöscht, das gleiche Ergebnis .. na wenigstens ist diese Programmierung sportlich, so oft wie ich in die Küche latsche um den Bewegungsmelder auszulösen :D

Ich kapiers nicht. Hab nochmal direkt über den EventMonitor geschaut:
2018-08-02 16:51:44 MQTT_DEVICE Bewegungsmelder state_sum: move

.. im Log .. nüscht

Otto123

nicht gesetzte event-on haben nichts mit reagieren zu tun. Sie steuern die Erzeugung von Events, an dem Device wo sie definiert sind. Nicht gesetzt bedeutet erzeuge die Events so wie sie sind....
setreading erzeugt unter bestimmten Umständen keine Events!
https://commandref.fhem.de/#setreading

Aber nach meinem Verständnis trifft das nicht in deinem Fall zu, aber das mit dem sleep kannst Du ja testen :)
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

ftsinuglarity

Zitat von: Otto123 am 02 August 2018, 16:53:09
setreading erzeugt unter bestimmten Umständen keine Events!
https://commandref.fhem.de/#setreading

Aber nach meinem Verständnis trifft das nicht in deinem Fall zu, aber das mit dem sleep kannst Du ja testen :)
Du meinst: setreading won't generate an event for device X, if it is called from a notify for device X nehme ich an

Habs trotzdem getestet, und .. Es klappt !! Der Logeintrag wird geschrieben!
Das komplette Statement:
fhem("sleep 0.1;setreading Bewegungsmelder state_sum move;");
   
Zitat von: Otto123 am 02 August 2018, 16:53:09
nicht gesetzte event-on haben nichts mit reagieren zu tun. Sie steuern die Erzeugung von Events, an dem Device wo sie definiert sind. Nicht gesetzt bedeutet erzeuge die Events so wie sie sind....
Oh ja, das ist besser ausgedrückt. Events so wie sie sind werden doch aber auch bei event-on.* durchgegeben, nur nach Readings gefiltert wenn man möchte (zB event-on-update state) .. das meintest du wahrscheinlich ?

ftsinuglarity

#14
Danke Otto, ohne dich wär ich auf sleep 0.1 nicht gekommen, vielen vielen Dank!

Wenns dich nicht nervt... der Doppelpunkt, den bekomme ich nicht weg.2018-08-02 17:12:04 MQTT_DEVICE Bewegungsmelder state_sum: moveBei stop ist es das gleiche.

Rufe ich direkt auf:trigger Bewegungsmelder on ist der Doppelpunkt auch da. Über die Funktion aufgerufen das gleiche.

Wo könnte der herkommen ?


Edit:
Öhm, ich sehe gerade, das alle! Readings im EventMonitor einen : Doppelpunkt haben, ist mir noch nie aufgefallen.
set states haben das nicht.