Hallo,
obwohl es inzwischen schon reichlich zu lesen zu diesem Thema gibt, komme ich nicht auf die Lösung.
Aufgabenstellung: Ein DOIF welches die Readings "battery" aller Geräte erkennt und sobald ein "low" gemeldet wird, den Zustand "low" einnimmt. Das habe ich schon mal damit hingebastelt:
([":^battery:.*low"]) ()
DOELSE ()
Hier die List der DOIF-Definition:
Internals:
CFGFN
DEF ([":^battery:.*low"]) ()
DOELSE ()
DOIFDEV ^global$|
FUUID 5e2623ed-f33f-d024-2d81-d53a739c8452e8a0
MODEL FHEM
NAME di_BatterieWarnung
NR 3650
NTFY_ORDER 50-di_HM_Batt_Warn
STATE low
TYPE DOIF
VERSION 20929 2020-01-10 09:44:35
READINGS:
2020-01-21 21:12:25 Device Test_Bat_2
2020-01-21 21:12:25 cmd 1
2020-01-21 21:12:25 cmd_event Test_Bat_2
2020-01-21 21:12:25 cmd_nr 1
2020-01-21 21:12:16 mode enabled
2020-01-21 21:12:25 state low
Regex:
accu:
cond:
:
0:
":^battery:.*low" :^battery:.*low
attr:
cmdState:
0:
low
1:
ok
wait:
waitdel:
condition:
0 ::EventDoIf('',$hash,'^battery:.*low',0)
do:
0:
0
1:
0
helper:
DEVFILTER ^global$|
NOTIFYDEV global|.*
event battery: low
globalinit 1
last_timer 0
sleeptimer -1
timerdev Test_Bat_2
timerevent battery: low
triggerDev Test_Bat_2
timerevents:
battery: low
timereventsState:
battery: low
triggerEvents:
battery: low
triggerEventsState:
battery: low
internals:
readings:
trigger:
uiState:
uiTable:
Attributes:
cmdState low|ok
do always
group Batterieüberwachung
room 000_Global
Jetzt möchte ich, dass der Zustand des DOIFs wieder auf "ok" wechselt, sobald kein battery-Reading mehr mit "low" vorhanden ist.
Ist das einfach machbar, oder muss ich da jetzt mit irgendwelchen Zählern arbeiten?
Verneinung von reinen Ereignisabfragen sind nicht sinnvoll, weil sie immer wahr sind, wenn kein Ereignis eintritt.
Besser ist es so vorzugehen: https://forum.fhem.de/index.php/topic,106749.msg1006072.html#msg1006072
Hi, danke für deine Antwort.
Meinst du den kompletten Beitrag oder diesen speziellen Post:
([18:00] and [?@"":battery:$_ ne "ok",""]) (set TelegramBot _msg Batteriewarnung am Gerät [@"":battery:$_ ne "ok",""])
Leider stehe ich voll auf dem Schlauch, einerseits wegen meiner fehlenden Regex-Lesefähigkeiten anderseits weil ich den Lösungsansatz auch nicht verstehe.
Wie soll das DOIF erkennen dass wieder alle Batterien in Ordnung sind? Mir würde es ja eigentlich auch reichen, wenn ich einmal am Tag die Batteriestände der vorhandenen Devices "abhole". Wenn ich dann eine Batterie ausgetauscht habe, dann wird das halt erst am nächsten Tag wenn der nächste tägliche Scan gemacht wurde sichtbar.
Die Königslösung wäre natürlich dass es gleich nach dem Austausch der Batterie erkannt werden würde. Ich bevorzuge jedoch lieber die einfache Lösung, die ich dann auch noch verstehe, wenn ich mal 2-3 Monate kein FHEM gemacht habe ;-)
Wie wäre es damit:
https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514
Gruß, Joachim
DOIF ([18:00] and [?@"":battery:"low",""]) (setreading $SELF Battery [@"":battery:"low",""]) DOELSE (setreading $SELF battery alle ok)
Das würde bedeuten: Schaue um 18:00 Uhr, ob im System irgend ein Device mit dem Reading battery gleich "low" existiert, wenn ja, dann schreibe in das Reading battery des DOIFs die Devices, die auf "low" sind. Der Zustand des Moduls geht in cmd_1. Wenn du die Batterien aller genannten Devices gewechselt hast, sollte am nächsten Tag um 18:00 Uhr der Zustand auf cmd_2 wechseln und im Reading battery der Text "alle ok" stehen.
Klasse, danke schön. Genau sowas habe ich gesucht! Wo kann ich jetzt nochmal nachlesen, was diese Zeichenabfolgen bedeutet?
[?@"":battery:"low",""]
Würde das gerne verstehen ;D
https://fhem.de/commandref_DE.html#DOIF_aggregation
Danke schön nochmal, fast alles verstanden. Nur das Fragezeichen vor dem @ konnte ich nicht nachvollziehen. Ist das etwas aus Perl? Und sollte es ohne Fragezeichen am Anfang nicht auch funktionieren?
Das Fragezeichen an dieser Stelle [?....], verhindert, dass das Modul durch die Angaben in den eckigen Klammern getriggert wird. Fragezeichen bedeutet reine Abfrage ohne Trigger, so steht es in der Commandref zu DOIF.
Etwas spät, aber wollte mich trotzdem nochmal für die Hilfe und die Erläuterungen bedanken. Es funktioniert alles super!