Toggle-Taste soll Status zyklisch weiterschalten

Begonnen von BeetleX, 10 Dezember 2015, 18:15:57

Vorheriges Thema - Nächstes Thema

BeetleX

Hallo,
ich suche schon seit einer Weile nach einer Möglichkeit, mit einer Taste (FS20 S4 o.ä.) ein device zyklisch durchzuschalten, z.B.
- bei einem Dimmer dim0% -> dim25% -> dim50% -> dim75% -> dim100% -> dim0%  usw...
- oder LightScene setting1 -> setting2 -> setting3 und von vorn.

Eigentlich sind das ja Sonderfälle von toggle on/off  8)
Ich sehe 2 Möglichkeiten:
1. per DOIF - dort bin ich am Verzweifeln  :(
2. Funktion ähnlich UntoggleDirect - dort fehlt mir das Werkzeug, um ein beliebiges device anzubinden, von dem dann alle Stati zyklisch gesetzt werden

Das 2. wäre deutlich interessanter, aber hier muss ich als Anfänger die Waffen strecken.
Wie kann ich in der Funktion die Liste der möglichen Stati auslesen und Weiterschalten mit Modulo n???

Könnte vielleicht jemand ´nen Tipp geben?
VG

Damian

#1
Zitat von: BeetleX am 10 Dezember 2015, 18:15:57
Hallo,
ich suche schon seit einer Weile nach einer Möglichkeit, mit einer Taste (FS20 S4 o.ä.) ein device zyklisch durchzuschalten, z.B.
- bei einem Dimmer dim0% -> dim25% -> dim50% -> dim75% -> dim100% -> dim0%  usw...
- oder LightScene setting1 -> setting2 -> setting3 und von vorn.

Eigentlich sind das ja Sonderfälle von toggle on/off  8)
Ich sehe 2 Möglichkeiten:
1. per DOIF - dort bin ich am Verzweifeln  :(
2. Funktion ähnlich UntoggleDirect - dort fehlt mir das Werkzeug, um ein beliebiges device anzubinden, von dem dann alle Stati zyklisch gesetzt werden

Das 2. wäre deutlich interessanter, aber hier muss ich als Anfänger die Waffen strecken.
Wie kann ich in der Funktion die Liste der möglichen Stati auslesen und Weiterschalten mit Modulo n???

Könnte vielleicht jemand ´nen Tipp geben?
VG

z. B.

define di DOIF (([di] eq "cmd_3" or [di] eq "initialized") and [S4:?on]) (set bla set1)
DOELSEIF ([di] eq "cmd_1" and [S4:?on]) (set bla set2)
DOELSEIF ([di] eq "cmd_2" and [S4:?on]) (set bla set3)


Edit: Ich habe noch mal Klammerung angepasst.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

P.A.Trick

Cool Damian das suche ich schon lange! Danke dafür!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

Damian

Zitat von: P.A.Trick am 10 Dezember 2015, 23:25:27
Cool Damian das suche ich schon lange! Danke dafür!

ja, auf dieser Art und Weise kann man sich einen beliebigen Zustandsautomaten (Endlichen Automaten) bauen. Ich werde bei Gelegenheit die Commandref diesbezüglich erweitern.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

defmod n notify Taste set Dimmer {(Each("Dimmer","off,dim25%,dim50%,dim75%,dim100%"))}

BeetleX

Ein Lob den Meistern von DOIF und Perl, Danke!

Das DOIF funktioniert so wie hier zu sehen:

define xxx FS20 abcd ee

define EG_Decke FS20 abcd ef
attr EG_Decke model fs20du

define di DOIF (([di] eq "cmd_4" or [di] eq "initialized") and [xxx:?toggle]) (set EG_Decke off) \
DOELSEIF ([di] eq "cmd_1" and [xxx:?toggle]) (set EG_Decke dim75%) \
DOELSEIF ([di] eq "cmd_2" and [xxx:?toggle]) (set EG_Decke dim81%) \
DOELSEIF ([di] eq "cmd_3" and [xxx:?toggle]) (set EG_Decke dim100%)


Das defmod wäre natürlich sehr elegant, aber es tut sich noch etwas schwer:

defmod nnn notify [xxx:?toggle] set EG_Decke {(Each("EG_Decke","off,dim62%,dim82%,dim100%"))}

wird scheinbar nicht getriggert. Versucht habe ich xxx, xxx:?toggle und [xxx:?toggle]
:'(


rudolfkoenig

Bitte nicht wundern, dass beim Mischen von notify und DOIF Syntax das Ergebnis Muell ist.
[xxx:?toggle] kann weder ein Geraetename noch ein Geraetename:Event Kombination sein, und in meinem Beispiel wird auch nicht suggeriert, dass man sowas verwenden soll.

Die Version mit xxx muesste funktionieren, wenn nicht, bitte ein "attr global verbose 5" Mitschnitt hier anhaengen.

BeetleX

OK,
als erstes waren doppelte %% nötig, jetzt siehr das Log so aus:


2015.12.12 15:46:40 5: Cmd: >set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}<
2015.12.12 15:46:40 3: nnn return value: Unknown argument {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}, choose one of dim06% dim100% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dimdown dimup dimupdown off off-for-timer on on-100-for-timer-prev on-for-timer on-old-for-timer on-old-for-timer-prev ramp-off-time ramp-on-time reset sendstate timer toggle dim:slider,0,6.25,100 blink on-till intervals off-till


BeetleX

Es gibt auch noch eine Variante 3 mit Perl-Funktion in 99_Utils.pm analog UntoggleDirect.

define nnn notify xxx { cycleDim("EG_Decke") }


Das funktioniert im Prinzip, allerdings werden 3 toggle-Ereignisse ausgewertet:

2015.12.12 15:46:40 4: FS20 xxx toggle
2015.12.12 15:46:40 5: Triggering xxx (3 changes)


Die 3 Ereignisse kommen wohl von 3 CULs? Bei den ersten beiden Lösungen (DOIF und 1-Zeile-Perl) wird das Ereignis aber nur 1x abgearbeitet.
Warum 3x bei cycleDim?

rudolfkoenig

Zitatals erstes waren doppelte %% nötig, jetzt siehr das Log so aus:

Du verwendest eine alte Version von FHEM. Damit funktioniert es nicht.
Was ich gezeigt habe, habe ich getestet.

BeetleX

Sorry! Mit 5.7 funktioniert der Aufruf - soweit fein.
Aber dann ist das eigentliche Problem das 3-fache triggern:

2015.12.12 17:57:31 4: FS20 xxx toggle
2015.12.12 17:57:31 5: Triggering xxx (3 changes)

Ich erinnere mich dunkel, das das irgendwie herausgefiltert wird? Scheint bei mir aber nicht zu klappen.
Zu sehen ist, dass die 3 Dimmerstufen mit Abständen von <0,5s durchlaufen werden.

BeetleX

Mein Problem bleibt das das 3-fache Triggern.
Habe testweise dupTimeout auf 3 gesetzt - keine Änderung, das toggle wird 3x abgearbeitet  :(
Kann ich noch etwas tun?

rudolfkoenig

Klar. Das von mir geforderte Log mit "attr global verbose 5" hier anhaengen (oder im Code-Tag einfuegen).

BeetleX

hier das Log:

2015.12.19 18:50:16 5: CUL/RAW: /F5A5FC51206

2015.12.19 18:50:16 4: CUL_Parse: CUL_1 F5A5FC51206 -71
2015.12.19 18:50:16 5: CUL_1 dispatch 810b04xx0101a0015a5fc50012
2015.12.19 18:50:16 4: FS20 xxx toggle
2015.12.19 18:50:16 5: Triggering xxx (3 changes)
2015.12.19 18:50:16 5: Notify loop for xxx toggle
2015.12.19 18:50:16 5: Triggering nnn
2015.12.19 18:50:16 4: nnn exec set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}
2015.12.19 18:50:16 5: Cmd: >set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}<
2015.12.19 18:50:16 3: FS20 set EG_Decke off
2015.12.19 18:50:16 5: Triggering EG_Decke (1 changes)
2015.12.19 18:50:16 5: Notify loop for EG_Decke off
2015.12.19 18:50:16 5: EG_wohnen: not on any display, ignoring notify
2015.12.19 18:50:16 5: Triggering nnn
2015.12.19 18:50:16 4: nnn exec set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}
2015.12.19 18:50:16 5: Cmd: >set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}<
2015.12.19 18:50:16 3: FS20 set EG_Decke dim62%
2015.12.19 18:50:16 5: Triggering EG_Decke (1 changes)
2015.12.19 18:50:16 5: Notify loop for EG_Decke dim62%
2015.12.19 18:50:16 5: EG_wohnen: not on any display, ignoring notify
2015.12.19 18:50:16 5: Triggering nnn
2015.12.19 18:50:16 4: nnn exec set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}
2015.12.19 18:50:16 5: Cmd: >set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}<
2015.12.19 18:50:16 3: FS20 set EG_Decke dim81%
2015.12.19 18:50:16 5: Triggering EG_Decke (1 changes)
2015.12.19 18:50:16 5: Notify loop for EG_Decke dim81%
2015.12.19 18:50:16 5: EG_wohnen: not on any display, ignoring notify
2015.12.19 18:50:16 5: CUL/RAW: /F5A5F12005D

2015.12.19 18:50:16 4: CUL_Parse: CUL_1 F5A5F12005D -27.5
2015.12.19 18:50:16 5: CUL_1 dispatch 810b04xx0101a0015a5f120000
2015.12.19 18:50:17 4: FS20 xxx toggle
2015.12.19 18:50:17 5: Triggering xxx (1 changes)
2015.12.19 18:50:17 5: Notify loop for xxx toggle
2015.12.19 18:50:17 5: Triggering nnn
2015.12.19 18:50:17 4: nnn exec set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}
2015.12.19 18:50:17 5: Cmd: >set EG_Decke {(Each("EG_Decke","off,dim62%,dim81%,dim100%"))}<
2015.12.19 18:50:17 3: FS20 set EG_Decke dim100%
2015.12.19 18:50:17 5: Triggering EG_Decke (1 changes)
2015.12.19 18:50:17 5: Notify loop for EG_Decke dim100%
2015.12.19 18:50:17 5: EG_wohnen: not on any display, ignoring notify
2015.12.19 18:50:17 4: FS20 EG_Decke off
2015.12.19 18:50:17 5: Triggering EG_Decke (1 changes)
2015.12.19 18:50:17 5: Notify loop for EG_Decke off
2015.12.19 18:50:17 5: EG_wohnen: not on any display, ignoring notify
2015.12.19 18:50:17 5: CUL/RAW: /F5A5F120A5E

2015.12.19 18:50:17 4: CUL_Parse: CUL_1 F5A5F120A5E -27
2015.12.19 18:50:17 5: CUL_1 dispatch 810b04xx0101a0015a5f12000a
2015.12.19 18:50:17 5: CUL/RAW: /F5A5F120D5D

2015.12.19 18:50:17 4: CUL_Parse: CUL_1 F5A5F120D5D -27.5
2015.12.19 18:50:17 5: CUL_1 dispatch 810b04xx0101a0015a5f12000d
2015.12.19 18:50:17 5: CUL/RAW: /F5A5F12105D

2015.12.19 18:50:17 4: CUL_Parse: CUL_1 F5A5F12105D -27.5
2015.12.19 18:50:17 5: CUL_1 dispatch 810b04xx0101a0015a5f120010
2015.12.19 18:50:26 5: CUL/RAW: /T0F0F00263DDD

2015.12.19 18:50:26 4: CUL_Parse: CUL_1 T0F0F00263DDD -91.5
2015.12.19 18:50:26 5: CUL_1 dispatch 810c04xx0909a0010f0f0000263d
2015.12.19 18:50:26 3: FHT Unknown device 0f0f, please define it
2015.12.19 18:50:26 5: Triggering global (1 changes)
2015.12.19 18:50:26 5: Notify loop for global UNDEFINED FHT_0f0f FHT 0f0f
2015.12.19 18:50:26 2: autocreate: define FHT_0f0f FHT 0f0f
2015.12.19 18:50:26 5: Triggering global (2 changes)
2015.12.19 18:50:26 5: Triggering global (3 changes)

rudolfkoenig

Ich kann das Problem nicht reproduzieren, und eine konkrete Ursache finde ich auch nicht.

Den Log kann ich aber halbwegs erklaeren: warum auch immer befinden sich vor dem Eintreffen der ersten toggle im CHANGED Internal von xxx 2 weitere toggle Eintraege, die Nachricht selbst fuegt einen Dritten hinzu. Das haette man sehen koennen mit "list xxx" vor dem Eintreffen der ersten toggle Nachricht. Die drei Eintraege werden abgearbeitet und zum Schluss entfernt, da bei der zweiten toggle das notify nur einmal aufgerufen wird.

Es muss also vor dem ersten toggle was passiert sein, was ich nicht erklaeren kann, und auch nicht im Log enthalten ist.