Dimupdown entprellen

Begonnen von Astrofreak85, 26 März 2014, 14:16:57

Vorheriges Thema - Nächstes Thema

Astrofreak85

Hi,

die "Zweitbelegung" der Tasten bei FS20 im Toggle-Modus ist ja dimupdown. Diese "Zweitbelegung" wollte ich gern für Schaltbelegungen nutzen. Dimupdown wird ja aber kontinuierlich gesendet, gibt es da einen Trick, wie man das "entprellen" kann? zumindest für eine best. Zeit z.B. 10sek (länger sollte die Taste i.d.R. ja nicht gedrückt sein.

Danke,
Astro

Astrofreak85


hexenmeister

Moin!
Verstehe ich richtig Dein Problem: Du möchtest, das die mehrfach gesendete Nachrichten (wegen langen Halten des Tasters) nicht zum mehrfachen Ausführen führen?

Ich habe gerade ggf. ein ähnliches Problem und habe dafür folgende Methode gebastelt:


###############################################################################
my $debounce_map;
###############################################################################
# Eine Art Entprellung.
# Es wird geprüft, ob der Schluessel in der angegebenen Zeit bereits
# angefragt wurde. Dann wird liefert 1 (true), sonst 0 (false).
# Damit kann z.B. sichergestellt werden, dass nur ein Befehl
# in der angegebenen Zeit ausgefuehrt. Nuetzlich bei notify-Befehlen.
#
# Parameter: Key - Schluessel; time - Zeit in Sekunden
###############################################################################
sub
debounce($$)
{
my($key, $dtime) = @_;
 
  my $ctime = time();
  my $otime = $debounce_map->{$key};
 
  if(!defined($otime)) {
  # neuer Key, Zeitstempel speichern
  $debounce_map->{$key}=$ctime;
  return 1;
  }
 
  # Zeitablauf pruefen
  my $delta = $otime+$dtime-$ctime;
  if($delta gt 0) {
  # Zeitfenster noch nicht abgelaufen
  return 0;
  }
 
  # Zeit abgelaufen, Zeitstempel redefinieren
  $debounce_map->{$key}=$ctime;
  return 1;
}


Ich benutze sie in den notify-Anweisungen:
define NX_OG_RL_DN_LN notify OG_FL_RC01.Alle_Rolladen_Dn:.*Long.* {if(debounce("og_rollo",5)) {fhem("set og_rollo runter")};;}

Hilft Dir das weiter?