Abfrage ob $EVENT einen bestimmten Text enthält.

Begonnen von Thyraz, 10 Februar 2016, 09:54:26

Vorheriges Thema - Nächstes Thema

Thyraz

Hallo zusammen,

nach einem etwas komischen Verhalten meines DOIFs bin ich dahintergekommen,
dass ich das $EVENT selbst überprüfen muss wenn mehr als eine Bedingung wahr sein kann.

Das auslösende Device ist ein Wandschalter, welcher einen Event bringen kann für einen kurzen Tastendruck (Schaltsignal)
und ein anderes Event für das länger gedrückt halten (Dim-Up/Dim-Down Signal)
Wenn man die Taster loslässt bleiben die Readings weiter in diesem Zustand, werden also nicht auf 0 zurückgesetzt oder so...

Zu Beginn hatte ich einfach die Abfragen so drin: (([WallSwitch01:cSceneSet] == 2) bzw. (([WallSwitch01:cSceneDim] == 2)
Das Prolem war dann, dass cSceneSet immer noch 2 sein kann, obwohl das auslösende Event eigentlich sSceneDim 2 war.
Hier ist das DOIF dann in den falschen If-Zweig gesprungen.

Hab das daher nun so mit der Abfrage von $EVENT abgeändert:

(([WallSwitch01:cSceneSet]) and ("$EVENT" eq "cSceneSet: 2"))
  ## Licht an
DOELSEIF (([WallSwitch01:cSceneSet]) and ("$EVENT" eq "cSceneSet: 6"))
  ## Licht aus
DOELSEIF (([WallSwitch01:cSceneDim]) and ("$EVENT" eq "cSceneDim: 2"))
  ## Heller Dimmen
DOELSEIF (([WallSwitch01:cSceneDim]) and ("$EVENT" eq "cSceneDim: 6"))
## Dunkler Dimmen

Als Attribut ist noch "do always" gesetzt.

Das funktioniert wunderbar, aber nun will ich noch ein weiteres DOELSEIF für einen Bewegungssensor einbauen der mit on-for-timer das Licht für eine bestimmte Zeit einschaltet falls es aus ist.

Das hat nicht immer funktioniert, habe das Problem durch Loggen der $EVENT Variable jetzt aber herausgefunden:
Beim Bewegungssensor landen teilweise mehrere Werte in $EVENT (wirklich in $EVENT, nicht $EVENTS), schätze mal das ist eine Eigenheit des Geräts.

Statt "reportedState: closed" und "reportedState: open" wie ich erwartet hätte , steht hier teilweise auch "reportedState: open, temperature: 27 C"
Wie kann ich das in DOIF abfragen, ob $EVENT nun einen bestimmten Text enthält, so dass meine Abfrage nach "reportedState: closed" auch einen Treffer meldet, wenn noch ein temperature Reading oder Ähnliches mit im Text hängt?

Geht das irgendwie mit Sternchen, oder muss ich hier zu Regular Epressions wechseln?

Bin als FHEM Neuling zur Zeit dabei mich durch den PERL Kurs von SelfHTML zu kämpfen,
Regular Expressions werden da später wohl auch vermittelt, aber soweit bin ich noch nicht.

Daher überfordert mich diese (sicherlich eher einfache Übung) im Moment leider noch... ;)

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Damian

Diese Abfrage ist unnötig kompliziert:

(([WallSwitch01:cSceneSet]) and ("$EVENT" eq "cSceneSet: 2"))

Das kannst du einfacher so definieren:

([WallSwitch01:"cSceneSet: 2"])

Die anderen Abfragen kannst du entsprechend formulieren, da muss man noch nicht viel von Regex verstehen ;)

Gruß

Damian

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

Thyraz

Super, Danke. :)

Und ([WallSwitch01:"cSceneSet: 2"]) greift auch dann wenn im Event mehr als "cSceneSet: 2" steht? also z.B. "abc, cSceneSet: 2, xyz"?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Damian

Zitat von: Thyraz am 10 Februar 2016, 12:35:56
Super, Danke. :)

Und ([WallSwitch01:"cSceneSet: 2"]) greift auch dann wenn im Event mehr als "cSceneSet: 2" steht? also z.B. "abc, cSceneSet: 2, xyz"?
Zu einem Trigger können mehrere Eventzeilen dazugehören, das sieht man im Eventmonitor an der gleichen Zeit. Vor den Events steht das dazugehörige Device, bei dir stünde dann:


WallSwitch01 abc
WallSwitch01 cSceneSet: 2
WallSwitch01 abc


gesucht wird in jeder Zeile einzeln und wenn in einer Zeile ein Treffer gefunden wird, wird die Bedingung als wahr im DOIF-Modul ausgewertet.

Gruß

Damian

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