DOIF Aggregation von Zahl und Text aus battery reading ($_ und $number)

Begonnen von bhaal, 01 Januar 2021, 14:20:11

Vorheriges Thema - Nächstes Thema

bhaal

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

xenos1984

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.

Damian

Zitat von: xenos1984 am 01 Januar 2021, 15:24:55
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.

Würde ich auch so sehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bhaal

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.

bhaal

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...  ???