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!
Zwei Sachen:
a: 60%, wenn das "%" mitgeliefert wird, solltest du es rausfiltern (":d")
b: or vor and? Ansonsten Klammern setzen.
Laut https://forum.fhem.de/index.php/topic,69598.msg684114.html#msg684114 (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