[Gelöst] Frage/Machbarkeit: Sequenz mit Taster zum schalten von Lampen

Begonnen von asciidisco, 16 August 2017, 15:19:00

Vorheriges Thema - Nächstes Thema

asciidisco

Hi zusammen,

ich bin grade dabei meinen notify Wildwuchs mit DOIFs abzulösen, was soweit auch schon ganz gut funktioniert.
Allerdings bin ich bei einem Use Case auf ein Problem gestoßen, zu dem ich bisher keine Lösung finde.

Use Case:

a) Schalter Button_02 1x kurz betätigen -> Lampe an
b) Schalter Button_01 1x kurz betätigen -> Lampe aus
c) Schalter Button_02 lange betätigen -> Lampe dimUp
d) Schalter Button_01 lange betätigen -> Lampe dimDown
e) Schalter Button_02 2x kurz betätigen -> Lampe an, Dimmer auf 100%

a bis d sind kein Problem, allerdings finde ich nicht, ob/wie es möglich ist, eine Sequenz im DOIF abzubilden
Bisher nutze ich eine sequence

HM_3966A8_Btn_02:Short.* 1 HM_3966A8_Btn_02:Short.*

welche ein notify triggert. Jetzt stellt sich mir die Frage, ob ich sequence & zugehöriges notify nur durch das DOIF loswerden kann:

(["HM_3966A8_Btn_02"] =~ "Short")
   (set HUEDevice1 on)
DOELSEIF (["HM_3966A8_Btn_01"] =~ "Short")
   (set HUEDevice1 off)
DOELSEIF (["HM_3966A8_Btn_02"] =~ "Long")
   (set HUEDevice1 dimUp)
DOELSEIF (["HM_3966A8_Btn_01"] =~ "Long")
   (set HUEDevice1 dimDown)
DOELSEIF (????)
   (set HUEDevice1 on, set HUEDevice1 pct 100)



Es würde mich freuen, wenn einer der DOIF Spezis mir hier einen Denkanstoß geben könnte. Danke.


nils_

Zitat von: asciidisco am 16 August 2017, 15:19:00
Es würde mich freuen, wenn einer der DOIF Spezis mir hier einen Denkanstoß geben könnte. Danke.

dann poste doch im DOIF-Unterforum bzw. verschieb den Thread dorthin.
viele Wege in FHEM es gibt!

asciidisco

@_nils Alles klar, mach ich, Danke. Dachte halt es fällt eher in den Bereich Anfängerfragen.

nils_

Zitat von: asciidisco am 16 August 2017, 16:33:15
@_nils Alles klar, mach ich, Danke. Dachte halt es fällt eher in den Bereich Anfängerfragen.

das ist immer schwer abzuwägen, wo es hin passt.
aber da du speziell nach DOIF Experten suchst, ist es halt da besser aufgehoben (denke ich!)
viele Wege in FHEM es gibt!

Brockmann

Im Prinzip geht das so:
https://fhem.de/commandref_DE.html#DOIF_waitsame

Wird aber schwierig in ein DOIF zu packen, weil jedes Button02_Short für sich ja schon eine andere Bedingung des DOIF auslöst.
Aber Du könntest für die Sequenz ein eigenes DOIF machen.

Dann macht DOIF1 die Lampe nach dem einem Tastendruck an (und den Rest).
Und DOIF2 setzt zusätzlich die Helligkeit, wenn innerhalb von x Sekunden ein zweiter Tastendruck erfolgt.

So würde ich es machen. Aber vielleicht hat ja noch jemand eine Idee, wie man es in ein einziges DOIF packen kann.

asciidisco

Danke, das hilft mir schon weiter, ich werde einfach noch mal etwas rumspielen, vllt. finde ich ja noch eine Lösung via einem DOIF, wenn nicht, dann sind 2 auch okay, zumindest lichtet sich so schon mal meine notify Hölle.

Ellert

Eine weitere Möglichkeit wäre, das Prinzip einer Merfachbelegung eines Tasters zu nutzen, siehe https://wiki.fhem.de/wiki/DOIF/Mehrfachnutzung_eines_Tasters

asciidisco

Oha, das sieht genau nach dem aus, was ich suche. Danke.

Brockmann

Im Grunde genommen müsste das schon reichen. Wichtig dabei ist die Reihenfolge, damit das DOIF bei einem Button02_Short zuerst prüft, ob es sich um einen zweiten Tastendruck handelt.


(["HM_3966A8_Btn_02"] =~ "Short" and $cmd==2 and [$SELF:state:sec] < 1)
   (set HUEDevice1 pct 100)
DOELSEIF (["HM_3966A8_Btn_02"] =~ "Short")
   (set HUEDevice1 on)
DOELSEIF (["HM_3966A8_Btn_01"] =~ "Short")
   (set HUEDevice1 off)
DOELSEIF (["HM_3966A8_Btn_02"] =~ "Long")
   (set HUEDevice1 dimUp)
DOELSEIF (["HM_3966A8_Btn_01"] =~ "Long")
   (set HUEDevice1 dimDown)


Aber kannst Du das Problem eigentlich nicht grundsätzlich vereinfachen?
Wenn Btn02_Short und die Lampe ist schon an, dann Helligkeit auf 100%.
Wenn Btn02_Short und die Lampe ist noch nicht an, dann einschalten.

Also ungefähr so:

(["HM_3966A8_Btn_02"] =~ "Short" and [HUEDevice1] eq "on")
   (set HUEDevice1 pct 100)
DOELSEIF (["HM_3966A8_Btn_02"] =~ "Short")
   (set HUEDevice1 on)
...


Das würde nicht nur direkt beim Einschalten funktionieren, sondern Du könntest die Lampe auch später noch jederzeit mit einem kurzen Tastendruck auf 100% bekommen, wenn Du das möchtest.

asciidisco

Vielen Dank noch mal für die Hilfe,
ich hatte auch schon daran gedacht, den Device State zu nutzen, allerdings frage ich mich, ob der schnellem Druck (z.B. 2 Tastenbetätigungen unter 300ms) noch nicht geändert ist.
Ich hab mir gestern noch ein DOIF zusammengeschustert, von dem ich denke das es geht. Deines sieht allerdings eleganter aus.

Klar, die Möglichkeit auch später direkt auf maximale Lichtstärke zu gehen ist auch ein nettes Gimmick. Daran hatte ich gar nicht gedacht.
Morgen bin ich wieder zuhause & dann kann ich das mal mit meiner Installation testen, werde dann berichten.

Brockmann

Zitat von: asciidisco am 17 August 2017, 09:50:25
ich hatte auch schon daran gedacht, den Device State zu nutzen, allerdings frage ich mich, ob der schnellem Druck (z.B. 2 Tastenbetätigungen unter 300ms) noch nicht geändert ist.
Ein berechtigter Einwand. Ob der State so schnell so aktualisiert ist, muss man testen. Andererseits zwingt die ja niemand, so schnell hintereinander zu drücken.  ;)

asciidisco

Euch allen noch mal vielen Dank für die Hilfestellung,
der State der Lampen ändert sich tatsächlich schnell genug, so das ich mir keine Gedanken um Commands, Intervalle oder ähnliches machen musste.

Als Referenz für andere, die fertige Lösung (mag nicht die schönste sein, funktioniert aber), schaut so aus:

## Wenn der Schalter einmal kurz, oben gedrückt wird & die Deckenlampe bereits an ist:
## Stelle Helligkeit der Deckenlampe auf 100% 
([HM_3966A8:"HM_3966A8_Btn_02 Short"] and [HUEDevice1:onoff] == 1)
    (set HUEDevice1 pct 100)
## Wenn der Schalter einmal kurz, unten gedrückt wird & die Deckenlampe bereits aus ist:
## Schalte Schreibtischlampen aus     
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_01 Short"] and [HUEDevice1:onoff] == 0)
    (set HM_17688C,HM_1E3CA9 off)
## Wenn der Schalter einmal kurz, oben gedrückt wird & die Deckenlampe aus ist:
## Schalte Deckenlampe an   
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_02 Short"] and [HUEDevice1:onoff] == 0)
   (set HUEDevice1 on)
## Wenn der Schalter einmal kurz, unten gedrückt wird & die Deckenlampe an ist:
## Schalte Deckenlampe aus   
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_01 Short"] and [HUEDevice1:onoff] == 1)
   (set HUEDevice1 off)
## Wenn der Schalter lang, oben gedrückt wird & die Deckenlampe aus ist:
## Schalte Deckenlampe an & dimme so lange hoch wie das Event anhält oder die höchste Stufe erreicht ist (do always)   
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_02 Long"] and [HUEDevice1:onoff] == 0)
   (set HUEDevice1 on, set HUEDevice1 dimUp)
## Wenn der Schalter lang, oben gedrückt wird & die Deckenlampe an ist:
## Dimme so lange hoch wie das Event anhält oder die höchste Stufe ereicht ist (do always)   
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_02 Long"] and [HUEDevice1:onoff] == 1)
   (set HUEDevice1 dimUp)
## Wenn der Schalter lang, unten gedrückt wird & die Deckenlampe an ist:
## Dimme so lange runter wie das Event anhält oder die niedrigste Stufe ereicht ist (do always)     
DOELSEIF ([HM_3966A8:"HM_3966A8_Btn_01 Long"] and [HUEDevice1:onoff] == 1)
   (set HUEDevice1 dimDown)

moonsorrox

Zitat von: asciidisco am 18 August 2017, 13:11:08
Als Referenz für andere, die fertige Lösung (mag nicht die schönste sein, funktioniert aber), schaut so aus:

evtl. noch die Attribute dazu schreiben, am besten den defmod da sieht man alles, für die User die es nachbauen wollen  ;)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM