Regex für "Trigger NICHT auf..."

Begonnen von Amenophis86, 24 September 2017, 12:54:06

Vorheriges Thema - Nächstes Thema

Amenophis86

Ich habe das Fensterkontakt Beispiel in ähnlicher Form bei mir in Benutzung. Aktuell sieht der wichtige Teil so aus
([".Fenster:open|tilted"] or ["Tuer:open|tilted"])

Jetzt möchte ich aber, dass zB das Fenster "SZ.Fenster" nicht triggert. Natürlich kann ich nicht einfach schreiben
([".Fenster:open|tilted"] or ["Tuer:open|tilted"]) and [$DEVICE] ne "SZ.Fenster"
da es zwar schaut, welches Device es ist, aber ja nicht der Name, sondern das Reading verglichen wird. Daher gibt es in der DOIF Syntax etwas, was den Namen des Device beachtet, oder ein RegEx für "Nicht"? Oder muss ich im Ausführungsteil es mittels Perl lösen?

Als Vorschläge würde ich folgendes sagen, wenn es das noch nicht gibt:
Zitat["!FS"] triggert auf alle Devices, die NICHT "FS" im Namen beinhalten
["!^FS"] triggert auf alle Devices, die NICHT mit "FS" im Namen anfangen
["!FS:!temp"] triggert auf alle Devices, die NICHT "FS" im Namen und NICHT "temp" im Event beinhalten
([":!^temp"]) triggert auf beliebige Devices, die im Event NICHT mit "temp" beginnen
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Damian

Zitat von: Amenophis86 am 24 September 2017, 12:54:06
Ich habe das Fensterkontakt Beispiel in ähnlicher Form bei mir in Benutzung. Aktuell sieht der wichtige Teil so aus
([".Fenster:open|tilted"] or ["Tuer:open|tilted"])

Jetzt möchte ich aber, dass zB das Fenster "SZ.Fenster" nicht triggert. Natürlich kann ich nicht einfach schreiben
([".Fenster:open|tilted"] or ["Tuer:open|tilted"]) and [$DEVICE] ne "SZ.Fenster"
da es zwar schaut, welches Device es ist, aber ja nicht der Name, sondern das Reading verglichen wird. Daher gibt es in der DOIF Syntax etwas, was den Namen des Device beachtet, oder ein RegEx für "Nicht"? Oder muss ich im Ausführungsteil es mittels Perl lösen?

Als Vorschläge würde ich folgendes sagen, wenn es das noch nicht gibt:

Die Angaben vor bzw. nach dem Doppelpunkt sind reine Perl Regex-Angaben.

Da hat DOIF keine Karten im Spiel, daher kann ich mir da nichts ausdenken. Deine Anforderung wäre in Regex z. B. so abzubilden:

(["^([^s]+|s[^z])_Fenster:open|tilted"]...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Amenophis86

Ah, dachte die Regex kommt von dir. Alles klar.

Was ich jetzt noch nicht versteh ist, wieso dein Beispiel ein trigger von SZ.Fenster verhindert. Lese es so, dass es nur bei SZ.Fenster triggert, wenn ich es so in die Bedingung schreibe. Lese da quasi kein "nicht" raus.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Damian

Zitat von: Amenophis86 am 24 September 2017, 14:31:23
Ah, dachte die Regex kommt von dir. Alles klar.

Was ich jetzt noch nicht versteh ist, wieso dein Beispiel ein trigger von SZ.Fenster verhindert. Lese es so, dass es nur bei SZ.Fenster triggert, wenn ich es so in die Bedingung schreibe. Lese da quasi kein "nicht" raus.

ja, bei großem SZ musst du natürlich Großbuchstaben nehmen.

dann eher:

(["^([^S]+|S[^Z])_Fenster:open|tilted"]...



Regex kann beliebig kompliziert werden, ich befürchte diesen Regex-Ausdruck verstehen nur Regex-Experten. Negation von Teilstrings ist bei Regex nicht so einfach. Es ist sicherlich intuitiver nur positiv zu prüfen z. B:

["^(AZ|BZ|...)_Fenster:....
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Amenophis86

Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...