DOIF bei Klingelsensor mit trigger

Begonnen von Depechem, 16 August 2017, 14:45:08

Vorheriges Thema - Nächstes Thema

Depechem

Ich muss schonwieder bezüglich DOIF doof fragen.

ich möchte wenn der Klingelsensor gedrückt wird (das Reading "trigger" sich ändert) sowie ein "dummy" Schalter eingeschalten ist, das ein set Befehl ausgeführt wird.
hier das Reading des Sensors:

state Short 1_126 (to broadcast) 2017-08-16 14:36:47
trigger Short_126 2017-08-16 14:36:47
trigger_cnt 126 2017-08-16 14:36:47


So habe ich es probiert:
define doif_Klingel_Thomas_bekommt_alles DOIF ([Klingelsensor_1_Eltern_Haustuer:trigger] or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)
attr doif_Klingel_Thomas_bekommt_alles do always

dies funktioniert auch fast, ABER
wenn ich den Schalter Klingel_Thomas_bekommt_alles_Schalter einschalte wird der set-Befehl schon ausgeführt ohne das der Klingelsensor_1_Eltern_Haustuer betätigt wurde.
Scheinbar erkennt das DOIF immer einen "trigger".
Was müsste ich umstellen, damit das DOIF funktioniert und beim einschalten des Schalters Klingel_Thomas_bekommt_alles_Schalter nicht sofort ein "set" ausgelößt wird?

Dank im voraus
Thomas
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

nils_

https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger

führt zu

define doif_Klingel_Thomas_bekommt_alles DOIF ([Klingelsensor_1_Eltern_Haustuer:trigger] or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] and [?Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)

viele Wege in FHEM es gibt!

Depechem

Zitat von: nils_ am 16 August 2017, 14:57:57
https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger

führt zu

define doif_Klingel_Thomas_bekommt_alles DOIF ([Klingelsensor_1_Eltern_Haustuer:trigger] or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] and [?Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)



Danke dir, die hatte ich aber auch schon getestet.
Bei [?Klingel_Thomas_bekommt_alles_Schalter] wird der Schalter ganz außer acht gelassen, d.h. egal ob der Schalter "on" oder "off" ist wird bei Betätigung des [Klingelsensor_1_Eltern_Haustuer:trigger] das DOIF ausgelößt.
:-(
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Otto123

#3
Hi,

zunächst mal musst Du Dir über die Wirkung der Logik klar werden: a or b and c
In Perl gilt dann diese Reihenfolge-> http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
Dann solltes Du Dir mit 0 und 1 klar werden was dabei rauskommt:
ZitatUND
0 0 -> 0
0 1 -> 0
1 0 -> 0
1 1 -> 1

ODER
0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 1
Es wird in deinem Fall quasi a or (b and c ) gemacht. Willst Du das - oder willst Du eigentlich (a or b) and c? Dann musst Du Klammern setzen.

Weiterhin würde ich auf den konkreten Event triggern, sonst wird mehrfach betätigt. Schau Dir im Eventmonitor an was passiert wenn Du den Knopf drückst. Meines Wissen kommen zwei Events auf das reading trigger. Bei Dir wird aber einfach bei einem Event der Zustand der anderen abgefragt, quasi ist [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] überhaupt da. Klar ist das reading immer da. Du könntest dort eine Abfrage mit eq machen, aber der Inhalt ändert sich nicht sinnvoll.

Also nimm eventuell [Klingelsensor_1_Eltern_Haustuer:"trigger.Short.*"] ich bin nicht ganz sicher ob das in DOIF so stimmt, DOIF ist immer etwas anders.  :-[

Eien Hilfe den Trigger genau zu definieren -> https://wiki.fhem.de/wiki/Event_monitor

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

nils_

Zitatdefine doif_Klingel_Thomas_bekommt_alles DOIF (([Klingelsensor_1_Eltern_Haustuer:trigger] or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger]) and [?Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)


//edit
Otto war mal wieder schneller ::)
bitte auch seine anmerkung beachten, sonst triggert das DOIF evtl. doppelt!
viele Wege in FHEM es gibt!

Depechem

#5
Zitat von: Otto123 am 16 August 2017, 16:08:55
Hi,

zunächst mal musst Du Dir über die Wirkung der Logik klar werden: a or b and c
Dann solltes Du Dir mit 0 und 1 klar werden was dabei rauskommt:Es wird in deinem Fall quasi a or (b and c ) gemacht. Willst Du das - oder willst Du eigentlich (a or b) and c? Dann musst Du Klammern setzen.

Danke, die Klammern hatte ich vergessen.

Zitat von: Otto123 am 16 August 2017, 16:08:55
Weiterhin würde ich auf den konkreten Event triggern, sonst wird mehrfach betätigt. Schau Dir im Eventmonitor an was passiert wenn Du den Knopf drückst. Meines Wissen kommen zwei Events auf das reading trigger. Bei Dir wird aber einfach bei einem Event der Zustand der anderen abgefragt, quasi ist [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] überhaupt da. Klar ist das reading immer da. Du könntest dort eine Abfrage mit eq machen, aber der Inhalt ändert sich nicht sinnvoll.

Also nimm eventuell [Klingelsensor_1_Eltern_Haustuer:"trigger.short.*"] ich bin nicht ganz sicher ob das in DOIF so stimmt, DOIF ist immer etwas anders.  :-[

Eien Hilfe den Trigger genau zu definieren -> https://wiki.fhem.de/wiki/Event_monitor

Gruß Otto

ja genau das mit dem "trigger" wird mein Problem sein.
das Reading "trigger" bringt wenn der Klingelknopf kurz betätigt wird ein Short_134 also ein "short mit Zahl",
oder ein Long_134 wenn der jenige länger den Klingelknopf betätigt.
Daher kann ich kein [Klingelsensor_1_Eltern_Haustuer:"trigger.short.*"] angeben sonst wird bei einem Long nicht ausgelößt.
Was müsste ich eingeben damit es bei beiden auslößt?

also müsste es doch so in etwa werden!?
(([Klingelsensor_1_Eltern_Haustuer:trigger] eq "Short.*" or [Klingelsensor_1_Eltern_Haustuer:trigger] eq "Long.*" or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] eq "Short.*" or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] eq "Long.*") and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Depechem

Zitat von: Depechem am 16 August 2017, 20:24:00

(([Klingelsensor_1_Eltern_Haustuer:trigger] eq "Short.*" or [Klingelsensor_1_Eltern_Haustuer:trigger] eq "Long.*" or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] eq "Short.*" or [Klingelsensor_Btn_04_Eltern_Hoftor:trigger] eq "Long.*") and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 008)
Also das geht leider auch nicht. Da lößt das DOIF gar nicht aus
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Otto123

