Hi,
ich habe mal vor einiger Zeit eine ähnliche Funktion gebaut (wollte ich eigentlich auch nochmal säubern :D). Im Code sind zwar Funktionen aus meinen eigenen Libs, aber die Logik kannst Du dir sicher abgucken (bzw. direkt Deine Ids statt meinen Funktionen einsetzen).
Das Skript wird bei mir von der Daten Variable (FS20) des Lichts Boden Treppe bei einem Update angestartet. Ich schalte damit das bei doppeltem Drücken des Lichts auf dem Dachboden zusätzlich das Licht unten auf dem Flur an oder aus.
Prinzipiell (z.B. bei FS20) müsstest Du im ersten Teil Schaltbefehle für Geräte, welche beim Doubleclick geschaltet werden sollen einbauen können. Zusätzlich müsstest Du, im von mir unbenutzen Teil, nach dem zweiten else, die Schaltbefehle für Single Click auslösen. Bei Fs20 z.B. vorbereitend ein Dummy Device anlegen und einen Schalter darauf programmieren und das Skript an die Daten Variable hängen.
<?
// Evaluate Event Sender
if($IPS_SENDER == "Execute") {
echo "Sender: Execute; Diese Skript kann nicht manuell ausgeführt werden (jedenfalls nicht mit einem sinnvollen Ergebnis).
";
}
// Function in dev to handle time and behaviour on fs20 presses
require "functions.inc.php";
// last data is previous data, repeated press?
if($IPS_VALUE == br_objGetVar($IPS_SELF,"last_data")){
// User sent the same command repeadedly
print "Last Data is previous data; ";
if((time() - GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/) >= 2 )){
// 2 seconds
print "Time is greater than 2 seconds; ";
} else {
// doubleclick
print "Time is NOT greater.";
// Status Switch by FS20
if($IPS_VALUE == 0){
// off
if(!GetValueBoolean(12649)){
print "Switch Flur off";
br_switch(array(59848),false);
}
}
if($IPS_VALUE == 20){
}
if($IPS_VALUE == 17){
// on
print time();
print " update " .GetUpdateTime(12649);
if((GetValueBoolean(12649)) && (
time() - GetUpdateTime(12649) <= 2 )){
print "Switch Flur on ";
br_switch(array(59848),true);
}
}
if($IPS_VALUE == 19){
// nothing
}
}
} else {
print "Last Data is NOT prev. data; ";
if((time() - GetUpdateTime(12649 /*[Boden\Licht Treppe\Status]*/) >= 2 )){
// 2 seconds
print "Time is greater than 2 seconds; But no doubleclick. ";
} else {
// doubleclick
print "Time is NOT greater. But no doubleclick.";
}
}
// Save last Data under var last_data skript as parent
br_objSetVar($IPS_SELF,"last_data",$IPS_VALUE);
?>
Einfach einen IPS_SetScriptTimer($IPS_SELF, xx Sekunden); mit jedem Tastendruck neu aufziehen und einen Zähler benutzen.
Hier dann den Code zum Licht anschalten:
if ($IPS_SENDER == "TimerEvent")
{
if($Zähler == 1) .... führe diesen Code aus
if($Zähler == 2) .... führe diesen Code aus
IPS_SetScriptTimer($IPS_SELF, 0);
return;
}
Da ist nicht viel mit Code. Ich beschreibe, wie ich es mache:
Bei den FS20 Fernbedienungen hast Du ja pro Taste eine Boolean Variable, die sich bei jedem Druck ändert von TRUE auf FALSE, bzw. umgekehrt. Dann hat jede Taste noch eine Integer Variable. Bei einem kurzen Druck geht die Integer Variable auf 18, hält man die Taste länger gedrückt geht die Variable auf 26 (habe gerade kein IPS zur Hand, bin mir aber fast sicher, dass das so ist).
Die Scripte, die Du bei kurzem Tastendruck ausführen willst, triggerst Du auf „ausgelöstes Ereignis“, dort die Data Variable der Taste der FS20 Fernbedienung „bei bestimmtem Wert“ --> 18 und die Scripte, die Du bei langem Tastendruck ausführen willst triggerst Du auf den Wert 26.
Ich habe bei mir eine Excel-Tabelle mit den Codes angelegt. Klingt im ersten Moment blöd, aber wenn was neues dazukommt oder es irgendwo Probleme geben sollte, dann kann die unter Umständen weiterhelfen …