Hauptmenü

mal wieder battery-reading

Begonnen von mike.d, 20 August 2018, 23:15:40

Vorheriges Thema - Nächstes Thema

mike.d

Hallo zusammen,

ich weiß, dass das Thema schon oft durchgekaut wurde, aber ich komme auch mit viel lesen nicht voran. Ich habe folgendes DOIF definiert:


Internals:
   DEF        (
  ([":^[Bb]attery.*[Ll]ow"] or
  ([":^[Bb]attery"] < 60 and [?$DEVICE:&TYPE] eq "HUEDevice")) and
  [?$SELF:$DEVICE,"init"] ne "low"
)
(
  setreading $SELF msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},
  setreading $SELF $DEVICE low,
  ({Log 3, "$DEVICE Batterie leer"}),
  set pushmsg msg 'FHEM Batteriewarnung' '$DEVICE:\nBatterien sollten demnächst gewechselt werden!' 'mike' 0 ' '
)
DOELSEIF
(
  ([":^[Bb]attery.*ok"] or
  ([":^[Bb]attery"] > 60 and [?$DEVICE:&TYPE] eq "HUEDevice")) and
  [?$SELF:$DEVICE,"init"] ne "ok"
)
(
  setreading $SELF $DEVICE ok,
  setreading $SELF msg -
)
   MODEL      FHEM
   NAME       di_Batteriewarnung
   NR         737
   NTFY_ORDER 50-di_Batteriewarnung
   STATE      initialized
   TYPE       DOIF
   OLDREADINGS:
   READINGS:
     2018-08-20 20:13:53   K.Temperatur    ok
     2018-08-20 20:36:19   S.Balkon        ok
     2018-08-20 20:33:25   S.Heizung       ok
     2018-08-20 22:04:23   S.Sensor.Feuchte low
     2018-08-20 21:49:51   S.Sensor.Temperatur low
     2018-08-20 21:47:14   WZ.Thermometer  ok
     2018-08-20 21:48:50   WZ.cube         low
     2018-08-20 23:11:17   cmd             0
     2018-08-20 23:11:17   mode            enabled
     2018-08-20 22:04:23   msg             S.Sensor.Feuchte Batterie leer
     2018-08-20 23:11:17   state           initialized
   Regex:
     cond:
       :
         0:
           ":^[Bb]attery" :^[Bb]attery
           ":^[Bb]attery.*[Ll]ow" :^[Bb]attery.*[Ll]ow
         1:
           ":^[Bb]attery" :^[Bb]attery
           ":^[Bb]attery.*ok" :^[Bb]attery.*ok
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0             (EventDoIf('',$hash,'^[Bb]attery.*[Ll]ow',0) or    (EventDoIf('',$hash,'^[Bb]attery',0) < 60 and InternalDoIf($hash,'$DEVICE','TYPE') eq "HUEDevice")) and   ReadingValDoIf($hash,'di_Batteriewarnung','$DEVICE','"init"') ne "low" 
     1              (EventDoIf('',$hash,'^[Bb]attery.*ok',0) or    (EventDoIf('',$hash,'^[Bb]attery',0) > 60 and InternalDoIf($hash,'$DEVICE','TYPE') eq "HUEDevice")) and   ReadingValDoIf($hash,'di_Batteriewarnung','$DEVICE','"init"') ne "ok" 
   devices:
   do:
     0:
       0              setreading di_Batteriewarnung msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Batterie leer")},   setreading di_Batteriewarnung $DEVICE low,   ({Log 3, "$DEVICE Batterie leer"}),    set pushmsg msg 'FHEM Batteriewarnung' '$DEVICE:\nBatterien sollten demnächst gewechselt werden!' 'mike' 0 ' '
     1:
       0              setreading di_Batteriewarnung $DEVICE ok,    setreading di_Batteriewarnung msg - 
     2:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     0           $DEVICE:TYPE
     1           $DEVICE:TYPE
     all         $DEVICE:TYPE $DEVICE:TYPE
   itimer:
   uiState:
   uiTable:
Attributes:
   disable    0
   do         always
   msg        -
   room       System
   userattr   msg


wie man schon sieht, wertet er einige meiner Devices als "Low". Und zwar alle Devices, die ihre Batterieladung in Prozent angeben. Zum Beispiel:

Internals:
   DEF        sensor 5  IODev=deCONZ
   ID         S5
   INTERVAL   
   IODev      deCONZ
   NAME       S.Sensor.Feuchte
   NR         734
   STATE      54  %
   TYPE       HUEDevice
   lastupdated 2018-08-20 23:01:35
   manufacturername LUMI
   modelid    lumi.weather
   name       S.Temperatur
   on         1
   reachable  1
   type       ZHAHumidity
   uniqueid   00:15:8d:00:02:47:e8:65-01-0405
   READINGS:
     2018-08-20 23:01:36   battery         100
     2018-08-20 23:01:35   humidity        53.64
     2018-08-20 23:01:36   reachable       1
   helper:
     devtype    S
     reachable  0
     update_timeout 1
     setList:
Attributes:
   IODev      deCONZ
   event-on-change-reading humidity
   event-on-update-reading battery
   stateFormat {sprintf("%.0f", ReadingsVal($name,"humidity",0))."  %"}


ich verstehe nur leider wirklich nicht was an meiner DOIF-Definition falsch ist.
Kann mich jemand in die richtige Richtung schubsen!?

Vielen Dank schonmal im Voraus!

Per

Zwei Sachen:
a: 60%, wenn das "%" mitgeliefert wird, solltest du es rausfiltern (":d")
b: or vor and? Ansonsten Klammern setzen.

tomspatz

Laut https://forum.fhem.de/index.php/topic,69598.msg684114.html#msg684114

funktioniert das :d nicht, dafür allerding der dort genannte regex Filter:
[":^[Bb]attery":"[^\:]*: (-?\d+(\.\d+)?)",999]

LG
Tom