#7
Sorry aber eq "short.*" bedeutet "ist das gleich irgendwas was ich nicht weiß" eq ist entweder gleich oder nicht. In deinem Fall immer nicht.

Ich kenne die Events nicht genau (ich empfehle Dir den Event monitor) aber ich würde mich an Deiner Stelle von einfach nach kompliziert vortasten. Leider machst Du erstmal so kompliziert wie möglich.

Kann sein das es so geht:([Klingelsensor_1_Eltern_Haustuer:"trigger.Short.*"] or [Klingelsensor_1_Eltern_Haustuer:"trigger.Long.*"]) and ...
Lies Dir bitte die Doku zu DOIF durch und versuche den Unterschied zwischen triggern auf Zustand und triggern auf Event zu verstehen. Das was ich vorschlage triggert auf den Event.

Du kannst das DOIF (zumindest die Grundlage) im Event monitor auch erzeugen lassen. Wie das geht steht im Wiki.

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

Depechem

Danke Dir Otto für deine unermüdlichen Bemühungen.
Ich werde nochmal klein anfangen und das Wiki durchforsten.
Gruß
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

nils_

Zitat von: Depechem am 16 August 2017, 14:45:08

state Short 1_126 (to broadcast) 2017-08-16 14:36:47
trigger Short_126 2017-08-16 14:36:47
trigger_cnt 126 2017-08-16 14:36:47


und bitte beachten dein "Short" wird groß geschrieben, und nicht wie in den bisherigen DOIF-Codes verwendet "short" (also klein!)

([Klingelsensor_1_Eltern_Haustuer:"trigger.(Ss)hort.*"] or [Klingelsensor_1_Eltern_Haustuer:"trigger.(Ll)ong.*"]) and ...


aber da hilft dir der eventmonitor weiter ;)
viele Wege in FHEM es gibt!

Otto123

Moin,

da hat nils völlig recht, habe ich bisher falsch zitiert und oben korrigiert.

Viel durchforsten musst Du nicht, es gibt einen kurzen Artikel -> https://wiki.fhem.de/wiki/Event_monitor

Wichtig ist, dass Du an diesem kleinen Beispiel versuchst zu verstehen wie das mit den Events und Reaktion darauf im System ist. Wenn man das einmal hat, ist der Rest viel einfacher  8)

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

Depechem

Zitat von: Otto123 am 17 August 2017, 09:45:51
-> https://wiki.fhem.de/wiki/Event_monitor
Zitat von: nils_ am 17 August 2017, 09:23:06

([Klingelsensor_1_Eltern_Haustuer:"trigger.(Ss)hort.*"] or [Klingelsensor_1_Eltern_Haustuer:"trigger.(Ll)ong.*"]) and ...

aber da hilft dir der eventmonitor weiter ;)


Ich danke euch beiden. Mit eurer Hilfe sowie dem Event_monitor hab ich es jetzt genau so wie ich es möchte hinbekommen!!
Vielen Dank dafür!

