FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: manne44 am 30 Januar 2022, 00:44:00

Titel: [Gelöst] DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 00:44:00
In der Referenz wird u.a. beschrieben
Zitat
["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten
["^FS"] triggert auf alle Devices, die mit "FS" im Namen anfangen
["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
[""] triggert auf alles
Nun habe ich aber z.B. ein Dummy, in dem alle Fenster und Türen eingetragen sind wie z.B.

   NAME       oWD
   NR         1247
   STATE      defined
   TYPE       dummy
   Helper:
     DBLOG:
       doorGarage:
         fhemDbLog:
           TIME       1643497200.4468
           VALUE      closed
       doorGarten:
         fhemDbLog:
           TIME       1643497200.44797
           VALUE      closed
       doorHaus:
         fhemDbLog:
           TIME       1643497200.44907
           VALUE      closed
       doorHzg:
         fhemDbLog:
           TIME       1643497200.45021
           VALUE      closed
       doorSchuppen:
         fhemDbLog:
           TIME       1643497200.45242
           VALUE      closed

usw.

Meine Frage ist wie ich nun auch eine solche Suche bei Readings machen kann, die mit win oder door beginnen und in oWD definiert sind.
Ich habe mit try and error hin und her probiert, aber kein Ergebnis bekommen. Vielleicht weiß das jemand ohne groß nachdenken zu müssen oder es geht so überhaupt nicht. Kein richtiges Problem, denn ich habe das auf andere Weise gelöst.
Titel: Antw:DOIF Regex-Angaben
Beitrag von: OdfFhem am 30 Januar 2022, 02:59:00
@manne44

Unmittelbar vor den angeführten Beispielen findet man in der Referenz auch:
Zitat
Sollen Events verschiedener Devices ausgewertet werden, so lässt sich folgende Syntax anwenden: ["<device regex>:<event regex>"]

Demnach könnte der folgende, ungetestete Vorschlag funktionieren:

["^oWD$:^(win|door)"]
Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 10:35:00
Vielen Dank, aber ich verstehe das noch nicht wirklich.
Wenn ich testweise

defmod di_wintest DOIF (["^oWD$:^win"]) ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )

schreibe, dann wird ins Logfile eingetragen:

2022.01.30 10:17:31.971 2: Das hat geklappt: oWD  winWohnR: open

Es wird also im Event das Reading und der Status gemeldet, obwohl nicht nach "open" im DOIF gefragt wurde. Wird das Fenster wieder geschlossen, dann müsste doch auch das DOIF getriggert werden, weil auch dann eine Änderung des Status erfolgt, aber da passiert nichts. Wo da ein Unterschied ist, das verstehe ich nicht, denn es wird nicht explizit nach "open" getriggert, sondern nach "win".
In der Referenz steht
Zitat
Sollen Events verschiedener Devices ausgewertet werden, so lässt sich folgende Syntax anwenden: ["<device regex>:<event regex>"]
Ich hatte mit "event regex" in diesem Fall immer "open" oder "closed" und nicht das Reading selbst verstanden, so wie das in den Beispielen auch beschrieben ist.
Titel: Antw:DOIF Regex-Angaben
Beitrag von: Damian am 30 Januar 2022, 10:41:19
Zitat von: manne44 am 30 Januar 2022, 10:35:00
Vielen Dank, aber ich verstehe das noch nicht wirklich.
Wenn ich testweise

defmod di_wintest DOIF (["^oWD$:^win"]) ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )

schreibe, dann wird ins Logfile eingetragen:

2022.01.30 10:17:31.971 2: Das hat geklappt: oWD  winWohnR: open

Es wird also im Event das Reading und der Status gemeldet, obwohl nicht nach "open" im DOIF gefragt wurde. Wird das Fenster wieder geschlossen, dann müsste doch auch das DOIF getriggert werden, weil auch dann eine Änderung des Status erfolgt, aber da passiert nichts. Wo da ein Unterschied ist, das verstehe ich nicht, denn es wird nicht explizit nach "open" getriggert, sondern nach "win".
In der Referenz steht Ich hatte mit "event regex" in diesem Fall immer "open" oder "closed" und nicht das Reading selbst verstanden, so wie das in den Beispielen auch beschrieben ist.

Du hast mit der Regex nicht nach open sondern nach beginnend mit win gefragt:

2022.01.30 10:17:31.971 2: Das hat geklappt: oWD  winWohnR: open
Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 11:05:56
Nun frage ich mal nach "open":

(["^oWD$:^open"]) ( {Log(2,"Das hat geklappt: $DEVICE $EVENT")} )

Aber da tut sich nichts, wie auch zu erwarten war, denn "oWD" wird nie "open", aber ein Reading davon und auf das möchte ich gern triggern.
Mit

