Länge eines Impulses ermitteln


//Trigger: Boolean Variable!

//Hier die Maximale Zeit angeben, die der Taster gedrückt werden könnte
$maxpushtime=10; //10 Sekunden

function myCode($pushlen)
{
//Hier kommt euer Code rein:
  global $IPS_SELF;
  IPS_LogMessage($IPS_SELF, "Push Length: ".$pushlen); //KernelLog -> Custom
//Hier ist euer Code zuende
}

//-- Ab hier muss nichts verändert werden!
//Nur Variablen Trigger erlaubt
if($IPS_SENDER != "Variable") { return; }

//Hilfsvariable erstellen, falls nicht vorhanden
$pushtimevar=$IPS_VARIABLE."_PressTime"; //Integer
if(!IPS_VariableExists($pushtimevar)) {
 IPS_CreateVariable($pushtimevar, "Integer");
}

//Gleichzeitige Scriptausführung verhindern
if (IPS_SemaphoreEnter($IPS_SELF, $maxpushtime * 1000))
{
 if($IPS_VALUE) //Taster gedrückt?
 {
  SetValueInteger($pushtimevar, time());
 } else { //Auswerten wie lange gedrückt wurde
  myCode(time()-GetValueInteger($pushtimevar));
 }
 IPS_SemaphoreLeave($IPS_SELF);
}

Bitteschön :slight_smile:

$pushlen ist eine Zahl zwischen 0-x Sekunden.

paresy

Diese Script misst die Zeit zwischen einem Flakenwechsel von TRUE auf FALSE.

D.h. Wenn die Variable TRUE wird, wird die Zeit gespeichert und sobald die Variable auf FALSE geht, wird die Zeit zwischen TRUE->FALSE berechnet.


//Trigger: Boolean Variable!

//Hier die Maximale Zeit angeben, die der Taster gedrückt wird
$maxpushtime=10; //10 Sekunden

function myCode($pushlen)
{
//Hier kommt euer Code rein:
global $IPS_SELF;
IPS_LogMessage($IPS_SELF, "Push Length: ".$pushlen); //KernelLog -> Custom

//Hier ist euer Code zuende
}

//-- Ab hier muss nichts verändert werden!
//Nur Variablen Trigger erlaubt
if($IPS_SENDER != "Variable") { return; }

//Hilfsvariable erstellen, falls nicht vorhanden
$pushtimevar=$IPS_VARIABLE."_PressTime"; //Float
if(!IPS_VariableExists($pushtimevar)) {
 IPS_CreateVariable($pushtimevar, "Float");
}

//Gleichzeitige Scriptausführung verhindern
if (IPS_SemaphoreEnter($IPS_SELF, $maxpushtime * 1000))
{
if($IPS_VALUE) //Taster gedrückt?
{
  SetValueFloat($pushtimevar, myMicroTime());
} else { //Auswerten wie lange gedrückt wurde
  myCode(myMicroTime()-GetValueFloat($pushtimevar));
}
IPS_SemaphoreLeave($IPS_SELF);
}

function myMicroTime()
{
//Wert verkleinern, damit Float Wert genug Nachkommastellen bietet
return microtime(true) - 1192350000;
}

Hier die HighPrecision Variante :slight_smile:

Da IPS intern die Floats nur als Single speichert, muss man den Wert in PHP verkleinern, damit genug Nachkommastellen für die Genauigkeit vorhanden sind. Da wir Zeitvergleiche machen, hat dieser Trick keinen Nachteil.

paresy

Donnerwetter,

wusste nicht, das es so aufwendig ist, einen Tastendruck zu ermitteln

Ich kuck mir das natürlich auch an.

Danke paresy

Franz

Hmmm, versteh nur nicht, wie ich das ganze interpretieren soll. Ich habe zwar im PHP Manual nachgelesen betreffend ‚microtime‘, nur wurde ich nicht schlauer.

Wenn ich den Taster normal drücke z.B. habe ich das:

Push Length: 28155.888722897

wenn ich nun ~3 sekunden drücke, habe ich dann das:

Push Length: 28164.591290951

Was gibt mir diese Variable wieder? Ich entdecke nirgends die ~3 Sekunden

Franz

Hallo Franz,

das Skript funktioniert. Es zeigt den gemessenen Wert in Sekunden mit Nachkommastellen.

Bist Du sicher, dass Du das Skript 1:1 kopiert hast?

Der Trigger muss OnChange erfolgen.

Gruß
HJH

Hallo,

ich denke dass ich das noch hinkriege ! :wink:

Fakt ist, es klappt dennoch so nicht richtig. Manchmal kommt es dennoch vor dass das Skript komische Werte liefert. Da bei einem normalen Tastendruck die Zeitspanne so gering ist, kann es vorkommen, dass das Skript zuerst mit Wert FALSE ausgeführt wird und dann erst mit TRUE was dann zu der Falschauswertung führt.
Paresy hat natürlich den entscheidenden Tipp gegeben: Ein kleines IPS_Sleep(100) eingebaut und schon geht es (mit dem kleinen Übel, dass alle Werte um 100ms verfälscht sind, doch so genau brauch ich eh nicht.)

Nochmal vielen Dank an Paresy mit seiner unermüdlichen Hilfe, uns PHP Neulingen immer wieder gute Tipps zu geben

mfG Franz

Vor diesem Kommentar


//Gleichzeitige Scriptausführung verhindern

muss folgendes Eingefügt werden, wenn man komischer Werte bekommt:


if(!$IPS_VALUE) {
 IPS_Sleep(100);
}

Den Wert (100ms) kann man je nach Fall runter/hochsetzen.

paresy