Hallo euch allen,
ich habe hier ein kleines Problem mit einem Perl-Ausdruck im einem DOIF. Ich habe hier ein DOIF mit dem ich meine geöffneten bzw. gekippten Fenster erfasse. Hier mal die Definition:
define di_Monitoring_Fenster_Tueren DOIF ([#".*TK.*":state:"open|tilted"] > 0)
(
set $SELF openWindowsCount [#".*TK.*":state:"open|tilted"],
set $SELF openWindowsState open
)
DOELSE
(
set $SELF openWindowsCount 0,
set $SELF openWindowsState closed
)
attr di_Monitoring_Fenster_Tueren do always
attr di_Monitoring_Fenster_Tueren readingList openWindowsCount openWindowsState
attr di_Monitoring_Fenster_Tueren stateFormat openWindowsState (openWindowsCount)
Meine Fensterkontakt-Devices tragen als Beispiel diese Namensgebung: EG_wz_TK_Fenster_links
Das funktioniert auch alles einwandfrei soweit. Nun habe ich mir aber noch drei structure angelegt, da ich diese für mein ASC-Modul brauche. Diese Haben die folgende Namensgebung: EG_wz_TK_Fenster_group
Hier ist nun das Problem das z.B. bei diesem Fensterkontakt zwei gezählt wird, einmal der Fensterkontakt und einmal der structure.
Wie wäre denn hier der richtige REGEX damit "group" am Ende nicht beachtet wird?
Bin für jede Hilfe dankbar, hab hier echt noch nichts gefunden was funktioniert.
Gruß Markus
[#"TK_Fenster_[^(group)]":state:"open|tilted"]
.* kann weg
Hallo Damian,
vielen Dank für die schnelle Antwort. Leider funktioniert das so nicht.
Hab gestern auch noch ganz vergessen es gibt folgende Namen für Türkontakte für die die Bedingung erfüllt sein soll (Beispiele):
DG_az_TK_Fenster_links
EG_wz_TK_Fenster_mitte
EG_ku_TK_Fenster
EG_wz_TK_Tuer
Logischerweise hatte ich deinen Code am Device EG_wz_TK_Fenster_mitte
getestet, an der Tür z.B. wäre er ja nicht gegangen.
Hab auch eben nochmal geschaut, die folgenden Devices sollen ausgeschlossen werden:
DG_az_TK_Fenster_group
EG_wz_TK_Fenster_group
OG_bz_TK_Fenster_group
Deswegen ja am einfachsten über das "_group" am Ende.
Vielleicht hast du da ja noch eine Idee, ich werde irgendwie mit dem regex kein Freund mehr ;)
Zitat von: meier81 am 19 Januar 2022, 08:30:34
Hallo Damian,
vielen Dank für die schnelle Antwort. Leider funktioniert das so nicht.
Hab gestern auch noch ganz vergessen es gibt folgende Namen für Türkontakte für die die Bedingung erfüllt sein soll (Beispiele):
DG_az_TK_Fenster_links
EG_wz_TK_Fenster_mitte
EG_ku_TK_Fenster
EG_wz_TK_Tuer
Logischerweise hatte ich deinen Code am Device EG_wz_TK_Fenster_mitte
getestet, an der Tür z.B. wäre er ja nicht gegangen.
Hab auch eben nochmal geschaut, die folgenden Devices sollen ausgeschlossen werden:
DG_az_TK_Fenster_group
EG_wz_TK_Fenster_group
OG_bz_TK_Fenster_group
Deswegen ja am einfachsten über das "_group" am Ende.
Vielleicht hast du da ja noch eine Idee, ich werde irgendwie mit dem regex kein Freund mehr ;)
Regex kann beliebig kompliziert sein, daher ist es sinnvoll sich vorher über die Vergabe der Devicenamens Gedanken zu machen - man kann sie auch im nachhinein noch anpassen.
Ansonsten hilft oft nur ausprobieren und Regex "studieren".
Vielleicht funktioniert das schon:
[#"TK_(Fenster|Tuer).?[^(group)]":state:"open|tilted"]
Zitat von: Damian am 19 Januar 2022, 10:45:24
Vielleicht funktioniert das schon:
[#"TK_(Fenster|Tuer).?[^(group)]":state:"open|tilted"]
Hallo Damian,
leider immer noch keinen Erfolg damit. Habe bestimmt 2 Stunden damit verbracht hin und her zu testen und umzustellen, kein Erfolg.
Was ich mal probiert habe, was auch geht, aber leider genau das falsche abfragt ist:
([#"TK.*(group)":state:"open|tilted"] > 0)
(
set $SELF openWindowsCount [#"TK.*(group)":state:"open|tilted"],
set $SELF openWindowsState open
)
DOELSE
(
set $SELF openWindowsCount 0,
set $SELF openWindowsState closed
)
So wird ja explizit abgefragt ob die structure sich ändert, die eigentlichen Rollo-Devices sind so außen vor. Ich habe aber schon etliches probiert um das
(group)
zu negieren, es funktioniert nichts.
Hab´s anscheinend gepackt, so scheint es zu funktionieren:
([#"TK(?!.*group)":state:"open|tilted"] > 0)
(
set $SELF openWindowsCount [#"TK(?!.*group)":state:"open|tilted"],
set $SELF openWindowsState open
)
DOELSE
(
set $SELF openWindowsCount 0,
set $SELF openWindowsState closed
)
Nach langer Suche gefunden.
Zitat von: meier81 am 19 Januar 2022, 22:26:22
Hab´s anscheinend gepackt, so scheint es zu funktionieren:
([#"TK(?!.*group)":state:"open|tilted"] > 0)
(
set $SELF openWindowsCount [#"TK(?!.*group)":state:"open|tilted"],
set $SELF openWindowsState open
)
DOELSE
(
set $SELF openWindowsCount 0,
set $SELF openWindowsState closed
)
Nach langer Suche gefunden.
schön, wenn es funktioniert, an den Regex kann man sich die Zähne ausbeißen :)