[gelöst] DOIF triggert nicht bei Auswertung mehrerer Devices mit Regex

Begonnen von Romoker, 08 Juli 2021, 11:40:46

Vorheriges Thema - Nächstes Thema

Romoker

Ich habe mehrere Temperatursensoren. Das DOIF soll bei einer Temperaturüberschreitung eine Nachricht schreiben. Bei Anwendung der Syntax ["<device regex>:<event regex>"] löst das DOIF nicht aus. Definiere ich explizit das device:reading, dann wird das DOIF ausgelöst.
Hier das nicht funktionioerende DOIF mit regex:
defmod di_tempGuard DOIF {if (["^GPIO_:^temperature"] > 30) {
  my $msg = "DOIF: Achtung: Temperaturüberschreitung $event in $device";
  Log 3, "$msg"
}}


Hier das funktionierende DOIF:
defmod di_tempGuard DOIF {if ([GPIO_TempSolarRuecklauf:temperature] > 30) {
  my $msg = "DOIF: Achtung: Temperaturüberschreitung $event in $device";
  Log 3, "$msg"
}}


Habe ich da irgendetwas in der 1. Definition übersehen oder ist das ein DOIF-Fehler?

Viele Grüße
BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

Damian

Hier die passende Stelle aus der commandref: https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

Syntax:

["regex for trigger",<default value>]

Anwendungsbeispiel:

define di_warning DOIF ([":^temperature",0]< 0) (set pushmsg danger of frost $DEVICE)
attr di_warning do always

Perl-Modus:
define di_warning DOIF {if ([":^temperature",0]< 0) {fhem_set"pushmsg danger of frost $DEVICE}}

Damit wird auf alle Devices getriggert, die mit "temperature" im Event beginnen. Zurückgeliefert wird der Wert, der im Event hinter "temperature: " steht. Wenn kein Event stattfindet, wird der Defaultwert, hier 0, zurückgeliefert.
Ebenfalls kann ein Ereignisfilter mit Ausgabeformatierung angegeben werden.

Syntax:

["regex for trigger":"<regex filter>":<output>,<default value>]

Regex-Filter- und Output-Parameter sind optional. Der Default-Wert ist verpflichtend.

Die Angaben zum Filter und Output funktionieren, wie die beim Reading-Filter. Siehe: Filtern nach Ausdrücken mit Ausgabeformatierung

Wenn kein Filter, wie obigen Beispiel, angegeben wird, so wird intern folgende Regex vorbelegt: "[^\:]*: (.*)" Damit wird der Wert hinter der Readingangabe genommen. Durch eigene Regex-Filter-Angaben kann man beliebige Teile des Events herausfiltern, ggf. über Output formatieren und in der Bedingung entsprechend auswerten, ohne auf Readings zurückgreifen zu müssen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Romoker

Hallo Damian, danke für die schnelle Antwort. Ich möchte nicht alle Devices mit temperature Event,  sondern nur Bestimmte abfragen. Deshalb habe ich auf die Devices auch eine Regex angewandt.
Aber um bei Deinem Beispiel zu bleiben. Demnach müsste die Definition
if ([":^temperature"] > 30)
auf jeden Fall Egebnisse liefern. Das ist aber nicht der Fall. Das DOIF reagiert nicht. Auch mit verbose 5 keine Log-Einträge.
Hier zur Kontrolle der Output vom Eventmonitor:
2021-07-08 13:26:10.390 GPIO4 GPIO_TempDachboden temperature: 26.475
2021-07-08 13:26:18.971 GPIO4 GPIO_TempWarmwasserSpeicher temperature: 45.187
2021-07-08 13:26:21.576 GPIO4 GPIO_TempSolarVorlauf temperature: 51.75


Ich sehe immer noch nicht meinen Fehler.

Viele Grüße
BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

Otto123

ZitatRegex-Filter- und Output-Parameter sind optional. Der Default-Wert ist verpflichtend.
;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Das ist der entscheidende Satz, den habe leider nicht mit kopiert: Allgemeine Ereignistrigger können ebenfalls so definiert werden, dass sie nicht nur wahr zum Triggerzeitpunkt und sonst nicht wahr sind, sondern Inhalte des Ereignisses zurückliefern. Initiiert wird dieses Verhalten durch die Angabe eines Default-Wertes.

Also: DOIF ([":^temperature",0] > 30)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Romoker

Danke Otto und Damian, das ist die Lösung. Ich hatte mich in der Commandref an
Sollen Events verschiedener Devices ausgewertet werden, so lässt sich folgende Syntax anwenden: ["<device regex>:<event regex>"]
orientiert.
Dass die Regex-Definitionen nur mit einem Output-Defaultwert funktioniert, war für mich nicht offensichtlich.

Viele Grüße
BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

Damian

Zitat von: Romoker am 08 Juli 2021, 15:01:13
Danke Otto und Damian, das ist die Lösung. Ich hatte mich in der Commandref an
Sollen Events verschiedener Devices ausgewertet werden, so lässt sich folgende Syntax anwenden: ["<device regex>:<event regex>"]
orientiert.
Dass die Regex-Definitionen nur mit einem Output-Defaultwert funktioniert, war für mich nicht offensichtlich.

Viele Grüße

Die Regex-Definition funktioniert auch ohne Defaultwert, allerdings liefert sie keinen Wert, den man vergleichen kann, sondern nur die Information wahr oder nicht wahr.

DOIF ([":^temperature"]) ...

triggert auch beim passenden Ereignis, liefert nur keine Temperatur.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF