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
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
Cool Damian das suche ich schon lange! Danke dafür!
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
defmod n notify Taste set Dimmer {(Each("Dimmer","off,dim25%,dim50%,dim75%,dim100%"))}
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]
:'(
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.
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
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?
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.
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.
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?
Klar. Das von mir geforderte Log mit "attr global verbose 5" hier anhaengen (oder im Code-Tag einfuegen).
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)
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.
OK, jetzt muss ich doch mal tiefer ansetzen:
Mein System basiert zum größten Teil auf FS20-Komponenten mit der Besonderheit des Subsystems FS20_Manager (im weitesten Sinne ähnlich FHZ1000, jetzt leider obsolet). Besteht aus 868MHz Rx/Tx, und über I2C 32 Relais-Ausgänge. Das ist der harte Kern meiner Hausanlage: solange der Atmel seinen Dienst tut, ist die Grund-Überlebensfunktionalität im Haus gesichert.
FHEM ist als Komfort-Erweiterung seriell angekoppelt. Ich habe mehr schlecht als recht das Modul 00_FS20Manager.pm zusammengebastelt. Bin leider kein Perl-Experte. Auf meine Nachfrage wurde damals CUL oder FHZ als Vorlage empfohlen. Habe CUL gewählt, nach meinem heutigen Verständnis wäre wohl FHZ besser gewesen.
Sicher werden hier die falschen toggle Einträge erzeugt. Ich hänge verschämt das Modul mal an. Mein Plan wäre jetzt, das aktuelle FHZ1000 als Vorlage zu nehmen und noch mal anzufangen. Bin für jeden Tipp zur Platzierung der seriellen I/O dankbar, da mir die grundsätzlichen Wege der Events durch System nicht klar sind.
Ich kann z.Zt. noch nicht vorstellen, dass dieses Modul (00_FS20MANAGER.pm) die Ursache des 3-fach Triggerns ist. Das 3 in Klammern ist die Laenge der CHANGED Array, und das wird von readingsSingleUpdate() in FS20.pm gefuellt. Ich kann mir nicht vorstellen, wie FS20_Parse() mehr als einen Eintrag pro Funknachricht/FS20 Instanz reinschreiben soll.
dupTimeout betrifft nur die von unterschiedlichen Geraeten empfangene Nachricht, z.Bsp wenn man 2+ CULs einsetzt. Dass man nur eine Nachricht empangen hat, sieht man an dem Log.
Es sei denn, FS20.pm wurde auch modifiziert: solche Sachen spaeter zu erwaehnen ist nicht gut, da das Vertrauen dann schnell hinueber ist.
Nein, FS20.pm ist nicht angerührt. Wenn es nicht an meiner falschen Implementation im FS20Manager Modul liegt, dann vielleicht am Verhalten des FS20Manager-Geräts: der serielle Kanal wurde nur auf meine Nachfrage hin ergänzt. Er spiegelt einfach Funk und seriellen Kanal. Ich vermute, dass ein serielles Kommando an den FS20Manager auch über seinen Funk gesendet und nochmals dort und vom CUL empfangen wird. Egal, was dort passiert, das Gerät ist fix und nicht mehr änderbar.
Ich würde nun einfach ein paar tracking Logeinträge einfügen, um mehr zu sehen.
hier ist die Ausgabe
2015.12.22 21:59:44 5: Triggering EG_Decke (3 changes) dim62% RSSI: -27.5 RAWMSG: 810b04xx0101a0015a5f12000a
erzeugt durch
my @hhh = @{$hash->{CHANGED}};
Log 5, "Triggering $dev ($max changes) @hhh";
Heisst das, dass FS20Manager dim, RSSI und RAWMSG an FS20_Parse fälschlicherweise als als 3 Events verkauft? Bitte um Nachsicht, ich hab mangelnden Durchblick...
Ich habe mal das Log angehängt.
Ich gehe davon aus, dass du addvaltrigger gesetzt hast.
In diesem Fall wird RSSI und RAWMSG zum Liste der Events hinzugefuegt.
ja, addvaltrigger ist gesetzt.
Ich wollte mit der Ausgabe eigentlich die 3 Inhalte von CHANGED sehen, sehe aber nur ein event 3-teilig - oder?
Zitat von: rudolfkoenig am 11 Dezember 2015, 12:12:50
defmod n notify Taste set Dimmer {(Each("Dimmer","off,dim25%,dim50%,dim75%,dim100%"))}
Das hat mich nach langem Suchen endlich weiter gebracht. Jetzt möchte ich aber statt "dim25%"wie in dem Beispiel folgendes haben um zwischen verschiedenen Farben umschalten zu können:
hsv 62,83,100
Leider wird das Komma beim HSV-Wert als Trennzeichen in der Auflistung (ist auch klar) interpretiert und demnach stimmt dann der HSV-Befehl nicht. Wie kann ich den HSV-Wert in richtig mit Komma maskieren?
Gruß, Sascha
Each() nimmt einen optionalen dritten Parameter, den Separator. Default ist ","
Zitat von: rudolfkoenig am 29 Januar 2016, 18:28:55
Each() nimmt einen optionalen dritten Parameter, den Separator. Default ist ","
Das verstehe ich leider nicht.
Mein Code soll quasi so aussehen damit mit jedem Tastendruck die Farbe wechselt (erst HSV 63,82,100 dann HSV 120,60,100 und dann HSV 180,80,100:
Taster2.4_sKurzerLangerDruck:trigger set LED_Kueche {(Each("LED_Kueche","HSV 63,82,100,HSV 120,60,100,HSV 180,80,100"))}
Taster2.4_sKurzerLangerDruck:trigger set LED_Kueche {(Each("LED_Kueche","HSV 63,82,100;HSV 120,60,100;HSV 180,80,100", ";"))}
Super, Danke! Jetzt habe ich den Aufbau verstanden. Läuft auch.
Jetzt habe ich noch eine Kleinigkeit:
Mit Longpress schalte ich das Device aus. Mit dem ersten Shortpress möchte ich den ersten HSV-Wert, mit dem zweiten Shortpress den zweiten Wert, usw. Momentan schaltet er mit dem ersten Shortpress nach einem Longpress den nachfolgenden Wert der vor dem Longpress eingestellt war.
Ist das möglich?
Gruß Sascha
Der Longpress muss dafuer $defs{$dev}{EACH_INDEX} zuruecksetzen.
Danke für deine schnelle Antwort. Damit kann ich jetzt gerade gar nichts anfangen. Ich versuche mich gleich mal da rein zu basteln.
Gruß Sascha
Zitat von: rudolfkoenig am 31 Januar 2016, 09:49:35
Der Longpress muss dafuer $defs{$dev}{EACH_INDEX} zuruecksetzen.
Trotzt langer Suche und verschiedener Versuche habe ich keine Lösung finden können wie ich den Wert eines Internals ändern kann. Hast du noch einen Tip für mich?
Gruß, Sascha
define n notify Taster2:Longpress { $defs{LED_Kueche}{EACH_INDEX}=0 }
Bitte Regexp anpassen, ich kenne die HomeMatic Events nicht.
Tausend Dank. Ich hatte es ohne die geschweiften Klammer versucht...
Hallo zusammen,
Ich will verschiedene Hue-scenes bei mir mit defmode durchschalten.
Das funktioniert auch schon mal nicht schlecht, bis auf das Problem das beim durchschalten von der letzten auf die erste Scene ich zweimal drücken muss.
HarmonyController:keypress:.Play set Beleuchtung_HUEGroup1 {(Each("Beleuchtung",",scene hhioVGcpWEfXb3v,scene HEAdg4jbPKAogVG,scene FtRsNUV0pvOQ2g5,scene jRDjCpI3VdpCdfG"))}
Woran kann das liegen?
Achtung blutiger Anfänger......