Hauptmenü

Schrittschalter

Begonnen von Damian, 22 November 2019, 20:14:22

Vorheriges Thema - Nächstes Thema

Damian

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

kumue

...ist das der Beginn der Weihnachts-Codeschnipsel 2019 ?  ;)

rudolfkoenig


Damian

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

loescher

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.

Damian

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

loescher

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.

Damian

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

tomster

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?

ch.eick

#9
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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

tomster

#10
@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])');     
}
}

Damian

Und das

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

klappt so mit dem Komma?

Ich hätte an der Stelle ein Semikolon erwartet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Damian

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

tomster

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