[Gelöst] Hilfe bei Perl-Ausdruck (enthält nicht xyz am Ende) im DOIF

Begonnen von meier81, 18 Januar 2022, 21:47:41

Vorheriges Thema - Nächstes Thema

meier81

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
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Damian

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

meier81

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  ;)
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Damian

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

meier81

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.
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

meier81

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.
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Damian

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