attr di_wintest do always

wird bei jedem Event, open und closed, getriggert.
Titel: Antw:DOIF Regex-Angaben
Beitrag von: Damian am 30 Januar 2022, 11:17:18
Zitat von: manne44 am 30 Januar 2022, 11:05:56
Nun frage ich mal nach "open":

(["^oWD$:^open"]) ( {Log(2,"Das hat geklappt: $DEVICE $EVENT")} )

Aber da tut sich nichts, wie auch zu erwarten war, denn "oWD" wird nie "open", aber ein Reading davon und auf das möchte ich gern triggern.
Auch weshalb die vorige Version
(["^oWD$:^win"]) ( {Log(2,"Das hat geklappt: $DEVICE $EVENT")} )

nur bei "open" und nicht auch bei "closed" getrggert hat, das ist ungeklärt.

Ein Event beginnt mit einem Devicenamen:

also fragst du mit:

(["^oWD$:^open"])

nach Events deren Devicename mit open beginnt.

Was du aber willst, ist eher:

(["^oWD$:^(win|door): (open|closed)$"])

Wenn es auf closed nicht triggert, dann gibt es kein passendes Event dazu.






Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 11:35:24
Vielen Dank, aber da tut sich nichts bei

defmod di_wintest DOIF (["^oWD$:^(win|door): (open|closed)$"])  ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )

auch nicht bei

defmod di_wintest DOIF (["^oWD$:^(win|door):^(open|closed)$"])  ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )
Titel: Antw:DOIF Regex-Angaben
Beitrag von: Damian am 30 Januar 2022, 11:50:03
Zitat von: manne44 am 30 Januar 2022, 11:35:24
Vielen Dank, aber da tut sich nichts bei

defmod di_wintest DOIF (["^oWD$:^(win|door): (open|closed)$"])  ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )

auch nicht bei

defmod di_wintest DOIF (["^oWD$:^(win|door):^(open|closed)$"])  ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )


Ohne passenden Auszug aus dem Eventlog wird dir keiner helfen können.
Titel: Antw:DOIF Regex-Angaben
Beitrag von: Sany am 30 Januar 2022, 11:56:19
Moin,
wieso wird immer im Trüben gefischt.... Du willst mittel DOIF auf Events reagieren, also solltest Du sicherstellen, dass diese Events auch kommen. Wie Du die Infos in den Dummy bekommst kann ich nicht sagen, Du willst aber auf diese Inhalte im Dummy reagieren.
Dann öffne doch mal den Event-Monitor und trag den Dummy ein, danach öffest Du ein oder 2 Fenster und schließt diese wieder (oder Türen oder...). Das, was der Event-Monitor dann anzeigt könntest Du hier mal posten.
Weiterhin kannst Du dir den Regex-Filter auch dort gleich erzeugen: die gewünschte Zeile im Event-Monitor komplett von links nach rechts markieren, dann auf "Create/Modify Device" klicken, im Drop-down DOIF auswählen und dann siehst Du die entsprechende Regex. Die kannst Du als Vorlage für Dein Vorhaben rauskopieren, ein klick auf OK würde die unten angezeigte Zeile ausführen und vermutlich eine neues DOIF anlegen, was Du aber wohl hier nicht willst. Weitere Details im Wiki zu Event-Monitor.

Gruß


Sany


Edit: damian war schneller...
Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 13:01:27
Das mit dem Eventmonitor ist eigentlich eine schöne Sache, aber wenn keine Events kommen, dann gibt es dafür dort auch keine Einträge.
Meine Fensterkontakte kurz erklärt: Es gibt funkbasierte und fest verdrahtete. Die verdrahteten wenden auf eine Arduino nano geführt, dort in eine 8-Bit-Word gewandelt und per I2C an den RPI4 geschickt, den dann darauf reagiert und die Stati in die Fensterreadings in oWD einträgt. Die funkbasierten haben jeweils ein eigenes Device erzeugen auch bei Änderung einen eigenen Event (muss noch in Templates umgeschrieben werden), der dann eine Perl-Funktion aufruft, in der die Fenster gezählt werden usw. Diese Events kommen auch.
Um nun zwecks Offen-Erkennung und Alarm-Auslösung bei Unterschreiten einer bestimmten Außentemperatur und Überschreitung der maximalen Offenzeit eine kurzen Alarm mit Tröte auszulösen, aber nur dann, wenn zur Aufrufzeit das Fenster immer noch offen ist, habe ich dieses beschriebene DOIF kreiert, das aber nicht funktioniert. Statt dessen habe ich zusätzlich zu den funkbasierten auch für die fest verdrahteten Kontakte jeweils ein dumm-Device eingeführt, dessen Name mit "win" beginnt, in der bei Änderung auch der State eingetragen wird. Dieses Doppelgemoppel gefällt mir nicht, deshalb wollte ich auf die Readings in oWD trigger, in der alle Stati eingetragen sind.
Funktioniert:

