FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Tsturm am 23 August 2017, 12:10:36

Titel: Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag 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)


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
Titel: Antw:Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag von: Per am 23 August 2017, 13:41:41
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.
Titel: Antw:Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag von: Tsturm am 23 August 2017, 15:26:26
Zu früh, funktioniert nicht.... da Dann alle devices selektiert werden...

Herzliche Grüsse

Timmo
Titel: Antw:Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag von: Damian am 23 August 2017, 17:17:04
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)
Titel: Antw:Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag 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
Titel: Antw:Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist
Beitrag von: Damian am 23 August 2017, 21:15:28
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