FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Depechem am 16 August 2017, 14:45:08

Titel: DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 16 August 2017, 14:45:08
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag 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)

Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 16 August 2017, 15:08:29
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.
:-(
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag 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
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: nils_ am 16 August 2017, 16:11:54
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!
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 16 August 2017, 20:24:00
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)
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 16 August 2017, 20:42:23
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Otto123 am 16 August 2017, 21:55:29
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 16 August 2017, 22:04:38
Danke Dir Otto für deine unermüdlichen Bemühungen.
Ich werde nochmal klein anfangen und das Wiki durchforsten.
Gruß
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: nils_ am 17 August 2017, 09:23:06
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 ;)
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Otto123 am 17 August 2017, 09:45:51
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 17 August 2017, 13:35:36
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag 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.
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag 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.
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
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Depechem am 17 August 2017, 17:41:20
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. ;-)

Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: nils_ am 18 August 2017, 08:00:07
Zitat von: Depechem am 17 August 2017, 17:41:20
ich habe mehrere Klingelsensoren, und die dürfen nicht alle auf einmal dafür getriggert werden. ;-)

ich hatte es geahnt  ;D
dann wird es natürlich schwer ein kurzes regex zu bauen.
andere idee, du packst die Klingelsensoren in eine structure. d.h. du brauchst nur diese "liste" pflegen und deine logik basiert dann darauf.
(jetzt bin ich nur unsicher ob du dann auch events weitergereicht bekommst....-> Eventmonitor prüfen ;). vielleicht weiß Otto da mehr  8) )
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Brockmann am 18 August 2017, 08:41:40
Das Unterscheiden von Short und Long könntest Du Dir ersparen, wenn Du anstatt trigger auf trigger_cnt reagierst. Das ist ein Zähler, der bei jedem Betätigen der Klingel um eins erhöht wird. Wenn der Höchststand erreicht ist, fängt er wieder bei 0 an. Entscheidend ist aber, dass trigger_cnt unabhängig von der Länge des Betätigens immer um eins erhöht wird. Du brauchst also Short und Long nicht zu unterscheiden, sondern reagierst einfach nur auf ein trigger_cnt-Event von diesem Device.


([Klingelsensor_1_Eltern_Haustuer:"trigger_cnt"] or...)


Das event-on-change-Attribut müsstest Du dafür aber entsprechend ändern.
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Otto123 am 18 August 2017, 09:49:01
Moin Thomas,

nochmal kleine Grundlagenkunde  8)
das semikolon
für den FHEM Befehl muss in der Raw definition (damit auch in der fhem.cfg) doppelt stehen, ein einzelnes semikolon würde von Perl interpretiert und damit entfernt. Beispiel
defmod ALLE_ROLLOS_ notify ALLE_ROLLOS set RolloAZL $EVENT;; set RolloAZR $EVENT
In der Oberfläche steht in der DEF und im DEF Editor aber nur ein SemikolonDEF ALLE_ROLLOS set RolloAZL $EVENT; set RolloAZR $EVENTWenn Du hier postest musst Du entweder die DEF posten und das so schreiben, oder die Raw definiton posten oder ein list <gerät> posten. Die DEF zu kopieren und ein define daraus zu basteln und das zu posten führt genau dazu, dass der Leser verwirrt ist. In deinem define steht nur ein Leerzeichen!
das regEx
Im regEx muss ein Leerzeichen gesondert berücksichtigt werden. Meist nimmt man einen Punkt. Ich suche die Textkette "Klingelsensor_3_Thomas_Haustuer Short" und muss im regEx das Leerzeichen durch einen Punkt ersetzen "Klingelsensor_3_Thomas_Haustuer.Short" Der Punkt trifft auf jedes Zeichen zu! Also regEx ..... wären einfach ein Wort mit 5 Zeichen.

Insofern enthält dein regEx in Deinem DOIF noch Leerzeichen und das ist aus meiner Sicht falsch. Ich glaube aber DOIF handhabt das anders, deswegen funktioniert es vielleicht. Hast Du ja geschrieben, ich bezweifle es weil das regEx hat ein Leerzeichen und Dein Ausführungsteil hat ein semikolon zu wenig. Aber vielleicht macht der Ausführungsteil was, wirft einen Fehler und Du denkst geht doch.  ;)

Gruß Otto
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Otto123 am 18 August 2017, 10:12:05
Noch ein Vorschlag mit notify, weil Du hier DOIF mMn nicht brauchst und notify einfacher wird.
Ich nehme mal diesen Eventteil, der geht bei Short und Long falls Dich Klingeldauerfeuer nicht stört:
Klingelsensor_3_Thomas_Haustuer trigger:
Du hast diese Sensoren und willst genau die:
Klingelsensor_1_Eltern_Haustuer
Klingelsensor_Btn_04_Eltern_Hoftor
Klingelsensor_2_Omi_Haustuer
Klingelsensor_Btn_06_Omi_Hoftor


define nty_Klingel_Thomas_bekommt_alles notify (Klingelsensor_[1,2].*|Klingelsensor_Btn_0[4,6].*):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')
Man beachte: der erste ":" ist der Trenner zwischen Gerät und Event, der zweite ":" ist Teil des Events!
Ist jetzt nicht getestet sollte aber funktionieren. Falls nicht, kannst Du einfach den regEx Teil oder Teile davon im Eventmonitor ausprobieren, das ist schneller und besser als auf das notify zu warten.

Der trigger_cnt Event wie Brockmann schrieb ist  auch eine Idee.
Wenn Du kein Dauerfeuer willst, kannst Du auf LongRelease triggern, allerdings klingelt es dann erst beim loslassen.

Gruß Otto
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Fixel2012 am 18 August 2017, 10:15:10
eventmininterval setzen wäre auch eine Möglichkeit. z.B. auf 30 sekunden, somit wird nur jede 30 sekunden ein Event generiert.
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Otto123 am 18 August 2017, 10:20:42
@Fixel2012
Ich finde es sinnlos einen kompletten Beitrag zu zitieren, der genau vor der Antwort steht.
Besser wäre Du hättest den Teil rausgenommen, der sich auf Deine Antwort bezieht. Dann würde man das auch sofort verstehen und müsste nicht minutenlang nachdenken  :-X :'(

Gruß Otto
Titel: Antw:DOIF bei Klingelsensor mit trigger
Beitrag von: Fixel2012 am 18 August 2017, 10:22:43
@Otto123 Da hast du eigentlich Recht! habe es oben editiert und werde Zukünftig schauen, dass ich das vermeide  :)