Wie Skript in x Minuten ausführen bei Eintritt eines Ereignisses?

In der DOKU habe ich schon was zu IPS_CreateEvent + SetEvent durchgelesen.

Dazu finde ich leider aber keine Möglichkeit, mit der ich in einem Skript ein Ereignis neu anlegen kann mit Startzeitpunkt in X Minuten. Das Ereignis sollte nach Ausführung deaktiviert werden.

Hat jemand dies vielleicht umgangen mit Berechnung der aktuellen Uhrzeit + x Minuten und der Anlage über eine einmalige Uhrzeit???

Ich lasse über eine Windberechnung meine Jalousien bei zu starkem Wind hochfahren.
Nach 45 Minuten oder auch 60 Minuten möchte ich die Jalousien wieder auf den alten Stand zurückfahren.
(Eine erneute Windprüfung wird natürlich vorgenommen)…
Bisher ist das mit einem SLEEP gelöst und eine hochsetzung in der PHP.INI :-(.

Hier das Zurückfahrskript mit dem SLEEP.

Bisher schaut das Zurückfahrskript so aus:

<?
// Zurückfahrskript
$windauslesen=GetValueInteger(57196 /*[Wind\DS2423 Windzaehler\Zähler Wind \Wind m/s]*/);
if ($windauslesen>=14)//Prüfung ob Wind immer noch da ist, falls ja goto exit:
     {
	  goto sprungmarke_exitfalse;
     }
     else
     {
     sleep(2700); // Es wird 45 Minuten gewartet zyklisches Ere. bis Jalousien wieder runter fahren.
     $zurueckkueche=GetValueInteger(43159 /*[Raffstoren\1.Küche Raffstore\Alter Stand]*/);
     $zurueckessen=GetValueInteger(29601 /*[Raffstoren\2.Essen Raffstore\Alter Stand]*/);
     $zurueckwohnen=GetValueInteger(20320 /*[Raffstoren\3.Wohnen Raffstore\Alter Stand]*/);
	  ZW_DimSet(31642 /*[Raffstoren\1.Küche Raffstore]*/, $zurueckkueche); // zurückfahren der Jalousien auf ausgangsposition
	  sleep(6);
	  ZW_DimSet(48945 /*[Raffstoren\2.Essen Raffstore]*/, $zurueckessen); // zurückfahren der Jalousien auf ausgangsposition
	  sleep(6);
	  ZW_DimSet(15030 /*[Raffstoren\3.Wohnen Raffstore]*/, $zurueckwohnen); // zurückfahren der Jalousien auf ausgangsposition
     SetValueInteger(41711 /*[Raffstoren\hochgefahren]*/, 0); //Rücksetzung auf nicht ausgeführt
	  goto sprungmarke_exittrue;
	  }
sprungmarke_exitfalse:
setValueBoolean(17469 /*[Raffstoren\Zurueckfahrskript durchlaufen]*/, FALSE);
goto sprungmarke_exit;

sprungmarke_exittrue:
SetValueBoolean(17469 /*[Raffstoren\Zurueckfahrskript durchlaufen]*/, TRUE);
$uhrzeit = date("H:i.s");
$mailcontent = "Der Wind ist zurueckgegangen. Deshalb fahren die Jalousien zurueck um: $uhrzeit . 
Windstarke nur noch: $windauslesen m/s .
Die Jalousien fahren zurueck auf:
 Kueche: $zurueckkueche %, Essen: $zurueckessen %, Wohnen: $zurueckwohnen % 
(100% oben, 0% unten)";
SMTP_SendMail(26464 /*[sonstiges\E-Mail senden (SMTP)]*/, "Wind hat abgenommen - Jalousien fahren zurueck", "$mailcontent");
goto sprungmarke_exit;

sprungmarke_exit:
return;
?>

Nennt sich Skripttimer, einfach entsprechend anpassen

Gruß
Bruno

Hallo,

wie oben schon geschrieben, geht das mit den Scripttimer, hier noch ein Beispiel:


if ( $_IPS['EVENT'] == 12345) // Nummer von dem Auslöser.
{
IPS_SetScriptTimer($_IPS['SELF'], 3600); // erstellt und setzt den Scripttimer unterhalb dieses Scriptes
}

// und dann umgekehrt :-)

if ( $_IPS['EVENT'] == 23456) // Nummer des ScriptTimers.
{

// Hier steht das Programm welches nach 60 min ausgeführt werden soll.

IPS_SetScriptTimer($_IPS['SELF'], 0); // deaktiviert und setzt den Scripttimer wieder auf 0
}


Schöne Grüße
Thomas

Vielen Dank für den Tipp.

Um es richtig zu verstehen?
Ich habe z.B. ein Ereignis dass mir eine 1 in eine Integer Variable schreibt, wenn die Jalousien - aufgrund von WIND - hochgefahren sind.
Das könnte ich verwende als AUSLÖSER für den Skripttimer.
Zu aller erst setze ich in dem ZURÜCKFAHRSKRIPT dann den Timer auf X Sekunden.
Ich hoffe meine IF Logik ist korrekt?, wenn der wind immer noch zu hoch ist, würde der Timer später (also nach weiteren 60 Minuten) nochmals durchlaufen werden.

Woher weiss ich die Nummer des Skripttimers? Ist das diesselbe Nummer wie die Auslöser Nr ?

if ( $_IPS[‚EVENT‘] == 20565) // Nummer des ScriptTimers

if ( $_IPS[‚EVENT‘] == 20565) // Nummer des ScriptTimers.

<?
// Zurückfahrskript
if ( $_IPS['EVENT'] == 20565) // Nummer von dem Auslöser.
{ 
IPS_SetScriptTimer($_IPS['SELF'], 3600); // erstellt und setzt den Scripttimer unterhalb dieses Scriptes
}
$windauslesen=GetValueInteger(57196 /*[Wind\DS2423 Windzaehler\Zähler Wind \Wind m/s]*/);
if ($windauslesen>=14)//Prüfung ob Wind immer noch da ist, falls ja goto exit:
     {
	  goto sprungmarke_exitfalse;
     }
     else
     {
     if ( $_IPS['EVENT'] == 23456) // Nummer des ScriptTimers. 
     { 
     $zurueckkueche=GetValueInteger(43159 /*[Raffstoren\1.Küche Raffstore\Alter Stand]*/);
     $zurueckessen=GetValueInteger(29601 /*[Raffstoren\2.Essen Raffstore\Alter Stand]*/);
     $zurueckwohnen=GetValueInteger(20320 /*[Raffstoren\3.Wohnen Raffstore\Alter Stand]*/);
	  ZW_DimSet(31642 /*[Raffstoren\1.Küche Raffstore]*/, $zurueckkueche); // zurückfahren der Jalousien auf ausgangsposition
	  sleep(6);
	  ZW_DimSet(48945 /*[Raffstoren\2.Essen Raffstore]*/, $zurueckessen); // zurückfahren der Jalousien auf ausgangsposition
	  sleep(6);
	  ZW_DimSet(15030 /*[Raffstoren\3.Wohnen Raffstore]*/, $zurueckwohnen); // zurückfahren der Jalousien auf ausgangsposition
     SetValueInteger(41711 /*[Raffstoren\hochgefahren (0=nein)]*/, 0); //Rücksetzung auf nicht ausgeführt
IPS_SetScriptTimer($_IPS['SELF'], 0);// deaktiviert und setzt den Scripttimer wieder auf 0  
	  goto sprungmarke_exittrue;
	  }
sprungmarke_exitfalse:
setValueBoolean(17469 /*[Raffstoren\Zurueckfahrskript durchlaufen]*/, FALSE);
goto sprungmarke_exit;

sprungmarke_exittrue:
SetValueBoolean(17469 /*[Raffstoren\Zurueckfahrskript durchlaufen]*/, TRUE);
$uhrzeit = date("H:i.s");
$mailcontent = "Der Wind ist zurueckgegangen. Deshalb fahren die Jalousien zurueck um: $uhrzeit . 
Windstarke nur noch: $windauslesen m/s .
Die Jalousien fahren zurueck auf:
 Kueche: $zurueckkueche %, Essen: $zurueckessen %, Wohnen: $zurueckwohnen % 
(100% oben, 0% unten)";
SMTP_SendMail(26464 /*[sonstiges\E-Mail senden (SMTP)]*/, "Wind hat abgenommen - Jalousien fahren zurueck", "$mailcontent");
goto sprungmarke_exit;

sprungmarke_exit:
return;
?>


Wenn der Scripttimer einmal verwendet wurde findest du ihn im Objektbau ;).

Alle Timer haben eine eigene ID, die du im Script verwenden kannst.

Hallo,

und du müsstest das Script einmal starten damit der Timer angelegt wird, danach ist die Timer ID ja erst vorhanden.

Schöne Grüße
Thomas

Wofür braucht er überhaupt die ID des Scripttimers?

So wie ich das sehe ist das der einzige Timer, der das Script startet.

Ich würde das ganze über die $_IPS[‚SENDER‘] == TimerEvent machen.

Dann kann man sich das mit der ID komplett sparen.

Grüße Jo