Mit HM Wandtaster FS20 Dimer steuern

Begonnen von sruhsam, 09 Februar 2015, 18:54:51

Vorheriges Thema - Nächstes Thema

sruhsam

Hallo,
weis jetzt nicht ob es in dieser Gruppe richtig ist.

Wie kann ich denn mit einem Wandtaster (HM-PB-2-WM55-2) einen FS20 Dimmer dimmen ?

Mach dies derzeit mit einem notify zum ein- und ausschalten.

define SchalterNotifyoben notify HM_Wandtaster_oben set flur_licht on
define SchalterNotifyunten notify HM_Wandtaster_unten set flur_licht off


Möchte nun aber genau so steuern wie aus einem FS20 Taster, damit keine Unterschiede in der Bedienung vorhanden sind.
Hab es bereits so versucht, funzt aber nicht so richtig

define SchalterNotifyoben notify HM_Wandtaster_oben set flur_licht dimup
define SchalterNotifyunten notify HM_Wandtaster_unten set flur_licht dimdown

sruhsam

Hallo, habe folgendes versucht

define FlurEGonNotify notify HM_Wandtaster_oben.Short.* set flur_licht on
define FlurEGoffNotify notify HM_Wandtaster_unten.Short.* set flur_licht off
define FlurEGupNotify notify HM_Wandtaster_oben.Long.* set flur_licht dimup
define FlurEGdownNotify notify HM_Wandtaster_unten.Long.* set flur_licht dimdown


funzt auch gut bei einem Tastenpaar, doch wie mach ich das mit einer Taste ????

sruhsam

Nach weiteren Suchen nach Information und probieren, bin ich nun soweit gekommen, der Toggle schein kein Problem zu machen aber der Dimupdown. In FS 20 wird der Dimmer von der Taste mit einem Domupdown Befehl angesteuert. Das bedeutet bei langem Tastendruck wird immer zwischen dem Dimup und Dimdown gewechselt, ähnlich wie beim Toggle.
Nun habe ich es so eingestellt:

define FlurEGtoggleNotify notify HM_Wandtaster.Short.* set flur_licht Toggle
define FlurEGDimNotify notify HM_Wandtaster.Long.* set flur_licht dimupdown


Leider funktioniert das mit dem dimupdown nicht. kann mir bitte jemand helfen ?

Vieleicht geht es mit einem virtuellen HM-Schalter den ich dann mit dem Wandtaster peere und dann auf den Registersatz zugreifen kann, aber welchen Registersatz muss ich dann nehmen, damit das der FS20 Dimmer versteht ?? 

sruhsam

Hat denn hier keiner ne Idee oder ein ähnliches Problem (gehabt) ????? :-\

Masterfunk

#4
Habe das Problem durch "Stufenschaltung via myUtils gelöst.
Ich nutze zwar FS20 Taster und HM Dimmer, aber das Sollte kein Problem sein.
Musst das pct dann halt durch ein dim ersetzen.

sub UntoggleDimmer($;$)
{
my ($sender, $actor) = @_;
if (Value($sender) eq "toggle")
{
  if (Value($actor) eq "off") {fhem ("set ".$actor." pct 50")}
  else {fhem ("set ".$actor." pct 0")}
}
elsif (ReadingsVal("$actor", "pct", 0) > "90") {fhem ("set ".$actor." pct 90")}
elsif (ReadingsVal("$actor", "pct", 0) > "80") {fhem ("set ".$actor." pct 80")}
elsif (ReadingsVal("$actor", "pct", 0) > "70") {fhem ("set ".$actor." pct 70")}
elsif (ReadingsVal("$actor", "pct", 0) > "60") {fhem ("set ".$actor." pct 60")}
elsif (ReadingsVal("$actor", "pct", 0) > "50") {fhem ("set ".$actor." pct 50")}
elsif (ReadingsVal("$actor", "pct", 0) > "40") {fhem ("set ".$actor." pct 40")}
elsif (ReadingsVal("$actor", "pct", 0) > "30") {fhem ("set ".$actor." pct 30")}
elsif (ReadingsVal("$actor", "pct", 0) > "20") {fhem ("set ".$actor." pct 20")}
elsif (ReadingsVal("$actor", "pct", 0) > "10") {fhem ("set ".$actor." pct 10")}
elsif (ReadingsVal("$actor", "pct", 0) > "0") {fhem ("set ".$actor." pct 0")}
elsif (ReadingsVal("$actor", "pct", 0) eq "0") {fhem ("set ".$actor." pct 100")}
return;
}


