wie kann ich effizient die länge eines Tastendrucks messen?
Gegeben ist ein Taster, der bei Druck TRUE liefert, und im Ruhezustand FALSE führt.
Ich möchte gerne diese Dauer ermitteln.
Ich habe ein Skript geschrieben mit IPS_GetUpDate, aber wenn die Impulse zu kurz sind, z.B. normaler kurzer Tastendruck, dann habe ich falsche Werte drin stehen, resp. mein Skript wird nur einmal getriggert, nämlich beim FALSE, obwohl mein Debugger mir eindeutig angibt, dass er TRUE und FALSE erkannt hat, und mein Skript auf OnChange hin getriggert wird.
Das Ziel ist es, ab einer bestimmten Länge des Tastendrucks, den PIRI auszuschalten, damit das Licht permanent anbleibt, bis zum nächsten Tastendruck
Hier das was ich zusammengeschrieben habe bisher:
$Level_id = "LEVEL_2";
$push_button = GetValueBoolean($Level_id."_FLOOR_PB_LIGHT");
if ($push_button == TRUE)
{
$start_time = IPS_GetUpdateTime($Level_id."_FLOOR_PB_LIGHT");
SetValueInteger($Level_id."_FLOOR_START_TIME", $start_time);
return;
}
if ($push_button == FALSE)
{
$stop_time = IPS_GetUpdateTime($Level_id."_FLOOR_PB_LIGHT");
SetValueInteger($Level_id."_FLOOR_STOP_TIME", $stop_time);
}
// Disable the PIRI
$start_time = GetValueInteger($Level_id."_FLOOR_START_TIME");
$stop_time = GetValueInteger($Level_id."_FLOOR_STOP_TIME");
if ($stop_time - $start_time > 2) SetValueBoolean($Level_id."_FLOOR_PIRI_DISABLE", True);
// Enable PIRI again
if ($stop_time - $start_time < 2) SetValueBoolean($Level_id."_FLOOR_PIRI_DISABLE", False);
versuche es mal mit: $variable = $IPS_VALUE; Das soll verhindern dass ein Zustand verloren geht, wenn der Wert für $variable sich zu schnell ändert.
Ich sehe gerade, Du benutzt IPS_GetUpdatetime(). Ich weiss nicht wie genau die Variable ist. Wahrscheinlich ist es besser eine Variable für den Start zu definieren und dann die php-Funktion microtime zu verwenden. Bei Stop subtrahierst Du dann einfach vom aktuellen microtime die Startzeit.
es ist tatsächlich so, dass wenn ich einen normalen Impuls auf einen taster gebe, d.h. erfahrungsgemäss 0,5 s ~, dann geht tatsächlich nichts. Dann wird das Skript nur einmal getriggert, obwohl 2 Flankenwechsel da waren. Im debugger, wie schon erwähnt, wurden sie auch erkannt.
@HJH: Ich werde mir dieses Skript mal anschauen und ausprobieren
habe mir das nochmal durch den Kopf gehen lassen, wenn das Script nur mit False getriggert wird ohne das vorher true das script getriggert hat sind es bei dir ja immer Impulse < 2, dann müßte folgendes Script funktionieren, nur so ne Idee, parobiers mal aus.
$Level_id = "LEVEL_2";
$push_button = GetValueBoolean($Level_id."_FLOOR_PB_LIGHT");
if ($push_button == TRUE)
{
$start_time = IPS_GetUpdateTime($Level_id."_FLOOR_PB_LIGHT");
SetValueInteger($Level_id."_FLOOR_START_TIME", $start_time);
SetValueInteger("push_true",1);
return;
}
if ($push_button == FALSE)
{
$stop_time = IPS_GetUpdateTime($Level_id."_FLOOR_PB_LIGHT");
SetValueInteger($Level_id."_FLOOR_STOP_TIME", $stop_time);
}
// Disable the PIRI
$start_time = GetValueInteger($Level_id."_FLOOR_START_TIME");
$stop_time = GetValueInteger($Level_id."_FLOOR_STOP_TIME");
$push_true = GetValueInteger("push_true");
if ($push_true == 1)
{
if ($stop_time - $start_time > 2) SetValueBoolean($Level_id."_FLOOR_PIRI_DISABLE", True);
// Enable PIRI again
if ($stop_time - $start_time < 2) SetValueBoolean($Level_id."_FLOOR_PIRI_DISABLE", False);
setValueInteger("push_true",0);
}
else
{
SetValueBoolean($Level_id."_FLOOR_PIRI_DISABLE", False);
}
so wie ich das verstehe wird nur gemessen, wenn diese ‚push_true‘ Variable auch tatsächlich durch ein Drücken des Tasters vorher gesetzt wurde.
Das Problem ist leider nur, dass das Skript nur einmal getriggert wird, obwohl zwei Flankenwechsel statt fanden. Das scheint ein internes IPS Problem zu sein, wie HJH schon erwähnte.
Ich werde dennoch das Skript probieren.