2x gleichen Tastendruck abfragen

Guten Morgen zusammen,

ich benötige ein kleinen Tipp:

Ich würde gerne abfragen, ob eine Taste kurz hintereinander zweimal gedrück wurde.
D.h. es wird ein Skript gestartet beim ersten Tastendruck.
Bei einem zweiten Tastendruck soll ein Teil davon nicht ausgeführt werden.
Nachdem beim ersten Tastendruck eine Variable gesetzt wird, dachte ich daran der Zeitstempel der Variablenänderung auszuwerten. Aber mit welchem Befehl kann man diesen auslesen?

Vielen Dank für die Hilfe und ein schönes Weihnachtsfest Euch Allen!

z.B. so

<?

$V = GetValue(14783 /*[Heizung\Heizungsregler Büro\Ventilposition]*/);

if ((time() - $V['VariableUpdated']) > 180)
{
    SetValue(46821 /*[.FHZ Überwachung\Letzte Aktualisierung]*/, $V);
}

?>

Hallo zusammen

Stand vor dem gleichen Problem, wollte einen Doppelklick auswerten.
BTW:

$V = GetValue(14783 /[Heizung\Heizungsregler Büro\Ventilposition]/);
-> müsste meiner Meinung nach IPS_GetVariable(… sein :wink:

Falls das betreffende Script mit dem Ereignis der Taste getriggert wird (OnChange) bekommt man mit [VariableUpdated] des bereffenden Tasters leider bereits den aktualisierten Timestamp zurück :frowning:

Habe dies dann in etwa wie folgt gelöst:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : DblClick.ips.php
Trigger  : OnChange Taster .Up / .Dn
Interval : wird nach erstem Druck gestartet

*/

  $tDoubleClick = 2;    // innerhalb x Sekunden Doppelclick

  if (($IPS_SENDER == "Variable") &&
      ($IPS_VALUE == false))   // nur beim loslassen (ansonsten 2 Funksprüche...)
  {
    $varId = $IPS_VARIABLE;
    $objInfo = IPS_GetObject($IPS_SELF);
	 
    if (IPS_GetScriptTimer($IPS_SELF) != 0 &&  // noch innerhalb Zeit
        $objInfo['ObjectInfo'] == $varId)      // und diese Taste zuletzt
    {
      IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
      IPS_SetInfo($IPS_SELF, ""); // letzte Taste löschen
      
      // entsprechendes Script ausführen
      switch ($varId)
      {

        // ---------- z.B. Lichtscene Fernsehlicht
        case 41876:  /*[Devices\1. Stock\Bad\Lichtschalter\Btn_A.Dn]*/:
		  // dies wäre dann das Ereignis DoppelClick für entsprechende Taste
		  // hier einfach Schalten und Walten nach belieben... ;)
          break;

		// weitere Tasten.....  
        case 40820:
          break;

      }
    }
    else
    {
      IPS_SetInfo($IPS_SELF, $varId); // letzte Taste merken
      IPS_SetScriptTimer($IPS_SELF, $tDoubleClick);
    }
  }
  
  else if ($IPS_SENDER == "TimerEvent")
  {
    IPS_SetInfo($IPS_SELF, ""); // letzte Taste löschen
    IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
  }
?>

Dem Script einfach die entsprechenden Tasten zuorndnen (Ereignis, Variablenänderung des Taster-Status) und den entsprechenden Code einsetzen.
Beim ersten Druck wird die Taste zwischengespeichert und ein Timer (hier 2 sec) gestartet, beim zweiten Druck (festgestellt durch noch laufenden Timer) wird die Taste mit der zuletzt gedrückten verglichen, falls gleich -> entsprechender Code ausgeführt.

vielleicht kann’s jemand gebrauchen…

Gruss
und Guten Rutsch!
Tinu

Kann mir bitte wer nen (gedanklichen) Tritt versetzen, ich bekomm
den Doppelklick nicht ausgewertet bw. schaltet direkt das
IPS_RunScript (23049 /[Moods\BAD T (Untergeschoss)\Aus]/);
auch wenn der 2te Klick erst nach 10 Sekunden kommt…


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : DblClick.ips.php
Trigger  : OnChange Taster .Up / .Dn
Interval : wird nach erstem Druck gestartet

*/

  $tDoubleClick = 3;    // innerhalb x Sekunden Doppelclick

  if (($IPS_SENDER == "Variable") &&
      ($IPS_VALUE == false))   // nur beim loslassen (ansonsten 2 Funksprüche...)
  {
    $varId = $IPS_VARIABLE;
    $objInfo = IPS_GetObject($IPS_SELF);

    if (IPS_GetScriptTimer($IPS_SELF) != 0 &&  // noch innerhalb Zeit
        $objInfo['ObjectInfo'] == $varId)      // und diese Taste zuletzt
    {
      IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
      IPS_SetInfo($IPS_SELF, ""); // letzte Taste löschen

      // entsprechendes Script ausführen
      switch ($varId)
      {

        // ---------- z.B. Lichtscene Fernsehlicht
        case 30222:
        IPS_RunScript (23049 /*[Moods\BAD T (Untergeschoss)\Aus]*/);
          // dies wäre dann das Ereignis DoppelClick für entsprechende Taste
          // hier einfach Schalten und Walten nach belieben... ;)
          break;

        // weitere Tasten.....
   //     case 40820:
    //      break;

      }
    }
    else
    {
      IPS_SetInfo($IPS_SELF, $varId); // letzte Taste merken
      IPS_SetScriptTimer($IPS_SELF, $tDoubleClick);
    }
  }

  else if ($IPS_SENDER == "TimerEvent")
  {
    IPS_SetInfo($IPS_SELF, ""); // letzte Taste löschen
    IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
  }
?>

Vielen Dank !

Hallo djtark

Sieht so aus, als ob der Timer nicht gestoppt würde…

Hast du denn das Ereignis auch direkt unter dem Script angelegt (siehe Anhang) ?
Exisitiert denn der Timer unter dem Script ?

Gruss
Tinu

…doch, doch der Timer wird gestoppt und das Ereignis liegt auch
in der richtigen Ebene.

Ich komm nicht drauf worans liegt…

Ich hatte mir mal folgendes Skript mit einigem Debug Code geschrieben um rauszufinden wie das klappt (vielleicht hilfsts Dir; die Sachen mit br_ musst Du ggf. austauschen, da es meine eigenen Hilfsfunktionen sind):

<?

// Evaluate Event Sender
if($IPS_SENDER == "Execute")    {
    echo "Sender: Execute; Diese Skript kann nicht manuell ausgeführt 
werden (jedenfalls nicht mit einem sinnvollen Ergebnis).
";
}
// Function in dev to handle time and behaviour on fs20 presses

require "functions.inc.php";



// last data is previous data, repeated press?
if($IPS_VALUE == br_objGetVar($IPS_SELF,"last_data")){
// User sent the same command repeadedly
		print "Last Data is previous data; ";
		
			if((time() - GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/) >= 2 )){
					// 2 seconds
					print "Time is greater than 2 seconds; ";
			} else {
					// doubleclick
					print "Time is NOT greater.";

				// Status Switch by FS20
				if($IPS_VALUE == 0){
					// off
					if(!GetValueBoolean(12649 /*[Boden\Licht Treppe\Status]*/)){
						print "Switch Flur off";
						br_switch(array(59848 /*[Wohnung\Flur\Licht Wand]*/),false);
					}
	  			}
			   if($IPS_VALUE == 20){

				}
			   if($IPS_VALUE == 17){
						// on
						print time();
						print " update " .GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/);
					if((GetValueBoolean(12649 /*[Boden\Licht Treppe\Status]*/)) && (
					time() - GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/) <= 2 )){
						print "Switch Flur on ";
						br_switch(array(59848 /*[Wohnung\Flur\Licht Wand]*/),true);
					}
				}
			   if($IPS_VALUE == 19){
						// nothing
				}

			}
} else  {
	print "Last Data is NOT prev. data; ";
			if((time() - GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/) >= 2 )){
					// 2 seconds
					print "Time is greater than 2 seconds; But no doubleclick. ";
			} else {
			      // doubleclick
					print "Time is NOT greater. But no doubleclick.";

			}

}
// Save last Data under var last_data skript as parent
br_objSetVar($IPS_SELF,"last_data",$IPS_VALUE);
?>

