FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Damian am 22 November 2019, 20:14:22

Titel: Schrittschalter
Beitrag von: Damian am 22 November 2019, 20:14:22
Oft möchte man eine bestimmt Liste von Befehlen mit einer Fernbedienung/Taster sequentiell im Kreise durchschalten. Das lässt sich wie folgt in wenigen Zeilen erledigen:

defmod schrittSchalter DOIF init \
{\
  @{$_a}=qw/10 35 50 70 100/;;           # Liste mit Werten wird als Array definiert\
  $_counter=0;;                          # Zähler wird auf den ersten Wert gesetzt \
}\
{\
  if ([FB:"on"]) {                       # wenn Taster von FB 'on' sendet\
    set_State($_a[$_counter]);;          # setze den Status des Moduls auf den ersten Wert\
    fhem_set("Schalter $_a[$_counter++]");;# schalte per set-Befehl ein Device, hier Schalter, mit dem aktuellen Wert und erhöhe den Zähler auf den nächsten Wert\
    $_counter=0 if ($_counter==@{$_a});;   # Wenn Zähler beim letzten Wert angekommen ist, fange wieder beim ersten an \
  }\
}


Hierbei wird maximale Perl-Performance gewährleistet, mit minimaler Systemlast (der FHEM-Parser kommt nicht zum tragen).
Die obige Liste von Werten oder Kommandos kann beliebig angepasst werden. FB ist hier das auslösende Device, Schalter der zu schaltende Aktor.
Titel: Antw:Schrittschalter
Beitrag von: kumue am 22 November 2019, 20:48:56
...ist das der Beginn der Weihnachts-Codeschnipsel 2019 ?  ;)
Titel: Antw:Schrittschalter
Beitrag von: rudolfkoenig am 22 November 2019, 21:04:29
Alternativ verwendet man Each: https://forum.fhem.de/index.php/topic,40022.msg323002.html#msg323002
Titel: Antw:Schrittschalter
Beitrag von: Damian am 24 November 2019, 21:11:39
Zitat von: rudolfkoenig am 22 November 2019, 21:04:29
Alternativ verwendet man Each: https://forum.fhem.de/index.php/topic,40022.msg323002.html#msg323002

Wenn man eine Doku dazu finden würde ;)
Titel: Antw:Schrittschalter
Beitrag von: loescher am 04 Dezember 2019, 22:07:33
Hallo Damian,

Coole Sache mit dem Schrittschalter!
Ich wollte das gleich einbauen, scheitere aber am "Schalter".
Ich habe bisher ein DOIF Taster in dieser Art:

defmod Taster DOIF (1) ( set irgendwas ...) ()
attr Taster wait 0,0.7
attr Taster cmdState on,off
attr Taster devStateIcon on:light_light_dim_100@gold initialized|off:light_light_dim_100:cmd_1


Da kann ich auf das Icon tippen und das set... wird gemacht.
Wie würde das denn mit dem Schrittschalter gehen?
Mit meinem aktuellen Versuch läßt sich nichts antippen, um zu schalten:

defmod schrittSchalter DOIF init \
{\
  @{$_a}=qw/0 50 255/;;\
  $_counter=0;;\
}\
{\
  if (1) {\
    set_State($_a[$_counter]);;\
    fhem_set("LichtCouch bri $_a[$_counter++]");;\
    $_counter=0 if ($_counter==@{$_a});;\
  }\
}

Oder geht sowas im Perl Mode nicht?

LG,
Stephan.
Titel: Antw:Schrittschalter
Beitrag von: Damian am 04 Dezember 2019, 23:01:17
Du kannst dir z. B. mit webCmd einen Button definieren, auf den du triggern kannst, in meinem Codeschnippsel:

attr schrittSchalter webCmd schalte

und deine Ereignisabfrage anpassen auf:

if ([$SELF:"schalte"])

Wenn man auf "schalte" klickt wird weitergeschaltet.

Edit:
Mit

attr schrittSchalter cmdIcon schalte:li_wht_dimmer

kannst du statt "schalte" ein Icon in der Statuszeile darstellen
Titel: Antw:Schrittschalter
Beitrag von: loescher am 05 Dezember 2019, 22:05:21
Vielen Dank!

Kann man den angezeigten Status (0, 50, 255) vor dem Icon noch irgendwie wegbekommen?
Bei meinem Taster Beispiel ist im FHEM Phone WEB kein Status, sondern nur die anklickbare Lampe.

Könnte man das Icon auch (wie bei meinem Taster) kurz blinken lassen?
(attr wait gibt es im Perl-Mode leider nicht.)

LG,
Stephan.
Titel: Antw:Schrittschalter
Beitrag von: Damian am 06 Dezember 2019, 07:56:25
Zitat von: loescher am 05 Dezember 2019, 22:05:21
Vielen Dank!

Kann man den angezeigten Status (0, 50, 255) vor dem Icon noch irgendwie wegbekommen?
Bei meinem Taster Beispiel ist im FHEM Phone WEB kein Status, sondern nur die anklickbare Lampe.

Könnte man das Icon auch (wie bei meinem Taster) kurz blinken lassen?
(attr wait gibt es im Perl-Mode leider nicht.)

LG,
Stephan.

