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
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.
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
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