define doif_Klingel_Thomas_bekommt_alles DOIF (([Klingelsensor_1_Eltern_Haustuer:"trigger. Short.*"] or [Klingelsensor_1_Eltern_Haustuer:"trigger. Long.*"] or [Klingelsensor_Btn_04_Eltern_Hoftor:"trigger. Short.*"] or [Klingelsensor_Btn_04_Eltern_Hoftor:"trigger. Long.*"] or [Klingelsensor_2_Omi_Haustuer:"trigger. Short.*"] or [Klingelsensor_2_Omi_Haustuer:"trigger. Long.*"] or [Klingelsensor_Btn_06_Omi_Hoftor:"trigger. Short.*"] or [Klingelsensor_Btn_06_Omi_Hoftor:"trigger. Long.*"]) and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 001; set Pushover_Pushnachrichten msg 'Klingel' 'von Omi oder Eltern' 'iPhoneThomas' 0 'pushover')
attr doif_Klingel_Thomas_bekommt_alles do always
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

nils_

ich bin jetzt nicht so der regex-experte, aber geht das nicht einfacher?

define doif_Klingel_Thomas_bekommt_alles DOIF ([Klingelsensor.*:"trigger.*"] and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 001; set Pushover_Pushnachrichten msg 'Klingel' 'von Omi oder Eltern' 'iPhoneThomas' 0 'pushover')

natürlich nur falls du nicht noch mehr Klingelsensoren hast, auf die du nicht triggern willst.
viele Wege in FHEM es gibt!

Otto123

Mir kommt auch das Leerzeichen komisch vor "trigger. Short.*" aber mag sein, dass es so ist und mag sein das DOIF da tolerant ist.
Mir fehlt auch ein ; hinten im define, da sollten zwei stehen ;;

Ich würde auch sagen, den regEx für den Event bekommt man kürzer und ich würde ein notify machen, dass ist für mich immer klarer. Ungetestet und wahrscheinlich falsch!
define nty_Klingel_Thomas_bekommt_alles notify Klingelsensor.*:trigger.* IF ([Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 001;; set Pushover_Pushnachrichten msg 'Klingel' 'von Omi oder Eltern' 'iPhoneThomas' 0 'pushover')

Wenn Thomas mal die echten Events liefert für Long und Short von allen beteiligten Tastern könnte man das perfekt machen.
Denn ich glaube es kommen zwei Events mit "trigger" drin und bei Long kommt auch noch Dauerfeuer.

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

Depechem

#14
Zitat von: Otto123 am 17 August 2017, 16:46:24
Mir kommt auch das Leerzeichen komisch vor "trigger. Short.*" aber mag sein, dass es so ist und mag sein das DOIF da tolerant ist.
laut Event_monitor kommt das Leerzeichen aber rein, ohne Leerzeichen geht es nicht.

Zitat von: Otto123 am 17 August 2017, 16:46:24
Mir fehlt auch ein ; hinten im define, da sollten zwei stehen ;;

zwei ";;" müssen in der fhem.cfg stehen
einmal ";" findet man das ganze dann direkt in der FHEM Oberfläche im DEF

Zitat von: Otto123 am 17 August 2017, 16:46:24
Wenn Thomas mal die echten Events liefert für Long und Short von allen beteiligten Tastern könnte man das perfekt machen.
Denn ich glaube es kommen zwei Events mit "trigger" drin und bei Long kommt auch noch Dauerfeuer.

Hier mal die Events bei Short und Long, dies ist für alle Klingeltaster gleich. Hierbei habe ich einmal kurz, sowie zweimal lang auf den Klingeltaster gedrückt.
2017-08-17 17:30:16.269 CUL_HM Klingelsensor Klingelsensor_3_Thomas_Haustuer Short
2017-08-17 17:30:16.421 CUL_HM Klingelsensor_3_Thomas_Haustuer trigger: Short_240

2017-08-17 17:30:19.811 CUL_HM Klingelsensor_3_Thomas_Haustuer trigger: Long_241
2017-08-17 17:30:21.200 CUL_HM Klingelsensor Klingelsensor_3_Thomas_Haustuer LongRelease
2017-08-17 17:30:24.320 CUL_HM Klingelsensor_3_Thomas_Haustuer trigger: Long_242
2017-08-17 17:30:25.414 CUL_HM Klingelsensor Klingelsensor_3_Thomas_Haustuer Long
2017-08-17 17:30:25.667 CUL_HM Klingelsensor Klingelsensor_3_Thomas_Haustuer LongRelease


In den Klingelsensoren habe ich das "attr event-on-change-reading trigger" gesetzt, daher kommt es wie gewünscht nur einmal am Klingelmodul sowie DOIF durch.

Zitat von: nils_ am 17 August 2017, 16:25:21
ich bin jetzt nicht so der regex-experte, aber geht das nicht einfacher?

define doif_Klingel_Thomas_bekommt_alles DOIF ([Klingelsensor.*:"trigger.*"] and [Klingel_Thomas_bekommt_alles_Schalter] eq "on")(set Klingelmodul_Thomas playTone 001; set Pushover_Pushnachrichten msg 'Klingel' 'von Omi oder Eltern' 'iPhoneThomas' 0 'pushover')

natürlich nur falls du nicht noch mehr Klingelsensoren hast, auf die du nicht triggern willst.

ich habe mehrere Klingelsensoren, und die dürfen nicht alle auf einmal dafür getriggert werden. ;-)

RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...