Doif um sicherzustellen, dass aus einer Gruppe von Devices nur eines an ist

Begonnen von Tsturm, 23 August 2017, 12:10:36

Vorheriges Thema - Nächstes Thema

Tsturm

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

Per

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.

Tsturm

Zu früh, funktioniert nicht.... da Dann alle devices selektiert werden...

Herzliche Grüsse

Timmo

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tsturm

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF