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
([":.atter[a-z]+"] <= 10)
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
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)
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
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.
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