Länge eines Impulses ermittlen ?

Hallo liebe Gemeinde,

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);

Franz

Hallo Franz,

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.

Ich wünsche einen schönen Tag.

Christoph.

Christoph hat recht, das gleiche Problem hatte auch RWN vor kurzem, siehe:
http://www.ipsymcon.de/forum/showthread.php?t=3826&page=4

Gruß Thomas

Hallo Franz,

es gibt ein Problem mit dem Zeitstempel für das Update von Variablen bzw. für die Ausführung von Skripten.

Der Zeitstempel kann um bis zu 1 Sekunde vom tatsächlichen Wert abweichen.

Es ist daher zur Zeit nicht möglich Zeitdifferenzen kleiner als 1 Sekunde zu messen.

Das Problem ist bekannt und wird von Paresy bereits bearbeitet.

Mit dem angehängten Skript lässt sich der Fehler beobachten.

Gruß
HJH

TimeTest.ips.php.txt (849 Bytes)

Danke Leute,

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

Danke

Franz

Hallo Franz,

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);
}

Gruß Thomas

Danke,

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.

Ich nehme Ideen immer gerne entgegen

Franz

Hi Paresy,

diese beiden Skripte von dir wären sicherlich in „Anleitungen / Nützliche PHP Scripte“ sehr gut aufgehoben :slight_smile:

Gruß
Olli

Hab sie mal verschoben:

paresy