FHEM Forum

FHEM - Hausautomations-Systeme => SlowRF => Thema gestartet von: Astrofreak85 am 26 März 2014, 14:16:57

Titel: Dimupdown entprellen
Beitrag von: Astrofreak85 am 26 März 2014, 14:16:57
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
Titel: Antw:Dimupdown entprellen
Beitrag von: Astrofreak85 am 01 April 2014, 13:06:49
Keiner? :(
Titel: Antw:Dimupdown entprellen
Beitrag von: hexenmeister am 06 April 2014, 02:26:47
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?