Und hier noch das List des notify:


Internals:
   DEF        FL_Taster11 {UntoggleDimmer("FL_Taster11","FL_Decke")}
   NAME       FL_T11
   NOTIFYDEV  FL_Taster11
   NR         211
   NTFY_ORDER 50-FL_T11
   REGEXP     FL_Taster11
   STATE      active
   TYPE       notify
Attributes:
   room       System



Gruß Detlef

martinp876

etwas schneller sein sollte

sub UntoggleDimmer($;$)
{
my ($sender, $actor) = @_;
my $val = ReadingsVal("$actor", "pct", 0);
if (Value($sender) eq "toggle") {
                    $val = (Value($actor) eq "off")
                        ? 50 :
                          0}
elsif ($val == 0) {$val = 100}
else              {$val = int($val/10)*10}

fhem ("set $actor pct $valInt");
return;
}


es wird nur einmal der pct wert gelesen...

Masterfunk

Zitat von: martinp876 am 14 Februar 2015, 15:41:02
etwas schneller sein sollte

sub UntoggleDimmer($;$)
{
my ($sender, $actor) = @_;
my $val = ReadingsVal("$actor", "pct", 0);
if (Value($sender) eq "toggle") {
                    $val = (Value($actor) eq "off")
                        ? 50 :
                          0}
elsif ($val == 0) {$val = 100}
else              {$val = int($val/10)*10}

fhem ("set $actor pct $valInt");
return;
}


es wird nur einmal der pct wert gelesen...

Das funktioniert bei mir nicht. Er macht pct 0 und dann wars das.

Gruß Detlef

martinp876

Am ende steht $valInt. Das muss $val sein. Mein fehler

Masterfunk

Geht auch nicht.
Wenn ich das richtig verstehe, werden die Werte ja rerundet.
Wenn Sie bereits auf dem Wert stehen, bleibt der Wert doch, oder?

Gruß Detlef

martinp876

ich sehe jetzt den Fehler nicht. was du erreichen willst war mir nicht wirklich klar - warum bei 0 die 100 kommt und so.
gestört hat mich, dass du etliche male die Funktion readingsval aufrufst. das sollte in jedem Fall nur einmal passieren - eine performance-sünde.

du willst den wert in 10er stufen abgerundet ausgeben - korrekt? wenn du also durch 10 teilst und rundest kannst du danach wieder mit 10 multiplizieren. Ein eingangswertebereich von 0 bis 100 wird dann zu stufen 0 bis 10, also 00,10,...100 gemacht.
ReadingsVal des Aktor sollte "pct" sollte erst einmal stimmen - hoffe ich.

toggel wackelt zwischen 0 und 50.
baue ein
Log 1,"myval: $val from ".ReadingsVal("$actor", "pct", 0);;
ein - dann kann man sehen, welche werte gelesen werden sowie sie verarbeitet wurden.

Masterfunk

Hallo Martin,

Ziel ist es mit jedem "langen" Tastendruck das Licht um 10% zu dimmern. Egal welcher Wert eingestellt ist.
Er geht dann auf jen jeweils vollen 10er Wert. NAch 0 kommt dann 100 und es geht wieder runter.
Mit "kurzem" Tastendruck wird zwischen 0 und 50 (Das reicht für 90% aller Fälle) gewechselt. Also quasi ein/aus.
Kann sein das meine Lösung eine Performance Sünde ist. Würds ja gerne anders machen.
Wobei ich auf meinem System sowas von keinen Performance Problemen habe. ;-)

Gruß Detlef

martinp876

Performance ist zum teil einstellungssache. Wie du es magst.
Das problem ist wohl, dass ich bei 90 wieder auf 90 komme. Man muss eins abziehen. Ausserdem soll es modulo 10 sein.
Dann mache
Val = (int((val-1)/10))*10
Val = ((int((val-1)/10)+10)%10)*10
Sollte das if 0 ersparen

Nur falls du lust hast. Ich vermeide case wo ich kann


Masterfunk

Zitat von: martinp876 am 17 Februar 2015, 21:04:47
Nur falls du lust hast. Ich vermeide case wo ich kann

Auf jeden Fall. Werds heute Abend mal versuchen einzubauen.

Gruß Detlef