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
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]
)
Danke! Hatte ich auch schon probiert, funktioniert damit leider nicht... :(
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 :)
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
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.
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]
)
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
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.
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.
Nope, löst leider immer aus (wenn ich den fehlendenden Doppelpunkt ergänze)
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?
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.
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
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
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
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?
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?