Ich habe ein Dummy mit mehreren Werten.
Wie kann ich den State durch schrittweises Ändern durchschalten
Also so, z. B. Über einen Taster
wert1 —> wert2 —> wert3 —> wert1
Hintergrund: habe eine Tradfri Remote und überlege sie so einzubinden:
rechts/links schaltet per DoIf einen Dummy (3-4 Lampen-Devices) durch und lässt die jeweils ausgewählte Lampe kurz aufflackern oder kurz erlöschen.
Ein 2. DoIf lässt in Abhängigkeit vom Dummy das entsprechende Device ein/ausschalten und dimmen.
Ich bin mir nicht sicher, dass ich verstehe, was Du meinst.
Etwas wie:
DOIF ([schalter:"button"] and [?dummy] eq "wert3") (set dummy wert1)
DOELSEIF ([schlater:"button"] and [?dummy] eq "wert1") (set dummy wert2)
DOELSEIF ([schalter:"button"] and [?dummy] eq "wert2") (set dummy wert3)
?
Kann man sogar ohne dummy über den DOIF selbst lösen.
ja genau. Hatte gehofft, dass es einen Befehl zum durchschalten (vorwärts und rückwärts) der setlist-Einträge gibt.
Es gibt webcmddevStateIcon
attr myDummy devStateIcon wert1:Restart:wert2 wert2:Restart:wert3 wert3:Restart:wert1
Das ist aber damit Fhemweb schalten kann.
Da willst Du auf einem Taster reagieren, dann musst Du irgendwie die Events und das dummy koppeln. DOIF oder notify o.ä
Danke, werde wohl mit einem DOIF arbeiten. back und forward wären vielleicht noch coole Befehle, die man mit den setlist-Einträgen nutzen könnte.
Wo kann ich so einen Vorschlag machen?
Ich denke, DOIF hat da genau das richtige:
https://wiki.fhem.de/wiki/DOIF/Mehrfachnutzung_eines_Tasters
cool, das schaue ich mir an!
Tja... macht grundsäzlich nix anderes als was ich hieroben mit DOIF schon geschrieben habe ;)
Habe ich auch festgestellt.
Folgendes DOIF (RAW Definition inkl. wait-Timer) funktioniert schonmal mit anzuzeigen, welche Lampe ausgewählt ist (blinkt kurz):
defmod doif_eg_ki_tradfri_dummy_schalten DOIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
attr doif_eg_ki_tradfri_dummy_schalten comment DOIF schaltet durch Drücke auf der Tradfri-Fernbedienung (rechts=5002 und links=4002) einen Dummy.\
\
Im Dummy werden die Namen der Lampen gesetzt. \
\
Damit man weiß, welche Lampe man "am Wickel" hat, blinkt die Lampe kurz auf.\
\
Damit wird ein weiteres DOIF befähigt anhand des gesetzten Dummies die Lampe an-/auszuschalten und hoch und runterzudimmen
attr doif_eg_ki_tradfri_dummy_schalten do always
attr doif_eg_ki_tradfri_dummy_schalten group Fernbedienung
attr doif_eg_ki_tradfri_dummy_schalten room Logik_Licht
attr doif_eg_ki_tradfri_dummy_schalten wait 0,0:0,0,1:0,0:0,0.5,0:0,0:0,0.5,0:0,0:0,0.5,0:0,0:0,0,1:0,0:0,0.5,0
Mit diesem Zweizeiler kann man beliebige Befehlssequenzen durchschalten:
defmod schrittSchalter DOIF init {@{$_a}=qw/10 35 50 70 100/;;$_counter=0}\
{if ([Taster:"on"]) {set_State($_a[$_counter++]);;fhem_set("Schalter $_a[$_counter]");; $_counter=($_counter==@{$_a} ? 0:$_counter)}}
Die Werte werden im oberen Array definiert, hier 10 35 50 70 100, die Anzahl ist beliebig
Taster und Schalter kann man entsprechend anpassen.
Im Status des DOIFs wird der aktuelle Wert dargestellt.
Hallo Damian,
danke. Ich muss gestehen, ich verstehe das DOIF nicht. Da bin ich zu sehr Noob... ;-)
Ich habe nun folgendes DOIF, was einen Dummy nutzt. Es funktioniert soweit, außer, wenn eine meiner Lampen einen Dimmstatus haben, also nicht "on", sondern im Dimmstatus sind oder NOACK haben. In solch einem Fall schaltet das DOIF nicht auf das nächste Device um.
Also gemeint sind Einträge wie
[eg_ki_leuchtrahmen_hauptschalter] eq "on"
Wie kann ich das klug umgehen?
Kann ich das mit ne "off" hinbekommen?
([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] eq "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
Zitat von: Damian am 21 November 2019, 19:53:05
Mit diesem Zweizeiler kann man beliebige Befehlssequenzen durchschalten:
defmod schrittSchalter DOIF init {@{$_a}=qw/10 35 50 70 100/;;$_counter=0}\
{if ([Taster:"on"]) {set_State($_a[$_counter++]);;fhem_set("Schalter $_a[$_counter]");; $_counter=($_counter==@{$_a} ? 0:$_counter)}}
Die Werte werden im oberen Array definiert, hier 10 35 50 70 100, die Anzahl ist beliebig
Taster und Schalter kann man entsprechend anpassen.
Im Status des DOIFs wird der aktuelle Wert dargestellt.
Wow, das Ding ist ja der Hammer ;D Allerdings muss ich mich Gunther anschließen: Verständnis=0. Kannst du evtl. die Bestandteile kurz erläutern, sodass man nicht nur stures copy&paste macht sondern das gelernte auch auf ähnliche Sachen anwenden kann?
{init => Initialisierung des DOIFS
@{$_a}=qw/10 35 50 70 100 => definiert ein Array mit Werten 10 35 50 ... und Name <DOIFname>a
$_counter=0 => definiert ein Zähler mit Initialisierungswert 0
} => Ende der Initialisierung
if ([Taster:"on"] => Trigger ist ein "on" Event auf Device Taster
{set_State($_a[$_counter++] => setzt den Zustand des DOIFs auf entspr. (neu kalkulierten) Wert
fhem_set("Schalter $_a[$_counter]");; => das Befehl "set Schalter <neuen Wert> wird geschickt
$_counter=($_counter==@{$_a} ? 0:$_counter)} => schliesst den Kreis von Werten: wenn 100 erreicht, fängt er wieder mit 10 an
wenn ich schalte, ist der wert des Schalters immer eins weiter als der status des DOIF...
also state des DOIF auf 10 und state des Schalters auf 35.
Hätte ich aber nicht so erwartet...
Zitat von: kumue am 22 November 2019, 18:57:11
wenn ich schalte, ist der wert des Schalters immer eins weiter als der status des DOIF...
also state des DOIF auf 10 und state des Schalters auf 35.
Hätte ich aber nicht so erwartet...
hab´s mal schnell zusammengezimmert, um die Leistungsfähigkeit des Perl-Modus aufzuzeigen:
dann einfach abändern in:
set_State($_a[$_counter]);;fhem_set("Schalter $_a[$_counter++]")
Die Besonderheit im Perl-Modus sind hierbei gekapselte Instanzvariablen, hier $_a, die einen Schaltvorgang überleben, also ihren Wert bis zum nächsten Schaltvorgang behalten können.
perfekt, jetzt läufts im gleichtakt
Zitat von: kumue am 22 November 2019, 19:28:15
perfekt, jetzt läufts im gleichtakt
Dabei läuft es mit maximaler Perl-Performance, ohne das System sonderlich zu belasten. Der FHEM-Parser kommt hier gar nicht zum Zuge ;)
Edit: Ich habe es hier etwas strukturierter mit Beschreibung gepostet https://forum.fhem.de/index.php/topic,105634.msg995666.html#msg995666
Da ich gerne verstehe was ich als Code habe, sieht es derzeit so aus wie unten. Mein Problem ist nun, dass das System Mega-Langsam wird...
Woran kann das liegen?
defmod doif_eg_ki_tradfri_dummy_schalten DOIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_leuchtrahmen_hauptschalter] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_LEDStreifen] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^5002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_ledspots] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_leuchtrahmen_hauptschalter" and [eg_ki_ledspots] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_ledspots) (set eg_ki_ledspots off) (set eg_ki_ledspots on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_LEDStreifen" and [eg_ki_leuchtrahmen_hauptschalter] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_leuchtrahmen_hauptschalter) (set eg_ki_leuchtrahmen_hauptschalter off) (set eg_ki_leuchtrahmen_hauptschalter on)\
\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] ne "on") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen on-for-timer 0.1)\
DOELSEIF ([eg_ki_zigbee_fernbedienung:"^4002$"] and [eg_ki_dummy_fernbedienung] eq "eg_ki_ledspots" and [eg_ki_LEDStreifen] ne "off") (set eg_ki_dummy_fernbedienung eg_ki_LEDStreifen) (set eg_ki_LEDStreifen off) (set eg_ki_LEDStreifen on)
attr doif_eg_ki_tradfri_dummy_schalten do always
attr doif_eg_ki_tradfri_dummy_schalten wait 0,0:0,0,1:0,0:0,0,0.5:0,0:0,0,0.5:0,0:0,0.5,0:0,0:0,0,1:0,0:0,0,0.5
Ich habe über ein userReading den jeweils nächsten Sender zum Abruf parat (siehe https://forum.fhem.de/index.php/topic,17667.msg492816.html#msg492816).