Doppelklick / Doppelter Tasterdruck programmatisch realisieren

Hallo zusammen,

ich empfange über deinen seriellen Port (Enocean / Eltako FGW14) „Taster“ Befehle (Taster gedrückt / Taster losgelassen) und möchte nun einen Doppelklick in IPS identifizieren, um hierdurch eine weitere / alternative Licht-Szene schalten zu können.

Aktuell setze ich über eine RegisterVariable mit Aktionsskript eine boolsche Variable bei Empfang der Enocean Daten, d.h. Taster gedrückt => Variable = true
Taster losgelassen => Variable = False

Ein Doppelklick würde also ein schnelles zweifaches Ein/Ausschalten bedeuten, was ich auch sauber in der IPS Variable bzw. deren Historie sehe.

Wie kann man nun am sinnvollsten einen Doppelklick realiseren? Gibt es hierfür eine fertige Funktion / Profil oder einen empfohlenen Ansatz?

Einfallen würde mir aktuell nur, mit Hilfe einer Zählervariable die Klicks in einem Zeitraum zu zählen und nach x Sekunden wieder zurückzusetzen, klingt aber etwas nach „von Hinten durch die Brust“…

Besten Dank !

Hallo!

Ich hab Doppel und Dreifach-Klick genauso implementiert wie du das beschreibst…

Vielleicht hat jemand noch eine bessere Lösung?

LG
Sebastian

Muss es wirklich ein Doppelklick sein? Denn bei zwei, drei viermal drücken würde ich sicher durcheinander kommen. Wenn man mal nicht den Takt eingehalten hat, hat man ggf. schon eine andere Funktion ausgelöst.

Ich habe eine weitere Funktionsebene durch langes drücken erreicht. Ich schaue einfach danach wie lange die Taste gedrückt wurde. Das geht aber auch nur bei Taster die nicht direkt in Aktoren eingelernt sind, da ansonsten ja schon dieser ausgelöst wird.

Ich arbeite bei sowas einfach mit der Speicherung der microtime des Tastendrucks.

Ist das Delta zum letzten Telegramm dann größer als … X (was Du auch immer für ne Zeit willst) wird der zuvor gespeicherte Wert verworfen und nur der letzte Wert gespeichert. So kann man auch ein und dasselbe Script für mehere Tastpunkte benutzen und z.B. verschiedene Sequenzen für diverse Aktionen unterscheiden.

Hallo zusammen,

ich wollte das Thema einmal kurz hochholen, da ich mich aktuell auch mit der Situation befasse.
Gibt es hierzu evtl. ein Beispiel wie sowas mit dem Delta der Zeit aussehen könnte ?

Grüße,
Adrian

Hallo zusammen,

hat hierzu niemand einen Beispiel Ansatz ?

Gruß,

Guten Abend zusammen,

wollte das nochmal „hochholen“ leider komme ich hier auf keinen Ansatz den ich mit meinem aktuellen Kenntnissen umsetzen kann.

Hätte hier evtl. jemand einen Tip?

Grüße,

Hallo zusammen,

also ich bin jetzt mit einigen Anläufen zwar ans Ziel gekommen, aber ich glaube das ist etwas mit der „Kirche ums Dorf“.

Hier der Lösungsansatz:

<?php

$buttonCounterValue = GetvalueInteger (30174);
$buttonCounter = 30174;
$switchVariable = 25834;

if ($_IPS['VARIABLE'] = 53886 && $buttonCounterValue == 0)

{
    SetValueInteger ($buttonCounter, 1);
    IPS_Sleep(3000);
    SetValueInteger ($buttonCounter, 0);
    SetValueInteger ($switchVariable, 1);

}

if ($_IPS['VARIABLE'] = 53886 && $buttonCounterValue == 1)

{
    SetValueInteger($buttonCounter, 2);
    IPS_Sleep(3000);
    SetValueInteger ($buttonCounter, 0);
    SetValueInteger ($switchVariable, 2);
}

Ich habe Quasi 2 Variablen angelegt, die eine Variable ist immer auf 0 im „Normalzustand“, wird der Taster gedrückt, wird diese auf „1“ gesetzt, drückt man den Taster binnen 3 Sekunden nochmals wird diese auf „2“ gesetzt.

Da ich in einem anderen Skript auf die Aktualisierung und den Wert einer Variable reagiere sprich ob 1 oder 2 musste ich eine weitere „Schaltvariable“ anlegen.

Diese wird dann am ende der 3 Sekunden entweder auf 1 oder auf 2 gesetzt.

Lässt sich das eventuell noch etwas „Smarter“ machen ?

Grüße,
AdrianS

EDIT:

Da das irgendwie nun doch nicht so richtig funktionierte hab ich´s nochmal geändert:

$buttonCounter = 30174;
$switchVariable = 25834;
$knxSwitch = 52752;


if ($_IPS['VARIABLE'] = $knxSwitch && $buttonCounterValue == 0)

{
    SetValueInteger ($buttonCounter, 1);
    IPS_SetScriptTimer($_IPS['SELF'], 2);

}

if ($_IPS['VARIABLE'] = $knxSwitch && $buttonCounterValue == 1)

{
    SetValueInteger ($switchVariable, 2);
    SetValueInteger ($buttonCounter, 0);
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}

If ($_IPS['EVENT'] == 41998)
{
    SetValueInteger ($switchVariable, 1);
    SetValueInteger ($buttonCounter, 0);
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}

Mit

$dt  = time() - $_IPS['OLDCHANGED'];

bekommst Du die Dauer zwischen 2 Statusänderungen in Sekunden und kannst damit ein Doppelklick von einem einfachen Klick unterscheiden. Wenn Du es auf Millisekunden genau haben willst, dann musst Du eine Floatvariable für das Zwischenspeichern der Millisekunden anlegen und dann mit

    $last = GetValueFloat(12345);
    $now = microtime(true);
    $dt = round(($now-$last)*1000);
    SetValueFloat(12345, $now);

die Doppelklickdauer ausewerten.

Hallo Silberstreifen,

danke für den Tipp, hab das eben noch in der Doku nach gelesen, da sich meine Variable nicht ändert sondern nur aktualisiert müsste ich auf „OLDUPDATED“ gehen.

Allerdings ist mir noch nicht ganz klar wo ich die ID der Variable hier einsetze.
Desweiteren müsste ich aber noch eine Verzögerung einbauen ? Ich möchte zum einen auf einen 1-fach Klick und zum anderen auf einen Doppelklick reagieren, bedeutet ich muss die 2-3 Sekunden warten ob 2 mal oder einmal geklickt wurde ?

neuer Versuch

    if(IPS_GetScriptTimer($_IPS['SELF']) == 0){
        IPS_SetScriptTimer($_IPS['SELF'], 1);
    }else{
        IPS_SetScriptTimer($_IPS['SELF'], 0);
        if($_IPS['SENDER']=='Variable'){
            echo "Doppelklick";
        }else{
            echo "Einfachklick";
        }
    }

Grüße
Jürgen

Hallo Jürgen,

funktioniert perfekt!
Wunderbar, herzlichen Dank!

Gruß,

1 „Gefällt mir“