Enocean Dimmer mit kurzem und langem Tastendruck ansteuern
Aufgabe
Ein Enocean Dimmer soll mit einem Taster folgendermaßen bedient werden:
Tasterbedienung (Tastendruck) | Dimmer-Funktion (Lampe dimmen) |
---|---|
kurz an | an, volle Helligkeit |
kurz aus | aus |
lang an | rauf dimmen |
lang aus | runter dimmen |
Motivation
Das oben beschriebene Verhalten ist das Standardverhalten der meisten Funksysteme mit Dimmer. Die Taster-Dimmer-Kombination bei Direktverbindung der Enocean-Komponenten verhält sich zwar ähnlich, aber in den folgenden Punkten doch unterschiedlich:
Tasterbedienung (Tastendruck) | Dimmer-Funktion bei Direktverbindung | gewünschte Dimmer-Funktion |
---|---|---|
kurz an | zuletzt eingestellte Helligkeit | an, volle Helligkeit |
kurz 2x hintereinander an | an, volle Helligkeit | keine Funktion |
Bei Steuerung über den Server (FHEM) können zusätzlich individuelle Dimmkurven und Dimmgrenzwerte festgelegt werden.
Umsetzung
Über FHEM ist insbesondere die Umsetzung der langen Tastendrücke etwas komplizierter und wird im Folgenden beschrieben.
Voraussetzungen
In fhem.cfg ist ein Enocean Dimmer als "deviceDimmer" ein Enocean Taster als "deviceSwitch" definiert und eingelernt. Getestet wurde mit einem "Eltako FUD61NPN" Dimmer und einem "Eltako FT55" Taster, andere Enocean-Geräte sollten aber auch funktionieren.
Script
In 99_myUtils.pm (siehe 99_myUtils_anlegen) die Konstanten für die Dimmer-Funktionen definieren
package main; use strict; use warnings; sub myUtils_Initialize($$) { my ($hash) = @_; our $varDimValueMinimum = "25"; our $varDimValueMaximum = "80"; our $varDimStepsPerLongPressPeriod = "2"; } 1;
In fhem.cfg die Dimmer-Funktionen definieren:
# deviceSwitch -> deviceDimmer on/dim up define sequenceSwitch_B0_ShortAndLongPress sequence deviceSwitch:B0 0.5 deviceSwitch:buttons:.released attr sequenceSwitch_B0_ShortAndLongPress triggerPartial 1 define notifyDimmer_B0_ShortPress notify sequenceSwitch_B0_ShortAndLongPress:trigger set deviceDimmer on;;setstate deviceDimmer 100 define notifyDimmer_B0_LongPress notify sequenceSwitch_B0_ShortAndLongPress:partial_1 trigger dummyDimmer_DimUp_Start define dummyDimmer_DimUp_Start dummy attr dummyDimmer_DimUp_Start room hidden define notifyDimmer_DimUp_Start notify dummyDimmer_DimUp_Start { my $varCurrentDimValue = Value("deviceDimmer");; $varCurrentDimValue = $varCurrentDimValue < $main::varDimValueMinimum ? $varCurrentDimValue + $main::varDimValueMinimum : $varCurrentDimValue < $main::varDimValueMaximum ? $varCurrentDimValue + $main::varDimStepsPerLongPressPeriod : 100;; fhem( "set deviceDimmer dim $varCurrentDimValue;;setstate deviceDimmer $varCurrentDimValue" );; fhem( "trigger dummyDimmer_DimUp") } define dummyDimmer_DimUp dummy attr dummyDimmer_DimUp room hidden define sequenceSwitch_DimUp sequence dummyDimmer_DimUp 0.1 deviceSwitch:buttons:.released attr sequenceSwitch_DimUp triggerPartial 1 define notifySwitch_DimUp notify sequenceSwitch_DimUp:partial_1 { my $varCurrentDimValue = Value("deviceDimmer");; $varCurrentDimValue = $varCurrentDimValue < $main::varDimValueMinimum ? $varCurrentDimValue + $main::varDimValueMinimum : $varCurrentDimValue < $main::varDimValueMaximum ? $varCurrentDimValue + $main::varDimStepsPerLongPressPeriod : 100;; fhem( "set deviceDimmer dim $varCurrentDimValue;;setstate deviceDimmer $varCurrentDimValue" );; fhem( "trigger dummyDimmer_DimUp") } # deviceSwitch -> deviceDimmer off/dim down define sequenceSwitch_BI_ShortAndLongPress sequence deviceSwitch:BI 0.5 deviceSwitch:buttons:.released attr sequenceSwitch_BI_ShortAndLongPress triggerPartial 1 define notifyDimmer_BI_ShortPress notify sequenceSwitch_BI_ShortAndLongPress:trigger set deviceDimmer off;;setstate deviceDimmer 0 define notifyDimmer_BI_LongPress notify sequenceSwitch_BI_ShortAndLongPress:partial_1 trigger dummyDimmer_DimDown_Start define dummyDimmer_DimDown_Start dummy attr dummyDimmer_DimDown_Start room hidden define notifyDimmer_DimDown_Start notify dummyDimmer_DimDown_Start { my $varCurrentDimValue = Value("deviceDimmer");; $varCurrentDimValue = $varCurrentDimValue > $main::varDimValueMaximum ? $varCurrentDimValue - (100 - $main::varDimValueMaximum) : $varCurrentDimValue > $main::varDimValueMinimum ? $varCurrentDimValue - $main::varDimStepsPerLongPressPeriod : 0;; fhem( "set deviceDimmer dim $varCurrentDimValue;;setstate deviceDimmer $varCurrentDimValue" );; fhem( "trigger dummyDimmer_DimDown") } define dummyDimmer_DimDown dummy attr dummyDimmer_DimDown room hidden define sequenceSwitch_DimDown sequence dummyDimmer_DimDown 0.1 deviceSwitch:buttons:.released attr sequenceSwitch_DimDown triggerPartial 1 define notifySwitch_DimDown notify sequenceSwitch_DimDown:partial_1 { my $varCurrentDimValue = Value("deviceDimmer");; $varCurrentDimValue = $varCurrentDimValue > $main::varDimValueMaximum ? $varCurrentDimValue - (100 - $main::varDimValueMaximum) : $varCurrentDimValue > $main::varDimValueMinimum ? $varCurrentDimValue - $main::varDimStepsPerLongPressPeriod : 0;; fhem( "set deviceDimmer dim $varCurrentDimValue;;setstate deviceDimmer $varCurrentDimValue" );; fhem( "trigger dummyDimmer_DimDown") }
Anpassung
Die Konstanten in 99_myUtils.pm haben die folgenden Bedeutungen:
Name | Bedeutung |
---|---|
varDimValueMinimum | die minimale am Dimmer einzustellende Dim-Helligkeit |
varDimValueMaximum | die maximale am Dimmer einzustellende Dim-Helligkeit |
varDimStepsPerLongPressPeriod | um soviele Helligkeitsstufen-Stufen (in %) wird pro 100ms langem Tastendruck inkrementiert/dekrementiert -> beeinflusst die Dimmgeschwindigkeit |
Die Timeouts der FHEM-sequences "sequenceSwitch_B0_ShortAndLongPress" und "sequenceSwitch_DimUp" bzw. "sequenceSwitch_BI_ShortAndLongPress" und "sequenceSwitch_DimDown" haben die folgenden Bedeutungen:
Timeout von FHEM-sequence | Bedeutung |
---|---|
"sequenceSwitch_B0_ShortAndLongPress" und "sequenceSwitch_BI_ShortAndLongPress" | ab dieser Tastendruckdauer (in Sekunden) wird ein langer Tastendruck erkannt |
"sequenceSwitch_DimUp" und "sequenceSwitch_DimDown" | mit dieser Periode (in Sekunden) wird die Helligkeit beim Dimmen um "varDimStepsPerLongPressPeriod" erhöht/reduziert |
Verbesserungsbedarf
Die Timeouts der FHEM-sequences "sequenceSwitch_B0_ShortAndLongPress" und "sequenceSwitch_DimUp" bzw. "sequenceSwitch_BI_ShortAndLongPress" und "sequenceSwitch_DimDown" (derzeit fest auf 0.5 und 0.1) sollten auch als Konstante in 99_myUtils.pm definiert werden.