Hauptmenü

[Gelöst] DOIF mit Regex?

Begonnen von borsTiHD, 28 Dezember 2017, 11:17:33

Vorheriges Thema - Nächstes Thema

borsTiHD

Hallo zusammen,

ich versuche mich gerade an einer einfachen DOIF Definition um meine Fenstekontakte zu prüfen.  :D
Für mich dann letzendlich doch nicht so einfach.  ::)

Mein DOIF soll "alle" meine Fensterkontakte prüfen und beim Status open/closed jeweils eine Nachricht über Telegramm verschicken.
Trage ich in die Bedingung den Namen "eines" Kontaktes fest ein, funktioniert es wunderbar:

(aus der DEF):
([HM_399D59] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF ([HM_399D59] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)


Versuche ich das ganze jetzt mit einem Regulären Ausdruck nach ["HM_"], ["HM"], oder ["^HM"] passiert nichts.
(Zb. wieder aus der DEF):
(["^HM"] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["^HM"] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)



Die Ausdrücke habe ich aus der Comandref:

["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten
["^FS"] triggert auf alle Devices, die mit "FS" im Namen anfangen
["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
[""] triggert auf alles


Ich bin jetzt schon seit über einer Stunde am Suchen und finde meinen Fehler nicht.
Könnt ihr mir bitte helfen?

Eine weitere Frage... gibt es eine komfortable Lösung in meiner Telegramm Nachricht den Raum mitzuliefern?
Sowas wie $ROOM? Hab nichts in die Richtung gefunden.
Wäre nämlich schöner als wenn ich nur den Device Name ala "HM_399D59" gesendet bekäme.

Vielen Dank schonmal.  ;D


Internals:
   CFGFN     
   DEF        ([HM_399D59] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF ([HM_399D59] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
   NAME       doif_Fensterkontakt
   NR         972
   NTFY_ORDER 50-doif_Fensterkontakt
   STATE      cmd_2
   TYPE       DOIF
   Helper:
     DBLOG:
       cmd:
         DBLogging:
           TIME       1514454169.64044
           VALUE      0
       state:
         DBLogging:
           TIME       1514454169.64044
           VALUE      initialized
   READINGS:
     2017-12-28 11:03:06   Device          HM_399D59
     2017-12-28 11:03:06   cmd             2
     2017-12-28 11:03:06   cmd_event       HM_399D59
     2017-12-28 11:03:06   cmd_nr          2
     2017-12-28 11:03:06   e_HM_399D59_STATE closed
     2017-12-28 11:03:06   error           closed: Unknown command closed, try help. trigger_cnt: 31: Unknown command trigger_cnt:, try help.
     2017-12-28 11:03:06   state           cmd_2
   Regex:
   condition:
     0          InternalDoIf($hash,'HM_399D59','STATE') eq "open"
     1          InternalDoIf($hash,'HM_399D59','STATE') eq "closed"
   devices:
     0           HM_399D59
     1           HM_399D59
     all         HM_399D59
   do:
     0:
       0          set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT
     1:
       0          set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT
     2:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      contact: closed (to VCCU),closed,trigger_cnt: 31
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   HM_399D59
     timerevent contact: closed (to VCCU),closed,trigger_cnt: 31
     triggerDev HM_399D59
     timerevents:
       contact: closed (to VCCU)
       closed
       trigger_cnt: 31
     timereventsState:
       contact: closed (to VCCU)
       state: closed
       trigger_cnt: 31
     triggerEvents:
       contact: closed (to VCCU)
       closed
       trigger_cnt: 31
     triggerEventsState:
       contact: closed (to VCCU)
       state: closed
       trigger_cnt: 31
   internals:
     0           HM_399D59:STATE
     1           HM_399D59:STATE
     all         HM_399D59:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   do         always



Grüße
borsTiHD

Supadone

#1
Servus

Zwecks deinem Problem mit der Raumbezeichnung, ich würde die Devices einfach umbennen.  Also zum Beispiel
rename HM_399D59 Schlafzimmer.Fenster

Wenn du dann alle umbenannt hast müsste das Doif so funktionieren:
(["Fenster:state"] eq "open")
    (set TelegramBot message @1234 $DEVICE ist offen)
DOELSEIF (["Fenster:state"] eq "closed")
    (set TelegramBot message @1234 $DEVICE ist geschlossen)


Grüße

borsTiHD

#2
Vielen Dank für deine Hilfe. :)
Aber hat leider nicht geklappt.

Das umbennen war aber schonmal hilfreich.
Eigentlich wollten ich den festen Namen treu bleiben, die die Geräte bezeichnen, aber so passt das trotzdem besser.

Folgende hab ich probiert:

(["Fenster:state"] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["Fenster:state"] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)


(["Fensterkontakt"] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["Fensterkontakt"] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)


(["Fensterkontakt" eq "open"])
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["Fensterkontakt" eq "closed"])
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)



Eventmonitor liefert nur das hier bezüglich dieser Geräte und dem DOIF:
2017-12-29 09:54:46 CUL_HM Balkon.Fensterkontakt contact: open (to VCCU)
2017-12-29 09:54:46 CUL_HM Balkon.Fensterkontakt open
2017-12-29 09:54:46 CUL_HM Balkon.Fensterkontakt trigger_cnt: 40
2017-12-29 09:54:51 CUL_HM Balkon.Fensterkontakt contact: closed (to VCCU)
2017-12-29 09:54:51 CUL_HM Balkon.Fensterkontakt closed
2017-12-29 09:54:51 CUL_HM Balkon.Fensterkontakt trigger_cnt: 41



€dit:
Ok, einen Hinweis hab ich noch.  ???

Funktioniert, ist der exakte Name meines Devices:
([Balkon.Fensterkontakt] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF ([Balkon.Fensterkontakt] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)


Funktioniert nicht, trotz exakten Namen, aber mit den "".
(["Balkon.Fensterkontakt"] eq "open")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["Balkon.Fensterkontakt"] eq "closed")
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)


Mache ich irgendwas mit den Anführungszeichen falsch?!

Supadone

#3
So, jetzt hab ich das ganze mal ausgeschlafen getestet  ;)
Bei mir funktioniert
(["Fenster:open"])
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)
DOELSEIF (["Fenster:closed"])
    (set TelegramBot message 🏠 Fensterkontakt: $DEVICE ist $EVENT)

