FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Loredo am 08 November 2015, 20:24:50

Titel: [gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 20:24:50
Hallo Damian,


ich versuche gerade ein DOIF mit einem Regex zu erstellen, welches im regulären Ausdruck Klammern enthält. Diese werden aber natürlich als Zeit interpretiert, so dass ich diesen Fehler erhalte:


Wrong timespec A: either HH:MM:SS or {perlcode}: A


Gibt es einen Weg komplexere reguläre Ausdrücke zu verwenden? Ich habe schon mit {...} und ({...}) gespielt, brachte damit aber nichts zu Stande  :-\

Dies ist das DOIF, welches nicht funktioniert:


define di_geofancy DOIF
(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice] =~ /^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$/
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)



Viele Grüße
Julian
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: rapster am 08 November 2015, 20:30:02
Du musst statt // "" verwenden

also:

define di_geofancy DOIF
(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice] =~ "^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$"
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 20:31:16
Danke! Hatte ich auch schon probiert, funktioniert damit leider nicht...  :(
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: rapster am 08 November 2015, 20:39:46
Oha stimmt, dachte eigtl. ich hatte das mal irgendwo verwendet...

Würde es nicht reichen das so zu schreiben
define di_geofancy DOIF
(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice] =~ /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)

?

EDIT: Was allerdings hier komisch ist, "" funktioniert nicht, sondern es muss mit // geschrieben werden :)
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 November 2015, 20:44:23
Zitat von: Loredo am 08 November 2015, 20:24:50
Hallo Damian,


ich versuche gerade ein DOIF mit einem Regex zu erstellen, welches im regulären Ausdruck Klammern enthält. Diese werden aber natürlich als Zeit interpretiert, so dass ich diesen Fehler erhalte:


Wrong timespec A: either HH:MM:SS or {perlcode}: A


Gibt es einen Weg komplexere reguläre Ausdrücke zu verwenden? Ich habe schon mit {...} und ({...}) gespielt, brachte damit aber nichts zu Stande  :-\

Dies ist das DOIF, welches nicht funktioniert:


define di_geofancy DOIF
(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice] =~ /^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$/
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)



Viele Grüße
Julian

ja, bisher undokumentiert. Man kann nach etwas filtern mit Hilfe von regexp:

[?geofancy:lastDevice:[<regexp>]]

um es dann zu vergleichen. Siehe hier:

http://forum.fhem.de/index.php/topic,39302.msg348441.html#msg348441


Filtern nach Zahlen, hätte man auch so definieren können

[mein_device:mein_reading:[((\d+(\.\d+)?)*)]] eq ....

Gruß

Damian
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 20:58:29
Danke euch. \w ist leider nicht ganz das selbe (auch wenn es zur Not erstmal ginge) und die UUID besteht auch nicht nur aus Zahlen.
Eine iPhone UUID sieht z.B. so aus: F9B33ACE-3A5B-4A17-B16F-554A8D8A91AD


Einen Vergleich kann ich leider nicht machen, da mir die UUID ja eben nicht bekannt ist, sondern nur das Format.
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 21:12:02
Knoten im Hirn...

So gehts jetzt, VIELEN DANK!!


(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice:[([A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12})]] ne ""
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 November 2015, 21:31:38
Zitat von: Loredo am 08 November 2015, 21:12:02
Knoten im Hirn...

So gehts jetzt, VIELEN DANK!!


(
  [geofancy:?lastDevice] and
  [?geofancy:lastDevice:[([A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12})]] ne ""
)
(
  msg @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)


ja, aber eigentlich verstehe ich diese Konstruktion nicht, warum triggerst du nicht gleich auf die regexp, wie beim notify:
(
[geofancy:?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]
)
...


Gruß

Damian


Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 21:44:41
Das mache ich immer so, weil ansonsten auch ausgelöst wird, wenn sich ein anderes Reading ändert.
Habe ich gerade nochmal ausprobiert. Sollte zwar wohl nicht so sein, ist aber bei all meinen DOIFs sonst so.
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 November 2015, 21:48:05
Zitat von: Loredo am 08 November 2015, 21:44:41
Das mache ich immer so, weil ansonsten auch ausgelöst wird, wenn sich ein anderes Reading ändert.
Habe ich gerade nochmal ausprobiert. Sollte zwar wohl nicht so sein, ist aber bei all meinen DOIFs sonst so.