Wenn du nicht sehen willst, in welchem Zustand (welche Dimmzahl) sich das Modul befindet, dann kannst du die set_State-Zeile rausnehmen. Man kann alles, was der FHEM-Modus kann, auch im Perl-Modus umsetzen (dort gibt es sogar beliebig viele wait-Timer), allerdings wird der Komplettausbau nach deinen Wünschen die Definition vermutlich eher länger machen als deine bisherige ist.
Titel: Antw:Schrittschalter
Beitrag von: tomster am 18 November 2021, 10:44:05
Prima Sache, dieser Schrittschalter!
Könnte mir jemand auf die Sprünge helfen, um zu erreichen dass - egal in welchem Zustand sich das DOIF befindet- nach einer gewissen Zeit wieder eine Rückfall auf den ersten Array-Wert erfolgt?
Titel: Antw:Schrittschalter
Beitrag von: ch.eick am 19 Januar 2022, 18:31:47
Zitat von: tomster am 18 November 2021, 10:44:05
Prima Sache, dieser Schrittschalter!
Könnte mir jemand auf die Sprünge helfen, um zu erreichen dass - egal in welchem Zustand sich das DOIF befindet- nach einer gewissen Zeit wieder eine Rückfall auf den ersten Array-Wert erfolgt?
Im Perl Beispiel könntest Du mit einem Timer den Zähler des Schrittschalters wieder zurück setzen.
Schau mal im Wiki nach set_Exec()

VG
   Christian
Titel: Antw:Schrittschalter
Beitrag von: tomster am 20 Januar 2022, 18:17:16
@ch.eick
Danke! Ich musste zwar ein bissl mit der Reihenfolge spielen, aber nun scheint es so zu funktionieren, wie ich möchte!

defmod schrittSchalter DOIF init
{
@{$_a}=qw/kalender verkehr lifte kameras/;;
$_counter=0;;
set_State($_a[$_counter]);;
                             
}
{
if ([KNX_0003050:"on"])  {
fhem_set("schrittSchalter $_a[$_counter++]");;     
$_counter=0 if ($_counter==@{$_a});;
set_State($_a[$_counter]);;
set_Exec("timer",40, '$_counter=0, set_State($_a[$_counter])');     
}
}
Titel: Antw:Schrittschalter
Beitrag von: Damian am 21 Januar 2022, 09:58:28
Und das

'$_counter=0, set_State($_a[$_counter])'

klappt so mit dem Komma?

Ich hätte an der Stelle ein Semikolon erwartet.
Titel: Antw:Schrittschalter
Beitrag von: ch.eick am 21 Januar 2022, 10:41:32
Zitat von: Damian am 21 Januar 2022, 09:58:28
Und das

'$_counter=0, set_State($_a[$_counter])'

klappt so mit dem Komma?

Ich hätte an der Stelle ein Semikolon erwartet.
Das ist Woodoo :-)

Ich erstelle gerade auch ein DOIF für die Ikea remote control, die hat 5 Tasten und unterscheider click, hold und release . Manchmal wird beim release auch eine Zeit geliefert, was scheint aber nicht verlässlich zu sein.

Das DOIF soll dann folgendes können:
1 Taste im Zentrum unterscheidet click und hold

2 alle anderen Tasten
- single click
- mehrfach click mit durchzählen (wie hier im Thread)
- nach 4 Sekunden wird ein neuer Zyklus begonnen (dann geht auch wieder ein single click)
- Dauer (hold) mit berechnung der Drückzeit von max 20 Sekunden
  Dies ist notwendig, da die release time nicht verlässlich geliefert wird.

Somit wären dann eine Menge Muster in dem Beispiel um die Fernbedienung auch mit mehrfach Funktionen zu verwenden.

VG
   Christian
Titel: Antw:Schrittschalter
Beitrag von: Damian am 21 Januar 2022, 10:58:01
Zitat von: ch.eick am 21 Januar 2022, 10:41:32
Das ist Woodoo :-)

Ich erstelle gerade auch ein DOIF für die Ikea remote control, die hat 5 Tasten und unterscheider click, hold und release . Manchmal wird beim release auch eine Zeit geliefert, was scheint aber nicht verlässlich zu sein.

Das DOIF soll dann folgendes können:
1 Taste im Zentrum unterscheidet click und hold

2 alle anderen Tasten
- single click
- mehrfach click mit durchzählen (wie hier im Thread)
- nach 4 Sekunden wird ein neuer Zyklus begonnen (dann geht auch wieder ein single click)
- Dauer (hold) mit berechnung der Drückzeit von max 20 Sekunden
  Dies ist notwendig, da die release time nicht verlässlich geliefert wird.

Somit wären dann eine Menge Muster in dem Beispiel um die Fernbedienung auch mit mehrfach Funktionen zu verwenden.

VG
   Christian

Codeschnipsel für typische Anforderungen, die gut die Funktionsweise im DOIF-Perl-Modus aufzeigen, möchte ich zukünftig in die neue Dokumentation aufnehmen: https://wiki.fhem.de/wiki/DOIF/Perl-Modus

Es sind ja schon paar da :)
Titel: Antw:Schrittschalter
Beitrag von: tomster am 21 Januar 2022, 11:49:09
Zitat von: Damian am 21 Januar 2022, 09:58:28
Und das

'$_counter=0, set_State($_a[$_counter])'

klappt so mit dem Komma?

Ich hätte an der Stelle ein Semikolon erwartet.

Nachdem ich zur Spezies "Monkey see, Monkey do" gehöre, probiere ich mich bei sowas immer durch (weil ich nämlich kein Perl kann). Da das Komma funktioniert hat, habe ich Semikolon gar nimma probiert.
Es scheint aber tatsächlich mit Komma oder Semikolon gleichermaßen zu funktionieren. Zumindest kann ich keinen Unterschied feststellen...