Hallo zusammen,
zunächst noch ein gutes neues Jahr für euch!
Ich hänge seit einigen Tagen an einem DOIF für die Batterieüberwachung (ja... im Prinzip nichts Neues). Bisher hat das DOIF wunderbar funktioniert, jetzt sind jedoch Aqara Sensoren dazugekommen, welche als battery reading einen Zahlenwert [0-100] ausgeben (ohne %). Ich möchte nur wissen, ob die Anzahl an Devices, welche "leere" Batterien haben >0 ist (dann MQTT Nachricht an Statusdisplay). Getriggert wird auf alle Events, die battery enthalten, anschließend soll das reading battery ausgewertet werden ([#":battery":battery:$_ ... habe ich auch schon ausprobiert).
Funktioniert bisher (cmd1 bei leerer Batterie, cmd2 bei voller Batterie; keine Reaktion auf Aqara Sensoren):
([#":battery":"battery$":$_ =~ "low"] > 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery on)
DOELSEIF ([#":battery":"battery$":$_ =~ "low"] == 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery off)
Funktioniert bisher nicht (es wird immer cmd1 ausgelöst, auch wenn der Aqara Sensor 100 meldet. cmd1 wird aber auch durch die "alten" Devices ausgelöst [list mit auslösendem Event ganz unten]):
[/list]
([#":battery":"battery$":$_ =~ "low" or $number < 30] > 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery on)
DOELSEIF ([#":battery":"battery$":$_ =~ "low" or $number < 30] == 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery off)
D.h. auch eine Abfrage nur über $number funktioniert nicht (wird durch Sensoren getriggert die melden: battery: ok und springt dann in cmd1):
([#":battery":"battery$":$number < 30] > 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery on)
DOELSEIF ([#":battery":"battery$":$number < 30] == 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery off)
List der letzten Variante (im Event sind mehrere Readings vorhanden, ist das das Problem?):
Internals:
DEF ([#":battery":"battery$":$number < 30] > 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery on)
DOELSEIF ([#":battery":"battery$":$number < 30] == 0) (set MQTT2_SERVER publish -r fhem/status/alarm/battery off)
DOIFDEV ^global$|
FUUID 5e1b54f4-f33f-eb91-a055-58339cd352c2c57f
MODEL FHEM
NAME doif_Batterieueberwachung
NR 360
NTFY_ORDER 50-doif_Batterieueberwachung
STATE cmd_1
TYPE DOIF
VERSION 23403 2020-12-22 15:43:36
READINGS:
2021-01-01 14:10:36 Device SZ.Heizung
2021-01-01 14:10:36 cmd 1
2021-01-01 14:10:36 cmd_event SZ.Heizung
2021-01-01 14:10:36 cmd_nr 1
2021-01-01 14:07:02 mode enabled
2021-01-01 14:10:36 state cmd_1
Regex:
accu:
cond:
:
0:
":battery" :battery
1:
":battery" :battery
attr:
cmdState:
wait:
waitdel:
condition:
0 ::AggregateDoIf($hash,'#','','"battery$"','$number < 30') > 0
1 ::AggregateDoIf($hash,'#','','"battery$"','$number < 30') == 0
do:
0:
0 set MQTT2_SERVER publish -r fhem/status/alarm/battery on
1:
0 set MQTT2_SERVER publish -r fhem/status/alarm/battery off
2:
helper:
DEVFILTER ^global$|
NOTIFYDEV global|.*
event battery: ok,batteryLevel: 2.4,desired-temp: 18.5,motorErr: ok
globalinit 1
last_timer 0
sleeptimer -1
timerdev SZ.Heizung
timerevent battery: ok,batteryLevel: 2.4,desired-temp: 18.5,motorErr: ok
triggerDev SZ.Heizung
timerevents:
battery: ok
batteryLevel: 2.4
desired-temp: 18.5
motorErr: ok
timereventsState:
battery: ok
batteryLevel: 2.4
desired-temp: 18.5
motorErr: ok
triggerEvents:
battery: ok
batteryLevel: 2.4
desired-temp: 18.5
motorErr: ok
triggerEventsState:
battery: ok
batteryLevel: 2.4
desired-temp: 18.5
motorErr: ok
internals:
readings:
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
do always
room Logging
Von Damian hatte ich hier https://forum.fhem.de/index.php/topic,70624.0/all.html (https://forum.fhem.de/index.php/topic,70624.0/all.html) diesen Hinweis gefunden und versucht das anzuwenden:
Zitat von: Damian am 23 April 2017, 20:16:53
so etwas sollte so funktionieren
[@"",state,$_ =~ "open|tilt" or $number != 0]
Habt ihr einen Hinweis für mich? :-[ Irgendwie scheine ich das mit $number nicht richtig zu verwenden, da die letzte Variante nicht das macht, was ich erwartet hätte.
Viele Grüße
Max
Ich schätze mal, wenn ein Sensor "ok" liefert, was ja keine Zahl ist, wird das als $number = 0 gelesen, und das ist eben kleiner als 30.
Vielen Dank, daran habe ich nicht gedacht. Dann sollte so etwas funktionieren?
([#":battery":"battery$":$_ =~ "low" or ($number < 30 and $number > 1)] > 0) (...)
Das teste ich mal.
Also an der 0 oder 1 lag es nicht... Ich muss >3 einstellen, damit es funktioniert (getestet mit einem Dummy und Reading battery).
([#":battery":"battery$":$_ =~ "low" or ($number < 30 and $number > 3)] > 0)
(set MQTT2_SERVER publish -r fhem/status/alarm/battery on)
DOELSEIF ([#":battery":"battery$":$_ =~ "low" or ($number < 30 and $number > 3)] == 0)
(set MQTT2_SERVER publish -r fhem/status/alarm/battery off)
Prinzipiell scheint es also zu funktionieren, nur verstehe ich es nicht... ???