na dann so:

[geofancy:?lastDevice.[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]

das Reading ist ja ein Teil des Ausdrucks.
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 21:53:25
Nope, löst leider immer aus (wenn ich den fehlendenden Doppelpunkt ergänze)
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 November 2015, 21:58:23
Zitat von: Loredo am 08 November 2015, 21:53:25
Nope, löst leider immer aus (wenn ich den fehlendenden Doppelpunkt ergänze)

Du meinst dieser Ausdruck (mit zwei Punkten):

[geofancy:?lastDevice..[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]

ist wahr, wenn sich ein anderes Reading ändert?

Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 22:32:55
So nicht:




(
  [geofancy:?lastDevice..[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]
)
(
  msg mail @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)



Allerdings löst das DOIF dafür doppelt aus, wenn es wahr wird.
Das Device geofancy sieht so aus (siehe event-on-*):




Internals:
   DEF        geo
   NAME       geofancy
   NR         18
   STATE      id:AA53537A-B11B-4910-9182-35AAAAA461EA name:Living trig:1 date:2015-11-08T21:24:50Z lat:xx.xx long:xx.xx dev:ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
   TYPE       GEOFANCY
   CHANGETIME:
   Readings:
     2015-11-08 22:24:50   ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD arrived Living
     2015-11-08 22:24:50   currLocLat_9B33E1CE-3ABB-4A17-B16F-554A7D8F31AD xx.xx
     2015-11-08 22:24:50   currLocLong_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD xx.xx
     2015-11-08 22:24:50   currLocTime_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD 2015-11-08 22:24:50
     2015-11-08 22:24:50   currLoc_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD Living
     2015-11-08 22:24:50   lastArr         ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD Living
     2015-11-08 22:24:50   lastDevice      ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
     2015-11-08 22:24:50   state           id:AA53537A-B11B-4910-9182-35AAAAA461EA name:Living trig:1 date:2015-11-08T21:24:50Z lat:xx.xx long:xx.xx dev:ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
   Fhem:
     infix      geo
Attributes:
   DbLogExclude .*
   event-on-change-reading currLoc_.*
   event-on-update-reading lastDevice
   room       System
   verbose    0



Generell: Wie gesagt, immer wenn ich versuche den Trigger [device:?reading] mit einem Vergleich (zB ' eq "value"') zu verknüpfen, lösen auch alle anderen Readings das DOIF aus. Lasse ich [device:?reading] alleine und füge zusätzlich ein ' and [?device:reading] eq "value"' hinzu, funktioniert es wie erwartet.
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 November 2015, 22:45:54
Zitat von: Loredo am 08 November 2015, 22:32:55
So nicht:




(
  [geofancy:?lastDevice..[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]
)
(
  msg mail @geofancy -1 |Geofencing| Nicht zugeordnete UUID empfangen: [geofancy:lastDevice]
)



Allerdings löst das DOIF dafür doppelt aus, wenn es wahr wird.
Das Device geofancy sieht so aus (siehe event-on-*):




Internals:
   DEF        geo
   NAME       geofancy
   NR         18
   STATE      id:AA53537A-B11B-4910-9182-35AAAAA461EA name:Living trig:1 date:2015-11-08T21:24:50Z lat:xx.xx long:xx.xx dev:ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
   TYPE       GEOFANCY
   CHANGETIME:
   Readings:
     2015-11-08 22:24:50   ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD arrived Living
     2015-11-08 22:24:50   currLocLat_9B33E1CE-3ABB-4A17-B16F-554A7D8F31AD xx.xx
     2015-11-08 22:24:50   currLocLong_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD xx.xx
     2015-11-08 22:24:50   currLocTime_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD 2015-11-08 22:24:50
     2015-11-08 22:24:50   currLoc_ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD Living
     2015-11-08 22:24:50   lastArr         ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD Living
     2015-11-08 22:24:50   lastDevice      ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
     2015-11-08 22:24:50   state           id:AA53537A-B11B-4910-9182-35AAAAA461EA name:Living trig:1 date:2015-11-08T21:24:50Z lat:xx.xx long:xx.xx dev:ABAAA1CE-3ABB-4A17-B16F-55AAAAAF31AD
   Fhem:
     infix      geo
Attributes:
   DbLogExclude .*
   event-on-change-reading currLoc_.*
   event-on-update-reading lastDevice
   room       System
   verbose    0



Generell: Wie gesagt, immer wenn ich versuche den Trigger [device:?reading] mit einem Vergleich (zB ' eq "value"') zu verknüpfen, lösen auch alle anderen Readings das DOIF aus. Lasse ich [device:?reading] alleine und füge zusätzlich ein ' and [?device:reading] eq "value"' hinzu, funktioniert es wie erwartet.

Warum eigentlich doppelt? Naja, ist schon etwas spät. Werde es mir mal bei Gelegenheit genauer im Sourecode noch mal anschauen.

Gruß

Damian
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Loredo am 08 November 2015, 22:57:28
In diesem Fall vielleicht wegen der Mischung aus event-on-change und event-on-update, ist aber nur eine Vermutung.

Gesichert funktionieren tut es eben mit dem doppelt gemoppelten. Wäre aber sicher gut, wenn du da doch noch eine plausible Erklärung für fändest.

Gute Nacht einstweilen ;-)


Gruß
Julian
Titel: Antw:[gelöst] DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 09 November 2015, 20:53:56
Zitat von: Loredo am 08 November 2015, 22:57:28
In diesem Fall vielleicht wegen der Mischung aus event-on-change und event-on-update, ist aber nur eine Vermutung.

Gesichert funktionieren tut es eben mit dem doppelt gemoppelten. Wäre aber sicher gut, wenn du da doch noch eine plausible Erklärung für fändest.

Gute Nacht einstweilen ;-)


Gruß
Julian

Ich habe noch mal in der Source geschaut und es bei mir auch nachgestellt. Es ist eigentlich nicht möglich von zusammenhängenden Events mehrere Auslöser zu bekommen, denn sobald ein Match stattfindet wird die Schleife verlassen.

Beispiel:
Internals:
   DEF        ([zaehler:?l-]) (set FS20_000003 on-for-timer 1)
   NAME       di_test
   NR         436
   NTFY_ORDER 50-di_test
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-11-09 20:49:36   Device          zaehler
     2015-11-09 20:49:36   cmd_event       zaehler
     2015-11-09 20:49:36   cmd_nr          1
     2015-11-09 20:49:36   e_zaehler_events l-momentan: 0.3935 Aktuell: P: 0.000 L: 0.000 V: 0.425 B: 0.425 P: 6.6 L: 4.9 V: 6.4 B: 4.7 l-Bezug: 0.425 l-Lieferung: 0.000 l-Produktion: 0.000 l-Verbrauch: 0.425 z-Bezug: 2530.2621 z-Lieferung: 5211.3977 z-Produktion: 7320.1820 z-Verbrauch: 4639.0464 time: 1447098576
     2015-11-09 20:49:36   state           cmd_1
   Condition:
     0          EventDoIf('zaehler',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'l-')
   Devices:
     0           zaehler
     all         zaehler
   Do:
     0:
       0          set FS20_000003 on-for-timer 1
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev zaehler
     triggerEvents:
       l-momentan: 0.3935
       Aktuell: P: 0.000 L: 0.000 V: 0.425 B: 0.425
       P: 6.6 L: 4.9 V: 6.4 B: 4.7
       l-Bezug: 0.425
       l-Lieferung: 0.000
       l-Produktion: 0.000
       l-Verbrauch: 0.425
       z-Bezug: 2530.2621
       z-Lieferung: 5211.3977
       z-Produktion: 7320.1820
       z-Verbrauch: 4639.0464
       time: 1447098576
   Internals:
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
     all         zaehler
Attributes:
   do         always


Obwohl "l-" hier mehrfach vorkommt wird lt. log nur einmal geschaltet.

Gruß

Damian
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: JoeALLb am 08 Januar 2016, 16:13:46
Zitat von: Damian am 08 November 2015, 21:31:38
ja, aber eigentlich verstehe ich diese Konstruktion nicht, warum triggerst du nicht gleich auf die regexp, wie beim notify:
(
[geofancy:?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}]
)
...



Kann ich den Match aus dem Regex dann später verwenden, beispiensweise als $1?
Titel: Antw:DOIF: Regex mit Klammern im IF-Statement
Beitrag von: Damian am 08 Januar 2016, 17:52:31
Zitat von: JoeALLb am 08 Januar 2016, 16:13:46
Kann ich den Match aus dem Regex dann später verwenden, beispiensweise als $1?

Wo willst du $1 verwenden?