Autor Thema: Dimupdown entprellen  (Gelesen 2997 mal)

Offline Astrofreak85

  • Full Member
  • ***
  • Beiträge: 213
Dimupdown entprellen
« 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

Offline Astrofreak85

  • Full Member
  • ***
  • Beiträge: 213
Antw:Dimupdown entprellen
« Antwort #1 am: 01 April 2014, 13:06:49 »
Keiner? :(

Offline hexenmeister

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4707
    • tech_LogBuch
Antw:Dimupdown entprellen
« Antwort #2 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?
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

 

decade-submarginal