Licht je nach Dauer des Tastens schalten

Hallo,

nachdem ich mich den einen oderen anderen Tag damit beschäftigt habe, meine derzeitige Lichtsteuerung in IPS abzubilden und mir dieses auch soweit gelungen ist, habe dennoch eine Frage.

Zunächst das Script:

<?
/*IPS_SENDER sichtbar machen*/
setvaluestring(39887 /*[Flur-/Treppenhauslicht\Velleman USB\Taster DG\ipssender]*/,$IPS_SENDER);

/*Ist das Licht an?*/
$status =GetValueBoolean(29853 /*[Flur-/Treppenhauslicht\Velleman USB\Licht DG]*/);

if ($status)
	/* Licht ist bereits eingeschaltet und es wird erneut getastet */
	{
	SetValueBoolean(29853 /*[Flur-/Treppenhauslicht\Velleman USB\Licht DG]*/,false);
	SetValueBoolean(42015 /*[Flur-/Treppenhauslicht\Velleman USB\Taster DG\Dauerlicht]*/,false);
	VELLEUSB_WriteDigitalChannel(30407 /*[Flur-/Treppenhauslicht\Velleman USB]*/,3,false);

	exit;
	/*Nun soll da Script beendet werden. Licht ist aus.*/
	}
else
	{
	/* Licht ist derzeit ausgeschaltet und es wird getastet */
	SetValueBoolean(29853 /*[Flur-/Treppenhauslicht\Velleman USB\Licht DG]*/,true);
	VELLEUSB_WriteDigitalChannel(30407 /*[Flur-/Treppenhauslicht\Velleman USB]*/,3,true);
	/*Es soll eine Sekunde gewartet werden, um zu prüfen, ob der Taster >= 1 sec. gedrückt wurde*/
	sleep (1);
	$dauerlicht = GetValueBoolean(32091 /*[Flur-/Treppenhauslicht\Velleman USB\Taster DG]*/);
	if (!$dauerlicht)
		{
		
		/*nach 9 sec. soll das Licht wieder ausgehen und alles soll auf "Null"*/
  		sleep(9);
		SetValueBoolean(29853 /*[Flur-/Treppenhauslicht\Velleman USB\Licht DG]*/,false);
		VELLEUSB_WriteDigitalChannel(30407 /*[Flur-/Treppenhauslicht\Velleman USB]*/,3,false);
		SetValueBoolean(42015 /*[Flur-/Treppenhauslicht\Velleman USB\Taster DG\Dauerlicht]*/,false);
		}
		else
		{
		SetValueBoolean(42015 /*[Flur-/Treppenhauslicht\Velleman USB\Taster DG\Dauerlicht]*/,true);
		/*Dauerlicht: Licht bleibt bis zum nächsten Tasten an*/
 		}

	}
?>

Habe versucht, es gescheit zu kommentieren. Beim Tasten wird das Licht ausgeschaltet, wenn es beim Start des Scripts eingeschaltet war und gut. Andernfalls wird eingeschaltet. Es wird 1 sek. gewartet, dann geprüft, ob der Taster noch gedrückt ist. Wenn ja, dann wird nur noch die Variabele Dauerlicht gesetzt. Wenn nein, dann soll sich das Licht nach 9 sek. (später mal 3 min) ausschalten. Nur die Funktion sleep(9) stört mich ein wenig. Oder muß ich mir da keine Sorgen wegen der Performance machen, wenn ich nach diesem Schema mehrere Scripte am Laufen habe?

Ich habe im Forum auch etwas von $IPS_SetScriptTimer gelesen. Da wird dann im Objektbaum ein Timer-Ereignis erstellt. Ist das richtig? Ist das eine bessere, saubere Variante? Könnt ihr das erklären? In meinen Fall hat $IPS_SENDER den Wert „Variable“. Das Script lasse ich ausführen, wenn der Wert der Taster-Variable (Eingang am Board) den Wert „True“ bekommt.

Nun ist es derzeit so, daß bei aktivem Licht und erneutem Tasten das Licht auch aus geht, aber im Objektbaum vor dem Script ein rotes Ausrufezeichen erscheint, was auf Scriptfehler hinweist, richtig? Was habe ich da falsch gemacht? Das hat doch irgendwas mit der sleep-Funktion zu tun, oder? Wird das Script dabei evtl. zweimal ausgeführt?

Wie löse ich diese Sachen sauber?

Danke für Vorschläge.

Andreas.

PS: Habe dabei ein Velleman-Board benutzt.

Hallo Andreas,

ersetze bitte exit durch return!

Da es ein in sich geschlossener if-else-Block ist, ist kein exit/return notwendig.

Und für sleep nimmst du besser IPS_sleep.

stimmt, habe nur das exit gesehen das den Fehler verursacht.

Hallo zusammen.

Soll heißen, das „exit“ raus. Und sleep(9) gegen ips_sleep(9000) tauschen? lt. Doku (IPS_Sleep: IP-Symcon :: Automatisierungssoftware) sollen nur Wartezeiten bis einige Sekunden damit gemacht werden. Im Live-Betrieb möchte ich das Licht 3 min (also 180000 ms) angeschaltet lassen. Welche Möglichkeit bzw. Lösung gibt es dafür?

Habt ihr evtl. für mein kleines „Projekt“ einen anderen Lösungs- / Scriptvorschlag?

Andreas.

Hallo,

ich bin zwar kein Experte aber ich bin mir sicher das das besser über Timer gemacht werden kann, lies doch mal in der Doku.

Gruß Michael

Das Stichwort ist ScriptTimer.

Damit setzt du die gewünschte Zeit, nach der das Script wieder gestartet wird. Dann kannst du auswerten, ob der Script-Start durch das TimerEvent erfolgt ist und entsprechend reagieren.

Auch wenn viele Leute über die Doku meckern, lesen bildet :D. Du findest genau deine Fragestellung dort
„Wie kann ich…?
… ein Gerät einschalten und nach z.B. 60 Sekunden wieder aussschalten?“

im ersten Beispiel.

Hallo,

das habe ich auch schon gelesen und in mein Script eingefügt. Dann wird bei mir ein TimerEvent im Objektbaum hinzugefügt, das mein Script dann alle 3 min. startet.?:confused:

if($IPS_SENDER == "TimerEvent")
 {
  //Aus Befehl
  ...

  //Timer ausschalten
  IPS_SetScriptTimer($IPS_SELF, 0);
 } else {
  //An Befehl
  ...
  
  //Timer anschalten
  IPS_SetScriptTimer($IPS_SELF, 60);
 }

Ist das nicht umständlicher? Oder habe ich dann ein Verständnisproblem? Wird vielleicht wegen

 IPS_SetScriptTimer($IPS_SELF, 0);

das TimerEvent nur einmal ausgefüht (weil 0) und bleibt jedoch im Objektbaum stehen?

Wat`n Wirrwarr. Aber irgendwann fällt auch bei mir der Groschen :slight_smile:

Gruß
Andreas.