[gelöst] DOIF: Regex mit Klammern im IF-Statement

Begonnen von Loredo, 08 November 2015, 20:24:50

Vorheriges Thema - Nächstes Thema

Loredo

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
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

rapster

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]
)

Loredo

Danke! Hatte ich auch schon probiert, funktioniert damit leider nicht...  :(
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

rapster

#3
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 :)

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

#5
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.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

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]
)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

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


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

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.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

Nope, löst leider immer aus (wenn ich den fehlendenden Doppelpunkt ergänze)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

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?

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

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.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

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
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER