Enocean Dimmer mit kurzem und langem Tastendruck ansteuern

Aus FHEMWiki
Version vom 30. März 2015, 19:46 Uhr von Lolle (Diskussion | Beiträge) (Sektion "Motivation" ergänzt)

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;
use POSIX;
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.