Grüße, Benjamin

Dann müsstest du wohl mal ein paar Log-Infos einbauen:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : DblClick.ips.php
Trigger  : OnChange Taster .Up / .Dn
Interval : wird nach erstem Druck gestartet

*/

  IPS_LogMessage("DblClick", "IPS_SENDER:".$IPS_SENDER." IPS_SELF:".$IPS_SELF);

  $tDoubleClick = 3;    // innerhalb x Sekunden Doppelclick

  if (($IPS_SENDER == "Variable") &&
      ($IPS_VALUE == false))   // nur beim loslassen (ansonsten 2 Funksprüche...)
  {
    $varId = $IPS_VARIABLE;
    $objInfo = IPS_GetObject($IPS_SELF);

    if (IPS_GetScriptTimer($IPS_SELF) != 0 &&  // noch innerhalb Zeit
        $objInfo['ObjectInfo'] == $varId)      // und diese Taste zuletzt
    {
      IPS_LogMessage("DblClick", "Pressed twice ".$varId);
      IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
      IPS_SetInfo($IPS_SELF, "+"); // letzte Taste löschen

      // entsprechendes Script ausführen
      switch ($varId)
      {

        // ---------- z.B. Lichtscene Fernsehlicht
        case 30222:
        IPS_RunScript (23049 /*[Moods\BAD T (Untergeschoss)\Aus]*/);
          // dies wäre dann das Ereignis DoppelClick für entsprechende Taste
          // hier einfach Schalten und Walten nach belieben... ;)
          break;

        // weitere Tasten.....
   //     case 40820:
    //      break;

      }
    }
    else
    {
      IPS_LogMessage("DblClick", "New key, starting timer for ".$varId);
      IPS_SetInfo($IPS_SELF, $varId); // letzte Taste merken
      IPS_SetScriptTimer($IPS_SELF, $tDoubleClick);
    }
  }

  else if ($IPS_SENDER == "TimerEvent")
  {
    IPS_LogMessage("DblClick", "Timer expired");
    IPS_SetInfo($IPS_SELF, "-"); // letzte Taste löschen
    IPS_SetScriptTimer($IPS_SELF, 0);  // Timer stopp
  }
