FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Ralli am 16 August 2018, 10:16:00

Titel: Aggregieren von Werten
Beitrag von: Ralli am 16 August 2018, 10:16:00
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?
Titel: Antw:Aggregieren von Werten
Beitrag von: Damian am 16 August 2018, 10:57:04
laut Syntaxvorgabe:

[<function>:<format>:"<regex device>:<regex event>":<reading>|"<regex reading>":<condition>,<default>]

eher:

[#max:d:"BW_aussen:brightness":brightness,0] > 250)
Titel: Antw:Aggregieren von Werten
Beitrag von: Per am 16 August 2018, 12:17:19
Die Aggregatsfunktionen sind recht heftig, mach lieber, zumindest aus der #max, die 3x verwendet wird, ein DOIFreading.
Titel: Antw:Aggregieren von Werten
Beitrag von: Ralli am 17 August 2018, 07:00:26
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)
Titel: Antw:Aggregieren von Werten
Beitrag von: Per am 17 August 2018, 11:16:02
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.
Titel: Antw:Aggregieren von Werten
Beitrag von: Damian am 17 August 2018, 11:40:49

([#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)...
Titel: Antw:Aggregieren von Werten
Beitrag von: Ralli am 17 August 2018, 20:00:19
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  ???