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!
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
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
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.
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
}
?>
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);
?>
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.
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.