?>

Und dann berichten, was alles unter „DblClick“ geloggt wurde…

Gruss
Tinu

das log-Ergebnis siehe hier - fällt Euch was auf ?

mir nicht.

Ich habe das Skript uebernommen und es funktioniert gut nachdem ich das Ereigniss eingestellt habe auf „Variable update“ stat „Variable change“.
Nach den DoppeltClick aendert sich den Status nicht. Es gibt nur ein „update Ereigniss“ wegen das eindruecken des Tasters.

danke das kann ein Ansatz sein. Wird abends getestet !

Ich hab so was ähnliches so gelöst:
Da frage ich hab, wann das Script das letzte mal gestartet wurde. Villeicht hilfts ja was.

<?
$zeitspanne=3;
$S=IPS_GetScript(18823 /*[Highchart	est_pause]*/);
if (time()-$S['LastExecute'] > $zeitspanne)
		{
		echo "Mach das";
		}
		else {
		echo "Mach michts";
		}
		
?>

Hallo djtark

Sieht ja gar nicht so schlecht aus :wink:

18:20:37 wird „Moods\UG Baden RGB\Value“ auf false gesetzt
18:20:40 wird „Moods\UG Baden RGB\Value“ nochmals auf false gesetzt
-> innerhalb der von dir angegebenen 3 sec => Doppelclick

Ist denn die Variable 30022 („Moods\UG Baden RGB\Value“) der Zustand eines Tasters ?
Oder verändert ev. das Script „RGB Zufall“ diese Variable ?

Nur so zum Verständnis: meine Taster sind enocean-Taster, welche jeweils den Status (Wippe Oben/Unten) in einer Variablen abbilden (Taster gedrückt=true, Taster losgelassen=false).
Genau diese Statusvariable ist dann dem Script angehängt.

Gruss
Tinu

auch das Ändern des Ereignisses von „Aktualisierung“ auf „Änderung“
führt nicht zum gewünschten Ergebnis.

Der 2te Druck wird stehts als Dblclick gewertet.

Das Script „RGB Zufall“ triggert die Variable
Variable 30022 („Moods\UG Baden RGB\Value“) welche
vom EIB-Taster beschrieben wird…

Ich probier nochmal die Änderung „UM“ für den Taster in der ETS,
mal schauen…