Guten Morgen,
ich teste zur Zeit folgende Anweisung:
([#max:".*BW_aussen.*:brightness",0] > 250) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness",0] > 200) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness",0] > 100) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#average:".*BW_aussen.*:brightness",255] <= 50) (setreading $SELF $DEVICE $EVENT)
DOIF bringt folgende Warnung:
condition c04: Argument "" isn't numeric in addition (+) at ./FHEM/98_DOIF.pm line 817
Und der Max- oder Durchschnittswert wird nicht berechnet.
Nutze ich
([#max:".*BW_aussen.*:brightness":d,0] > 250) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":d,0] > 200) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":d,0] > 100) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#average:".*BW_aussen.*:brightness":d,255] <= 50) (setreading $SELF $DEVICE $EVENT)
triddert das DOIF nie.
Wo ist mein Denkfehler?
laut Syntaxvorgabe:
[<function>:<format>:"<regex device>:<regex event>":<reading>|"<regex reading>":<condition>,<default>]
eher:
[#max:d:"BW_aussen:brightness":brightness,0] > 250)
Die Aggregatsfunktionen sind recht heftig, mach lieber, zumindest aus der #max, die 3x verwendet wird, ein DOIFreading.
Jetzt hab ich es auch verstanden. Danke! :)
Edit:
Übrigens wird der Ausführungsteil nur ausgeführt, wenn ich den Default-Wert weglasse.
([#max:".*BW_aussen.*:brightness":brightness,0] > 250) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":brightness,0] > 200) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":brightness,0] > 100) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#average:".*BW_aussen.*:brightness":brightness,255] <= 50) (setreading $SELF $DEVICE $EVENT)
Dann mach doch mal nen DOIFreading, da siehst du die Werte direkt, nicht erst, wenn eine Grenze überschritten ist. Dann könntest du (wenn es dann funktioniert wie du willst) auch (zumindest in deinem Fall) durch 50 teilen und runden, dann wird nicht durch jeden "Fliegenschiss" ein Event erzeugt. Letzteres wäre auch für den Durchschnitt sinnvoll, dort eigentlich noch mehr, weil da jede (!) Änderung eines Wertes eine Änderung des Durchschnitts bewirkt.
([#max:".*BW_aussen.*:brightness":brightness,0] > 250) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":brightness,0] > 200) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#max:".*BW_aussen.*:brightness":brightness,0] > 100) (setreading $SELF $DEVICE $EVENT)
DOELSEIF ([#average:".*BW_aussen.*:brightness":brightness,255] <= 50) (setreading $SELF $DEVICE $EVENT)
Soll das die funktionierende Lösung sein? Hier hast du das Format "d" weggelassen, nicht den Defaultwert.
Die Definition über DOIF_Readings, wie von Per vorgeschlagen, würde ich dir ebenfalls empfehlen - das ist nicht nur übersichtlicher, sondern spart Performance.
attr deindoif DOIF_Readings max:[#max:".*BW_aussen.*:brightness":brightness,0]
Und dann
([$SELF:max] > 250) (setreading $SELF $DEVICE $EVENT)...
Vielen Dank, Per und Damian, damit werde ich weiter probieren. DOIF hat sich doch erheblich weiterentwickelt, seitdem ich mich etwas mehr damit auseinander gesetzt habe ???