borsTiHD

Hey ja, super, so gehts.  ;D
Tausend dank.

Aber trotzdem würde ich gerne wissen wieso das nur auf diese Art funktioniert und nicht auf die andere?!
Ich hatte zwischenzeitlich alls weiter recherchiert, gegoogelt, das Forum auf den Kopf gestellt usw... aber nicht wirklich was gefunden das meine Verwirrung hier erklärt.
Liegt das daran, das ich dauernd mit "equal" in Verbindung mit einem RegEx probierte? Denn das "equal" scheint ja ansich zu klappen, sofern ich für mein Device keine Platzhalter nutze.

Ich würde es gerne verstehen können.  :-\

Supadone

#5
Sehr gut :)

Warum das mit eq nicht funktioniert bin ich ehrlich gesagt nicht ganz sicher. Der Unterschied ist meines Wissens nach dass bei
(["Fensterkontakt"] eq "open")der Status des Device ausgewertet wird und bei (["Fenster:open"]) das Event.

Aber vielleicht kann jemand anderes hier noch mehr dazu sagen ;)

Edit:
In der commandref ist Regex auch nur bei der Eventauswertung ein Thema

Damian

Es ist ganz einfach:

Sobald man etwas in Anführungszeichen setzt, fragt man Events ab und nicht Zustände:

Eventauswertung (wahr/nicht wahr):

["Fensterkontakt"] so etwas ist Regex auf Devices von Events und kann nur wahr oder nicht wahr sein.
[Fensterkontakt:"bla"] das ist ebenfalls Regex diesmal von Events vom Device Fensterkontakt, diese kann nur wahr oder nicht wahr sein

Status/Readingabfragen (Inhalt von Status/Reading, Abfragen mit Operatoren wie eq sind sinnvoll):

[Fensterkontakt] so etwas  ist eine Statusabfrage des Devices Fensterkontakt.
[Fensterkontakt:bla] damit wird das Reading bla des Devices Fensterkontakt abgefragt.

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

Supadone

Wenn mans so liest ist es ja wirklich ganz einfach, danke :)

borsTiHD

#8
Ah ok, ich glaube ich hab es vorsichtig verstanden.
Es gibt aufjedenfall zwei Möglichkeiten abzufragen.

Einmal nach dem Event und prüfe ob es wahr oder nicht wahr ist.
- Hier kann ich auch nach einer Regex für ein Devices, oder auch Status abfragen, sofern es in einem Event vorkommt.

Einmal nach dem Status, bzw einem Reading.
- Hier kann ich dann nur von einem festen Device einen Status abfragen?

Heißt das, bei der zweiten Variante, wenn ich einen Status abfrage, kann ich das also auch ohne das ein Event ausgelöst wurde?
Aber das heißt auch, das ich bei der zweiten Variante nicht mehrere Device gleichzeitig abfragen kann, sondern immer nur eins (außer, ich denke mal, ich kombiniere die Abfrage mit einem "und, oder, etc")?