defmod di_window_open DOIF (["^win:open"] and [?WS:temperature] < [?win_open_alarm_temperature]) ( {openWinAlarmMsg("$DEVICE")} )
attr di_window_open DbLogExclude .*
attr di_window_open do always
attr di_window_open room DOIF,Fenster
attr di_window_open wait [win_open_alarm_time]

Bei

defmod di_wintest DOIF defmod di_wintest DOIF (["^oWD$:^(win|door): (open|closed)$"])  ( {Log(2,"Das hat geklappt: $DEVICE  $EVENT")} )
attr di_wintest DbLogExclude .*
attr di_wintest do always
attr di_wintest room Fenster

wird kein Event ausgelöst, obwohl ich fest verdrahtete und funkbasierte Kontakte ausgelöst habe.
Bei den funkbasierten Kontakten gibt es Events, aber nicht durch das in Diskussion stehende DOIF, sondern durch ein anderes, was man durchaus noch mal "verdichten" könnte.

Events (Filter: oWD.*)   FHEM log   ResetCreate/Modify Device

2022-01-30 12:58:52.755 dummy oWD winHolzR: open
2022-01-30 12:58:52.760 dummy functionList oWD_OpenWin: 10798
2022-01-30 12:58:55.800 dummy oWD winHolzR: closed
2022-01-30 12:58:55.805 dummy functionList oWD_CloseWin: 10801
2022-01-30 12:59:03.895 dummy oWD winHolzL: open
2022-01-30 12:59:03.898 dummy functionList oWD_OpenWin: 10799
2022-01-30 12:59:05.970 dummy oWD winHolzL: closed
2022-01-30 12:59:05.974 dummy functionList oWD_CloseWin: 10802
2022-01-30 12:59:18.667 dummy oWD winVelux: open
2022-01-30 12:59:18.671 dummy functionList oWD_OpenWin: 10800
2022-01-30 12:59:20.200 dummy oWD winVelux: closed
2022-01-30 12:59:20.206 dummy functionList oWD_CloseWin: 10803
Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 13:20:22
Um es abzuschließen, danke ich Euch für die umfassende Hilfe, die ich heute wieder bekommen habe und will Euch mit meinen Problemchen nicht weiter belasten. Es geht ja alles. Ich will nur verschönern. Deshalb bin ich auf die DOIFs mit den Regex-Angaben gekommen und weil kein Beispiel mit Readings war, hatte ich ohne Erfolg selbst versucht ein Ergebnis zu bekommen.
Die von damian vorgeschlagene Lösung bringt auch keinen Event und wenn er das nicht kann, wer soll es denn dann können?
Titel: Antw:DOIF Regex-Angaben
Beitrag von: Damian am 30 Januar 2022, 13:42:12
Zitat von: manne44 am 30 Januar 2022, 13:20:22
Um es abzuschließen, danke ich Euch für die umfassende Hilfe, die ich heute wieder bekommen habe und will Euch mit meinen Problemchen nicht weiter belasten. Es geht ja alles. Ich will nur verschönern. Deshalb bin ich auf die DOIFs mit den Regex-Angaben gekommen und weil kein Beispiel mit Readings war, hatte ich ohne Erfolg selbst versucht ein Ergebnis zu bekommen.
Die von damian vorgeschlagene Lösung bringt auch keinen Event und wenn er das nicht kann, wer soll es denn dann können?

Ich kann es schon, wenn ich die Events kenne  ;)

zu:

Zitat2022-01-30 12:58:52.755 dummy oWD winHolzR: open

sollte:

(["^oWD$:^(win|door).*: (open|closed)$"])

passen.
Titel: Antw:DOIF Regex-Angaben
Beitrag von: manne44 am 30 Januar 2022, 15:17:54
Hallo lieber Damian, jetzt hat es geklappt:

2022.01.30 15:10:08.010 2: Das hat geklappt: oWD  winHolzR: open
2022.01.30 15:10:11.050 2: Das hat geklappt: oWD  winHolzR: closed

In Deiner ersten Version fehlte der Stern
(["^oWD$:^(win|door).*: (open|closed)$"]),
deshalb ging es nicht.
Ich hatte auch nicht ernsthaft geglaubt, dass Du das nicht kannst.
Vielen Dank an alle, die mich hier unterstützt haben.

Vielleicht sollte man so ein Beispiel für Readings in die Referenz übernehmen, damit auch Unbedarfte wie ich sofort wissen, wie sie das anzuwenden haben.