DOIF - Regex im Bedingungsteil

Begonnen von Tsadan, 07 Januar 2024, 17:14:35

Vorheriges Thema - Nächstes Thema

Tsadan

Hallo,

ich habe ein kleines Problem mit meine DOIF für die Batteriestandswarnung.
Mein funktionierendes DOIF sieht so aus:
Internals:
   DEF        ([".*:[Bb]attery",0] <= "10") {::Signal("Markus","<b>Batteriestandswarnung</b> $DEVICE - $EVENT %<br><b>Bitte ersetzen !</b>")}
DOELSE ()
   FUUID      62458bb7-f33f-9996-bb53-c3599b47f39e03d8
   MODEL      FHEM
   NAME       DI_BattWarning
   NOTIFYDEV  .*(.*).*,global
   NR         182
   NTFY_ORDER 50-DI_BattWarning
   STATE      cmd_2
   TYPE       DOIF
   VERSION    27740 2023-07-10 09:31:11
   eventCount 12980
   READINGS:
     2024-01-07 17:06:10   Device          1OG_RC_Bad
     2024-01-07 17:06:10   cmd             2
     2024-01-07 17:06:10   cmd_event       1OG_RC_Bad
     2024-01-07 17:06:10   cmd_nr          2
     2024-01-07 17:04:51   mode            enabled
     2024-01-07 17:06:10   state           cmd_2
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       :
         0:
           ".*:[Bb]attery" .*:[Bb]attery
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('.*',$hash,'[Bb]attery',0,'[^\:]*: (.*)','','0') <= "10"
   devices:
   do:
     0:
       0          {::Signal("Markus","<b>Batteriestandswarnung</b> $DEVICE - $EVENT %<br><b>Bitte ersetzen !</b>")}
     1:
       0         
   helper:
     NOTIFYDEV  .*(.*).*,global
     event      battery: 47
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   1OG_RC_Bad
     timerevent battery: 47
     triggerDev 1OG_RC_Bad
     timerevents:
       battery: 47
       batteryPercent: 47
       reachable: 1
       lastseen: 2024-01-07T16:05Z
     timereventsState:
       battery: 47
       batteryPercent: 47
       reachable: 1
       lastseen: 2024-01-07T16:05Z
     triggerEvents:
       battery: 47
       batteryPercent: 47
       reachable: 1
       lastseen: 2024-01-07T16:05Z
     triggerEventsState:
       battery: 47
       batteryPercent: 47
       reachable: 1
       lastseen: 2024-01-07T16:05Z
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       FHEM->DOIF

Ich habe seit Heute ein Gerät eingebunden, welches auch das Reading "batteryState" mit dem Wert "ok" enthält. Mein DOIF feuert nun jedes mal eine Batteriestandswarnung für das neue Gerät, wenn sich dessen Status ändert. Ich hatte nun die Idee, wie in der Commandref unter "Ereignissteuerung über Auswertung von Events" beschrieben, den Trigger des DOIF von
([".*:[Bb]attery",0] <= "10")
in
([".*:[Bb]attery$",0] <= "10")
zu ändern, damit nur noch Events, die auf [Bb]attery enden ausgewertet werden. Leider funktioniert das DOIF dann für gar kein Gerät mehr.
Mache ich da einen Denkfehler ? Hat jemand einen Tipp ?

Vielen Dank
Tsadan

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tsadan

Danke betateilchen, für deinen Tipp !

Leider habe ich damit das gleiche Resultat, wie bei meinem String.

In der Referenz für DOIF steht ja dieser Block:
ZitatBeispiele für Regex-Angaben:

["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

Dort wird ja mit [:^temp"] "fast" beschrieben, was ich erreichen möchte, nur eben "beginnt mit..." an Stelle von "endet mit...".
Aus welchem Grund wird denn das "$" als Synonym für "endet mit" bei ([".*:[Bb]attery$",0] <= "10") nicht entsprechend erkannt, oder wo liegt mein Denkfehler ?

Bin leider echt kein Perl-Experte, versuche es aber schon zu verstehen...

Gruß
Tsadan

betateilchen

Den Text in der commandref hatte ich auch gelesen und ich glaube, dass da eine gewisse Unschärfe drinsteckt, wenn es darum geht, ob das device oder das reading gemeint ist.

Dass das $ nicht so wie erwartet funktioniert, hatte ich gestern aufgrund Deiner Frage auch festgestellt, als ich das spaßeshalber getestet hatte. Aber die von mir vorgeschlagene regex hat funktioniert. Sie hat den Ausführungsteil nur bei "battery" aufgerufen, aber nicht bei "batteryState".

Warum das $ nicht funktioniert, kann Dir nur der Modulautor beantworten. Dafür müsstest Du aber den Thread mit dem Button unten links am besten in das Unterforum zu DOIF verschieben.

Grundsätzlich interessiert mich DOIF nicht wirklich, in meinen Installationen kommen keine DOIF vor.
Alles, was man mit DOIF machen kann, geht auch mit den echten "core-types" notify und/oder at, ggf. auch in Kombination.

Mit FHEM arbeite ich schon seit einer Zeit, als es DOIF noch gar nicht gab 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tsadan

Verstehe  ;)

Trotzdem Danke für's probieren. Ich fuchse mich da weiter durch. Irgendwie bekomme ich das schon hin.
Notfalls mit mehreren Zeilen von Bedingungen.

LG
Tsadan

Damian

Welches Events sollen das sein, die mit Battery enden?

Normalerweise gehört zum Event: das Device, ein Reading und der dazugehörige Wert, den du ja auch auswerten willst.

Daher macht es keinen Sinn nach Events zu triggern, die mit Battery enden und erst recht nicht, wenn man den Wert dahinter auswerten will.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tsadan

Au weia, na klar  :-[
Da hatte ich irgendwie ein Brett vor'm Kopf. Ich wollte auf ein Reading filtern, welches mit "[Bb]attery" endet und davon den Wert vergleichen.
Das macht natürlich so gar keinen Sinn, wie ich es gemacht habe.

Letztlich habe ich nun doch endlich den String gefunden, der tut, was ich möchte:
([".*:[Bb]attery:",0] <= "10")

Danke für Eure Antworten !

LG
Tsadan