habe folgendes Problem:
Über das Auswerten meiner WINLIRC Button Variable möchte ich bei dem Druck auf eine bestimmte Taste ein Skript auslösen (Je nach Status -> TV an/aus, Reciever an/aus, Strom an/aus). Der gesamte an/aus Vorgang dauert jeweils circa 7 Sekunden.
Ich triggere das Toggle Skript auf „Bestimmter Wert [z.B. eHome = grüner Windows Button auf der MCE FB] der Variable …\WinLIRC\Taste“
Soweit kein Problem.
Mein Problem ist, wenn man die Taste an der FB länger gedrückt hält, dann kommt der gleiche Tastendruck mehrfach bei IPS an, und das Skript wird mehrfach gestartet, je nach Toggle Status schaltet es dann an und aus und alles kommt durcheinander.
Sonstige Triggerevents die IPS anbietet wären:
Bei Variablenänderung -> Geht nicht, da ich ja eine bestimmte FB Taste als Trigger will
Bei Variablenaktualisierung -> Geht auch nicht, weil ich dann selbigen oben beschriebenen Effekt hätte.
Irgendwie sehe ich gerade keinen Lösungsweg, hat jemand vieleicht eine Idee?
Mach den Haken „Nachfolgende Ereignisse ausführen“ weg. Dann kannst du jede Taste nur 1mal drücken und musst danach eine andere drücken, bevor die alten wieder geht. Ist also eine Kombination aus „Bei Änderung“ + „Bestimmter Wert“
Alternative b)
if (IPS_SemaphoreEnter($IPS_SELF, 1000)) //1 Sekunde totzeit
{
//Befehle ausführen
//...
//Semaphore wieder freigeben!
IPS_SemaphoreLeave($IPS_SELF);
}
Danke für die schnelle Antwort.
Methode 1 hatte ich schon probiert, geht nicht, da ja meine „ehome“ Taste ja ein toggle ist, diese also immer mindestens 2x gedrückt wird. (1x an 1x aus) mit o.g. Methode geht „aus“ dann nicht mehr.
Auch mit Methode b startet IPS mehrere Threads mit dem gleichen Skript.
Habe bei in der Doku gelesen, dass EnterSemaphore ja nicht verhindert, dass ein neues Skript gestartet wird, sondern nur die Abarbeitung aussetzt.
Ich muss aber doch verhindern, dass das Skript bei 5 Impulsen von FB überhaupt 5x gestartet wird.
wirft mir im Meldungfenster immer irgendwelche negativen Zahlen raus, egal wie schnell oder langsam ich die FB Taste drücke. Zwischen -0.000xxxx - -0.8xxxxxx. Demzufolge greift auch immer „if“ und das Skript wird nie zu Ende ausgeführt.
ist es besser einen Scripttimer zuverwenden
Meinst Du IPS_SetScriptTimer ($IPS_SELF,$time) ?
Die setzte mir doch nur einen Event, der das Skript nochmals nach $time auslöst, oder? Was ich brauch ist ja eine Verzögerung der sequenziellen Abarbeitung des Skripts?
Ich glaube ja, dass der Code keinen Fehler wirft, ich verstehe es nur nicht. Ist halt wie immer, das Problem ist an der Tastatur…
Ok, date formatiert und gibt mir den Timestamp ‚VariableUpdated‘ raus.
GMDate macht das Gleiche nur auf GMT bezogen.
Wenn ich das Skript ausführe zeigt er mir auch tatsächlich 00:05:42 als $zeit…
Denke das hat mir schonmal wieder ein Stück weitergeholfen, sobald ich unten am TV es live probiert habe melde ich mich.
Wenn man den Knopf gedrückt hält kommen die Befehle alle ca 300-500ms.
Aber irgendwie habe ich noch einen Denkfehler:
Ich will ja verhindern, dass ein Druck auf der FB von ca. 2 sekunden das Skript neu startet.
Wenn ich das Schalten m Skript nur ausführe, wenn $zeit grösser 2 Sekunden und jemand dauernd drückt, dann wird das Skript ja nie zu Ende ausgeführt, weil ‚VariableUpdated‘ ja auch permanent mit der aktuellen Zeit upgedatet wird?
Vielen Dank für Deine Hilfe. Unsere vorherigen Posts hatten sich zeitlich überschnitten, ggfls. kannst Du nach dem Skripttimer auch mal sehen [Schamesröte on…]
Auch mit Methode b startet IPS mehrere Threads mit dem gleichen Skript.
Das ist doch auch egal. Du willst ja, dass dein Code nicht doppelt ausgeführt wird… Ob nun das Skript ansich mehrfach ausgeführt wird, ist doch egal. RWNs Vorschlag macht das selbe… Ich mag aber meine zwei Zeilenlösung lieber
Es ist übrigens nicht möglich, dass das Skript nicht mehrfach ausgeführt wird. Auch wenn du den Timer deaktivierst, und wieder reaktivierst… Das sind auch 2 Vorgänge… und wenn jetzt der zweite Tastendruck schneller ist, als die Ausführung des ersten Skripts… Juhu…