ENOcean dimmt HUE

Begonnen von dmoibm, 01 April 2015, 17:49:31

Vorheriges Thema - Nächstes Thema

dmoibm

Hallo FHEM Gemeinde

Möglicherweise ist dies für Euch kalter Kaffee... für mich war es das erste Erfolgserlebnis mit FHEM. Ich bin Fan von EnOcean Schaltern da diese keine Batterien brauchen. Die Philips HUE Lichter finde ich hübsch und das System insgesamt recht ausgereift. Darum wollte ich die HUE Lämpchen via FHEM mit einem EnOcean Schalter dimmen. Und zwar kurzer Klick=Ein bzw. Aus, langer Klick=DimUp bzw. DimDown. Ich beschränke mich im Weiteren auf einen Kanal für Ein und DimUp. Der umgekehrte weg (aus/dimDown) geht genau gleich. Ein Kanal eines EnOcean Schalters liefert folgende Events:

2015-03-31 16:50:33 EnOcean EnO_switch_0181632A buttons: pressed
2015-03-31 16:50:33 EnOcean EnO_switch_0181632A channelA: AI
2015-03-31 16:50:33 EnOcean EnO_switch_0181632A AI
2015-03-31 16:50:33 EnOcean EnO_switch_0181632A buttons: released

Die Dauer zwischen pressed und released galt es nun zu bestimmen. Das richtige Werkzeug dazu schien mir die Sequenz zu sein. Liegen zwischen pressed und released mehr als 0.5 Sek. so ist es ein langer Klick und es soll gedimmt werden. Die Sequenz dazu ist so definiert:
  define sEnO_1_AI sequence EnO_switch_0181632A:AI 0.5 EnO_switch_0181632A:buttons:.released
  attr sEnO_1_AI triggerPartial 1

Diese liefert "trigger" bei < 0.5 Sek. oder "partial_1" wenn länger als 0.5 Sek. gedrückt wird. Diese Events sehen so aus:

  2015-04-01 16:58:19 sequence sEnO_1_A0 trigger oder
  2015-04-01 16:58:23 sequence sEnO_1_A0 partial_1

Das Ein- bzw. Ausschalten ging dann ganz einfach:
  define nEnO_1_AI notify sEnO_1_AI:trigger set HueBridge1_HUEDevice2 on

Nun kommt der Teil an dem ich recht lange geübt habe. Das Abfangen des Events war klar und einmal dimUp auch. Das sieht so aus:
  define nEnO_1_AI_DimStart notify sEnO_1_AI:partial_1 set HueBridge1_HUEDevice2 dimUp

Nun brauche ich aber einen Loop der alle 0.2 Sek. Einen dimUp sendet. AT geht nicht da die kleinste Einheit eine Sekunde ist. DOIF habe ich auch angeschaut. Leider macht der das DO aber nur einmal wenn das IF zutrifft. Also versuchte ich mich in der Perl-Programmierung. Ich versuchte es mit gewissen Vorahnungen mit diesem:
  define nEnO_1_AI_DimStart notify sEnO_1_AI:partial_1 { while(ReadingsVal("EnO_switch_0181632A", "buttons", "") eq "pressed"){fhem "set HueBridge1_HUEDevice2 dimUp";; sleep(1);;} }

Das geht überhaupt nicht! Damit wird das ganze System gesperrt da die Ausführung des Scripts nicht asynchron erfolgt und somit der Switch den Status nie ändert. Klassischer infinite loop! Auch async {...} oder threads->create { sub {...}} brachten keine Lösung. Irgendwo bin ich auf diese Bemerkung gestossen "The use of interpreter-based threads in perl is officially discouraged.".

Bei der Suche nach weiteren FHEM Befehlen, z.B. ein LOOP oder so, bin ich auf den sleep Befehl des FHEM gestossen. Dort steht explizit "...blockiert die Abarbeitung von FHEM nicht"! Der daraus konstruierte notify sieht etwas gewöhnungsbedürftig aus funktioniert aber einwandfrei:
  define nEnO_1_AI_Dim notify sEnO_1_AI:partial_1 set HueBridge1_HUEDevice2 dimUp;; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp);; sleep 0.2;;IF ([EnO_switch_0181632A:buttons] eq "pressed") (set HueBridge1_HUEDevice2 dimUp)

Evtl. kennt ja jemand von Euch einen Loop-Befehl der funktionieren würde? Oder wäre dies unter dem Thema "In Schönheit sterben" abzuhaken?

Ich möchte noch allen für eure zahlreichen Beiträge in den unterschiedlichsten Foren danken!

Daniel

flurin

Versuchs mal so:


{fhem ("set HueBridge1_HUEDevice2 dimUp; sleep 0.2")}


sleep ohne Klammern.

Gruss
flurin

dmoibm

Hoi Flurin

Du meinst in etwa so:
define nEnO_1_AI_Dim notify sEnO_1_AI:partial_1 { while(ReadingsVal("EnO_switch_0181632A", "buttons", "gugus") eq "pressed"){fhem "set HueBridge1_HUEDevice2 dimDown; sleep 0.2"} }

Das geht leider auch nicht da das while FHEM blockiert. Es braucht etwas vor dem Loop.

flurin

#3
Zitat von: dmoibm am 02 April 2015, 16:48:38
Hoi Flurin

Du meinst in etwa so:
define nEnO_1_AI_Dim notify sEnO_1_AI:partial_1 { while(ReadingsVal("EnO_switch_0181632A", "buttons", "gugus") eq "pressed"){fhem "set HueBridge1_HUEDevice2 dimDown; sleep 0.2"} }

Das geht leider auch nicht da das while FHEM blockiert. Es braucht etwas vor dem Loop.

Nicht ganz. Grundsätzlich ist Triggering in Sekundentakt schwierig.

Aber evtl. sowas:


define di_dimmer DOIF ([EnO_switch_0181632A:buttons] eq "pressed" and [+00:00:01])
(set HueBridge1_HUEDevice2 dimUp; sleep 0.5; set HueBridge1_HUEDevice2 dimUp)
attr di_dimmer do always
attr di_dimmer group DOIF


Wenn es funktioniert, dann kann man es mit sleep 0.2 erweitern.

Gruss
flurin

dmoibm

Das geht auch nicht da ein EnOcean Taster aus 2-4 Kanälen besteht und der Status pressed auf den Taster und nicht auf den Kanal geht. So kann der DOIF nicht unterscheiden ob jetzt runter oder rauf gedimmt werden soll. Dies kann durch setzen eines dummies über die Sequenz gelöst werden. Aber am Schluss haben wir wesentlich mehr Definitionen und Code als in meiner Lösung. Die funktioniert grundsätzlich... wäre einfach hübscher mit einem Loop;-)

Zudem löst der DOIF jede Sekunde einen Event aus ob die Taste gepresst ist oder nicht. Eventlog lesen wird so noch aufwendiger.

zeipet

#5
Nein, es funktioniert tadellos!
Danke zuerst für den ersten Codeschnippsel, hatte es zuerst mit dieser Variante Probiert, hab aber 6 Lampen im WZ.
Hat funktioniert, aber wenn ich einen anderen Schalter will und mehrere Räume habe, gn8  ;D

EDIT:

So funktionierts bei mir:

Das Auf-Dimmen

define WZ_dimUp DOIF ([EnO_switch_FEFC837B:buttons] eq "pressed" and [EnO_switch_FEFC837B:channelA] eq "AI" and [+00:00:01])
(
set HUEDevice3 dimUp; set HUEDevice6 dimUp; set HUEDevice7 dimUp; set HUEDevice8 dimUp; set HUEDevice9 dimUp; set HUEDevice10 dimUp;
sleep 0.2;
set HUEDevice3 dimUp; set HUEDevice6 dimUp; set HUEDevice7 dimUp; set HUEDevice8 dimUp; set HUEDevice9 dimUp; set HUEDevice10 dimUp
)


Das Ausschalten über Sequenz, da sonst beim dimmen mitgeschaltet wird:


([Schalter1A0:?trigger])
(set HUEGroup2 pct 0)


Das Ab-Dimmen

define WZ_dimdown DOIF ([EnO_switch_FEFC837B:buttons] eq "pressed" and [EnO_switch_FEFC837B:channelA] eq "A0" and [+00:00:01])
(
set HUEDevice3 dimDown; set HUEDevice6 dimDown; set HUEDevice7 dimDown; set HUEDevice8 dimDown; set HUEDevice9 dimDown; set HUEDevice10 dimDown;
sleep 0.2;
set HUEDevice3 dimDown; set HUEDevice6 dimDown; set HUEDevice7 dimDown; set HUEDevice8 dimDown; set HUEDevice9 dimDown; set HUEDevice10 dimDown
)


Das Einschalten über die Sequenz.

([Schalter1AI:?trigger])
(set HUEGroup2 pct 0)


Ausschalten, Einschalten und dimmen funktioniert, scenen wären jetzt noch super mit doppelklick ;D

Leider kann man mit dimUp und dimDown keine HUEGroup ansteuern. Jetzt dimmen die nicht ganz synchron.
Hat jemand eine Idee wie das klappen könnte?

LG Peter

volschin

Schon mal über das Lightscene Modul und feste Dimmwerte für bestimmte Szenarios nachgedacht?
Intel NUC+Ubuntu 22.04+Docker+FHEM6
HomeMatic: HM-MOD-RPI-PCB+HM-USB-CFG2+hmland+diverse, HUE: Hue-Bridge, RaspBee+deCONZ+diverse
Amzn Dash-Buttons, Siro Rollos
4xRPi, 4xCO20, OWL+USB, HarmonyHub, FRITZ!Box 7590, Echo Dots+Show8, Logi Circle 2, HomeBridge
TIG Stack (Telegraf, InfluxDB, Grafana)

zeipet

*EDIT*

Ja mit doppelklick? :) Dann würde über einen Schalter alles gehen....

Eine Idee?

Fabian

Hi,
habe deinen Code ausprobiert und bekomme immer
dimUpWZ DOIF: no right bracket: (set HUEDevice1 dimUp
zurück :-\
Woran kann das liegen?

Ekksen

Hat jemand schon Lichtszenen zu dimmen bekommen? Sitze da gerade dran.

Ekksen

Zitat von: Fabian am 24 Juni 2015, 20:45:35
Hi,
habe deinen Code ausprobiert und bekomme immer
dimUpWZ DOIF: no right bracket: (set HUEDevice1 dimUp
zurück :-\
Woran kann das liegen?
Die Semikolons durch Kommas austauschen ging bei mir

Sammy51

#11
Zitat von: zeipet am 19 April 2015, 02:19:06

Ausschalten:
([Schalter1A0:?trigger])
(set HUEGroup2 pct 0)


Ausschalten, Einschalten und dimmen funktioniert, scenen wären jetzt noch super mit doppelklick ;D

Leider kann man mit dimUp und dimDown keine HUEGroup ansteuern. Jetzt dimmen die nicht ganz synchron.
Hat jemand eine Idee wie das klappen könnte?

LG Peter

Anmerkung für Dich: Für einen aufgeräumteren und lesbareren Code und vielleicht (nicht getestet) bessere Synchronisierung würde ich Deine HueDevices umbenennen, so dass Du im Code mit Platzhalter arbeiten kannst. Z.B. Alle WZ_Licht_XYZ => WZ_Licht.*  (bei mir WZ.Licht.XYZ; bislang machen die Punkte kein Problem, hoffe das bleibt dabei)

=========================


Mein Stand: Um bei mir mit kurz und lang zu dimmen - habe ich erste Erfolge ... so ganz passt es aber noch nicht.


Schritt1:
Das Unterscheiden von Long und ShortPress funktioniert so schonmal ... jetzt muss nur noch das simple "pct 50" im "LangerDruck" Teil ersetzt werden gegen ein "DimUp Loop"


define s_SZ.Sw2.Tuer_A0_KurzerLangerDruck sequence SZ.Sw2.Tuer:A0 0.5 SZ.Sw2.Tuer:buttons:.released
attr s_SZ.Sw2.Tuer_A0_KurzerLangerDruck triggerPartial
define n_SZ.Sw2.Tuer_A0_KurzerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:trigger set SZ.Licht.Decke on
define n_SZ.Sw2.Tuer_A0_LangerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:partial_1 set SZ.Licht.Decke pct 50




Schritt2: Hakt noch ... dimUp wird 1x ausgeführt statt mehrfach bei "lange drücken" (das ginge simpler mit ersetzen von pct 50 gegen dimUp - oben)


###### EnoCean 2-Fach Taster Schlafzimmer Tür programmieren ######

# Sequenz zur Defintion kurzer und langer Druck
define s_SZ.Sw2.Tuer_A0_KurzerLangerDruck sequence SZ.Sw2.Tuer:A0 0.5 SZ.Sw2.Tuer:buttons:.released
attr s_SZ.Sw2.Tuer_A0_KurzerLangerDruck triggerPartial

# kurzer Druck => on, last known state
define n_SZ.Sw2.Tuer_A0_KurzerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:trigger set SZ.Licht.Decke on

# langer Druck
# define n_SZ.Sw2.Tuer_A0_LangerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:partial_1 set SZ.Licht.Decke pct 50

# dimUp langer Druck A0
define SZ.Sw2.Tuer_A0_dimUp DOIF ([SZ.Sw2.Tuer:buttons] eq "pressed" and [SZ.Sw2.Tuer:channelA] eq "A0" and [+00:00:01]) (set SZ.Licht.Decke dimUp, sleep 0.2, set SZ.Licht.Decke dimUp)

----------------------------------------------------------------
PI3b FHEM@Buster | Homematic via HMLAN | Phillips HUE/Zigbee | EnoCean via USB300 | Z-Wave via USB | Sonos | AlexaConnector

In Schublade (Anwendungstipps?): Raspy 1 | HM-Raspi-Modul | USB-Serial Adapter

choetzu

Zitat von: Sammy51 am 25 März 2018, 20:23:22


Mein Stand: Um bei mir mit kurz und lang zu dimmen - habe ich erste Erfolge ... so ganz passt es aber noch nicht.


Schritt1:
Das Unterscheiden von Long und ShortPress funktioniert so schonmal ... jetzt muss nur noch das simple "pct 50" im "LangerDruck" Teil ersetzt werden gegen ein "DimUp Loop"


define s_SZ.Sw2.Tuer_A0_KurzerLangerDruck sequence SZ.Sw2.Tuer:A0 0.5 SZ.Sw2.Tuer:buttons:.released
attr s_SZ.Sw2.Tuer_A0_KurzerLangerDruck triggerPartial
define n_SZ.Sw2.Tuer_A0_KurzerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:trigger set SZ.Licht.Decke on
define n_SZ.Sw2.Tuer_A0_LangerDruck notify s_SZ.Sw2.Tuer_A0_KurzerLangerDruck:partial_1 set SZ.Licht.Decke pct 50



hallo samy51,
ist zwar schon etwas her, aber bist du hier weiter gekommen?
Ich bin grad in der selben Situation und komme mit dem DimUp-Loop auch nicht weiter...
Lg c
Raspi3, EnOcean, Zwave, Homematic

dafosy

Hallo Forum,

mein Thema passt hier eigentlich gut rein, deswegen starte ich kein neues Thema. Ich steuere auch meine Wohnung mit EnOcean und HUEDevices. Auch ich möchte einen Dimmer bauen, der folgendes kann:

Einfachklick ON: Lampen leuchten in niedrigster Stufe bzw. in der zuletzt eingestellten (set HUEDevice pct 20 oder set HUEDevice on)
Doppelklick ON: alle Lampen hell
gedrückt halten ON: alle Lampen dimmen sich hoch
Einfachklick OFF: alle Lampen aus
gedrückt halten OFF: alle Lampen dimmen runter

Mein Ansatz ist mittels DOIF den Status einer zu Sequence zu nutzen, um zu dimmen, der Rest Lampen ein/aus ist klar:

...Code der Übersicht wegen aus gelassen...

DOELSEIF
(["K2_BI_OFF_seq"])
(set HUEDevice9 off)
(set K2_Klicks_Dummy 0)
(set K2_Dauer_Dummy 0)

DOELSEIF
(["K2_BO_ON_seq"])
(set HUEDevice9 dimUp)
(set K2_Dauer_Dummy 0)

...Code ausgelassen...


Wenn meine Lösung klappt, würde ich meine Idee dann noch etwas ausführlicher beschreiben.
Aktuell hänge ich am Auslesen der Sequence.
Im obigen Beispiel funktioniert (["K2_BI_OFF_seq"]), sprich das "triggern" schaltet ab.

Aber wie kann ich in DOIF meiner Sequence "K2_BO_ON_seq" den Status "partial_1" entlocken/auslesen/ nutzen?

VG
dafosy