Hallo korny und willkommen im Forum.
Eigentlich musst du nur deinen Taster auf onChange ein Script triggern lassen. Dann benötigst du eine Variable, die sich den aktuellen Vorgang (öffnen/schließen) merkt. Im Script prüfst du den Modus und entscheidest was als nächstes passieren soll.
Ich gehe mal davon aus, dass dein Fenster einen Taster für öffnen und einen für schließen vorsieht. So wie meine…
Modus 1 soll mal für Öffnen stehen und die 2 für Schließen
// Alle Settings im Funktionskopf
$OpenID = 12345; // Die InstanzID deines Fensterschalters für öffnen
$CloseID = 12346; // Die InstanzID deines Fensterschalters für schließen
$State=getValueInteger('FensterRichtung');
// Switch Block öffnen
switch($State)
{
case 1:
// Öffnen
FS20_SwitchMode($CloseID, false); // sicherheitshalber den "Runterfahrtaster" loslassen, falls noch "jemand am drücken" ist
FS20_SwitchMode($OpenID, true); // Hochfahrtaster drücken
setValueInteger('FensterRichtung', 2); // öffnen wurde angestoßen, nächste aktion muss also, wann auch immer, schließen sein
break;
case 2:
// Schließen
FS20_SwitchMode($OpenID, false); // sicherheitshalber den "Hochfahrtaster" loslassen, falls noch "jemand am drücken" ist
FS20_SwitchMode($CloseID, true); // Runterfahrtaster drücken
setValueInteger('FensterRichtung', 1); // schließen wurde angestoßen, nächste aktion muss demnach öffnen sein
break;
}
// Ende des switch Blocks
So, das wäre jetzt eine Wechselschaltung mit einem Taster (aus dem Stand getippt und ungetestet). Das solltest du erstmal ausprobieren bevor du weitermachst. Zwischendrin Stoppen ist noch nicht möglich. Dafür müssen wir noch etwas ergänzen.
Lektion 2: Stoppen
Um zu wissen wann man das Fenster Stoppen muss und wann nicht, weil es evtl schon vollkommen geschlossen oder vollkommen geöffnet ist, musst du wissen wie lange es dauert bis es soweit ist. Also mit der Stoppuhr messen. Wir brauchen Ausserdem eine Info was das Fenster grade macht. Fährt es noch oder ist es bereits fertig? Das merken wir uns in einer Boolean Variable. Nennen wir sie mal „FensterInAction“.
Erstmal die Änderungen in dem ersten Script:
// hier der Funktionskopf von eben
if (getValueBoolean('FensterInAction')) // Wenn das fenster noch fährt (egal in welche Richtung)
{
// Alles anhalten...
FS20_SwitchMode($OpenID, false);
FS20_SwitchMode($CloseID, false);
}
else // ...und wenn nicht...
{
// ...Dein Switchblock von oben
}
Jetzt wirst du dich sicher Fragen woher wir wissen ob das Fenster in Action ist oder nicht? Richtig, wissen wir nicht. Und darum kommt deine Stopuhr zum Einsatz. Wir setzen die Variable selbst auf Action wenn wir das Fenster starten und lassen sie nach X Sekunden sich selbst zurücksetzen. Das geht mit einem Timer.
Also. Im Switchblock den Status auf Action setzen und den Timer mit der gemessenen Laufzeit für das Fenster füttern.
case 1:
// Öffnen
SetValueBoolean('FensterInAction', true);
IPS_SetScriptTimer('ResetFensterAction', 20); //20 gemessene Sekunden angenommen
diese zwei zusätzlichen neuen Zeilen müssen natürlich auch bei Schließen (case 2) rein.
Der Scripttimer wird in diesem Beispiel nach 20 Sekunden das Script mit dem Namen „ResetFensterAction“ aufrufen. Und da steht nun folgendes drin:
// neues Script
SetValueBoolean('FensterInAction', false);
IPS_SetScriptTimer('ResetFensterAction', 0); // ende scripttimer
Wir starten also den Fenstermotor und merken uns in einer variable, dass wir es getan haben. Nach der gemessenen Laufzeit des Motors setzen wir die Variable zurück. Nun können wir prüfen ob der Motor läuft und ob der Druck auf den Taster eine Stopaktion oder eine Anfahraktion auslösen muss. Das ist alles.
Gruß,
Toni