Hallo Zusammen,
Für meine Bewässerung habe ich acht Ventile, und möchte wegen des Wasserdrucks immer nur einen Kreis laufen lassen - i.e. wenn ich einen Kreis anschalte, sollen alle Anderen sicher aus sein - auch bei manuellem Einschalten.
Das will ich mit einem DOIF und einer Aggregation im Befehlsteil lösen - "Wenn eines der Ventile auf on geht, setzte alle Ventile bis auf das auslösende Ventil auf off"
(["doif_test.:on"]) (set [@"doif_test." ne $DEVICE] off)
Allerdings klappt die Aggregation nicht - der Vergleich der erzeugten Liste mit @ mit dem Wert $DEVICE klappt nicht.
Ebenso funktioniert das nicht:
(["doif_test.:on"]) (set [@"doif_test." and $name ne $DEVICE] off)
Ich denke, dass ich da noch einen Denkfehler in der Aggregation habe...
Vollständige Definitionen:
Internals:
DEF (["doif_test.:on"]) (set [@"doif_test." and $name ne $DEVICE] off)
NAME doif_try1
NR 224
NTFY_ORDER 50-doif_try1
STATE initialized
TYPE DOIF
READINGS:
2017-08-23 12:01:46 cmd 0
2017-08-23 12:01:46 state initialized
condition:
0 EventDoIf('doif_test.',$hash,'on',0)
devices:
do:
0:
0 set [@"doif_test." and $name ne $DEVICE] off
1:
helper:
globalinit 1
last_timer 0
sleeptimer -1
itimer:
regexp:
0:
0 doif_test.:on
all:
0 doif_test.:on
state:
STATE:
Attributes:
do always
room DOIF,Test
verbose 5
Internals:
NAME doif_test1
NR 225
STATE off
TYPE dummy
READINGS:
2017-08-23 12:00:24 state off
Attributes:
group Dummy
room Test
webCmd on:off:111
(Doif_test2 analog)
P.S. - gibt eie eine Möglichkeit, das Ergebnis einer solchen Aggregation direkt in der Befehlszeile (oder im Log) evaluiert zu sehen? Würde mir das eigenständige Fehlersuchen sehr erleichtern...
Viele Grüße - Timmo
Du kannst versuchen, ganz ohne Liste mit Filter NAME!=$DEVICE zu arbeiten.
Leider bin ich "offline" und kann das gerade nicht testen.
Mit Liste wäre ein "for each" möglich.
Zu früh, funktioniert nicht.... da Dann alle devices selektiert werden...
Herzliche Grüsse
Timmo
Zitat von: Tsturm am 23 August 2017, 12:10:36
Hallo Zusammen,
Für meine Bewässerung habe ich acht Ventile, und möchte wegen des Wasserdrucks immer nur einen Kreis laufen lassen - i.e. wenn ich einen Kreis anschalte, sollen alle Anderen sicher aus sein - auch bei manuellem Einschalten.
Das will ich mit einem DOIF und einer Aggregation im Befehlsteil lösen - "Wenn eines der Ventile auf on geht, setzte alle Ventile bis auf das auslösende Ventil auf off"
(["doif_test.:on"]) (set [@"doif_test." ne $DEVICE] off)
Allerdings klappt die Aggregation nicht - der Vergleich der erzeugten Liste mit @ mit dem Wert $DEVICE klappt nicht.
Ebenso funktioniert das nicht:
(["doif_test.:on"]) (set [@"doif_test." and $name ne $DEVICE] off)
Du musst die Syntax der Aggregationsfunktion, wie sie in der Commandref angegeben ist, genau beachten. Du benötigst die fett markierten Teile:
[
<function>:<format>:"
<regex device>:<regex event>":<reading>:
<condition>,<default>]
daher:
(set [@"doif_test"::$name ne "$DEVICE"] off)
Hallo Damian,
jetzt habe ich es (fehlte noch die regex in der Aggregation). Nicht ganz trivial zu implementieren ;-)
(["doif_test.*:on"]) (set [@"doif_test.*"::$name ne "$DEVICE"] off)
Gibt es denn eine Art CMD-Line-Interpreter, mit dem man die Ergebnisse solcher Ausdrücke direkt evaluieren kann? Das würde die Sache etwas vereinfachen...
Vielen Dank & Gruß Timmo
Zitat von: Tsturm am 23 August 2017, 18:43:29
Hallo Damian,
jetzt habe ich es (fehlte noch die regex in der Aggregation). Nicht ganz trivial zu implementieren ;-)
(["doif_test.*:on"]) (set [@"doif_test.*"::$name ne "$DEVICE"] off)
Gibt es denn eine Art CMD-Line-Interpreter, mit dem man die Ergebnisse solcher Ausdrücke direkt evaluieren kann? Das würde die Sache etwas vereinfachen...
Vielen Dank & Gruß Timmo
Der CMD-Line-Interpreter ist im Modul eingebaut.
Ich teste es immer mit:
define test DOIF ([Taste meiner Fernbedienung])
([@....])
attr test do always
im Reading error des Moduls siehst du, ob es funktioniert hat oder nicht, wenn nicht, dann siehst du dort die entsprechende Fehlermeldung.
P. S. .* ist bei DOIF überflüssig