Liste im Dummy durchschalten

Begonnen von Gunther, 19 November 2019, 21:53:11

Vorheriges Thema - Nächstes Thema

Gunther

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.
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gunther

ja genau. Hatte gehofft, dass es einen Befehl zum durchschalten (vorwärts und rückwärts) der setlist-Einträge gibt.
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

amenomade

#3
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.ä
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gunther

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?
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

diko

FHEM auf Raspi 2 B, Jessi, 1x CUL868, 1x Hue, 1x Harmony, 1x HM-USB2

Gunther

FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

amenomade

Tja... macht grundsäzlich nix anderes als was ich hieroben mit DOIF schon geschrieben habe ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gunther

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

FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Damian

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

Gunther

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)
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Thomas41587

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?

amenomade

{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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

kumue

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...


Damian

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