Zeitverzögertes starten von Scripts einfach managen

Mich hat schon immer die umständliche Handhabung von relativen Timern in IPS gestört.

Man nehme zum Beispiel eine Beregnungssteuerung. Ich schalte die Bewässerung zu einem beliebigen Zeitpunkt ein und möchte das sie sich nach z.B. 5 Minuten automatisch wieder ausgeschaltet.

Das folgende Script ermöglicht eine einfache Handhabung des ganzen Themas

1.) Manuel eine Integer Variabale erstellen in der das Script dann die ID des Ereinisses ablegt.

Das folgende Timer Script abspeichern :

<?

include "IPSLogger.ips.php";
define( "c_LogId", "Timer" );


$EventActive = false;

 /* Erzeuge einen Timer Event */
$eid = IPS_CreateEvent( 1 );
$EventActive =  IPS_EventExists(GetValueInteger($TIMERID));   
if ($EventActive)
{
				IPS_DeleteEvent( GetValueInteger($TIMERID) );
				echo ( "Der alte Timer wurde gelöscht  " );
				IPSLogger_Inf( c_LogId, " Alter Timer wurde glöscht " );

}
else
{
				echo ( "Es gab keinen altenTimer  " );
				IPSLogger_Err( c_LogId, " Es gab keinen alten Timer   " );

}

SetValueInteger($TIMERID,$eid );
IPS_SetParent( $eid, $PARENT); //Ereignis zuordnen
IPS_SetEventCyclic( $eid, 1, 0, 0, 0, 0, 0 );
IPS_SetEventCyclicDateBounds( $eid, (time() + $DELAY ),0 );
IPS_SetEventCyclicTimeBounds( $eid, (time() + $DELAY ),0 );

IPS_SetEventActive( $eid, true );

echo ( "  Der neue Timer wurde kreiert " );
IPSLogger_Inf( c_LogId, "Neuer Timer erstellt" );




?>


Das ganze kann jetzt wie folgt aufgerufen werden :

IPS_RunScriptWaitEx(12345,Array(„TIMERID“ => 23456, „PARENT“ => 67890, „DELAY“ => 123));

12345 ist die ID des Timer Scripts
TIMERID ist die ID der Variablen die Ihr angelegt habt
PARENT ist die ID des Scripts das Ihr zeitverzögert starten wollt
DELAY ist die Verzögerung in sekunden

Vorschlag von Paresy eingebaut

Entweder verstehe ich den Sinn deines Scripts nicht oder … ;-).

Ich starte mein Beregnungsscript einfach über ein Ereignis, z.B. täglich, einmalig, 6:30. Dann setzt das Script seinen eigenen Scripttimer, den es sogar abhängi vom Wetter berechnen könnte und nach Aufruf über den Scripttimer wird aufgeräumt und der Scripttimer zurückgesetzt.

Als Beispiel mal das Script-Gerüst.

<?

$debug = true;
$TX_BUF = "LEER";
$result = 99;
$automatik = GetValueBoolean(23055 /*[Fernbedienungen\Gartenpumpe Steuerung\Bewässerungsautomatik]*/);

switch( $IPS_SENDER ){
	case "Execute":
	   echo "Das geht so nicht! NUR über Variablen-Trigger oder Timer aufrufbar.";
	   return(1);
	break;
    case "Variable":
		switch ( $IPS_VARIABLE ){
		case "57632":
			// Garten Tracker "kurz"
			// Relais Gartenpumpe umschalten
			<passendes Kommando>
			if ($debug)
				IPS_LogMessage(IPS_GetName($IPS_SELF), "Gartenpumpe umschalten KURZ");
		break;
		case "47111":
			...
		break;
		}
	break;
	case "TimerEvent":
		if ($automatik) {
			if (($IPS_EVENT == 36768 OR $IPS_EVENT == 30864 ) AND $automatik) {
				// Start über Timer, wenn Urlaub ==> dafür TimerEvent aktivieren
				// NOTAUSschaltung erfolgt über LCN Relais Timer
				// Script Timer zur Bewässerungsdauer
				IPS_SetScriptTimer($IPS_SELF, 1500);
				if ($debug)
					IPS_LogMessage(IPS_GetName($IPS_SELF), "Bewässerungsautomatik Gartenpumpe EIN");
				LogMyMessage("Gartenpumpe Auto EIN");
				<passendes Kommando>
			} else {
		  		IPS_SetScriptTimer($IPS_SELF, 0);
				if ($debug)
					IPS_LogMessage(IPS_GetName($IPS_SELF), "Bewässerungsautomatik Gartenpumpe AUS");
				LogMyMessage("Gartenpumpe Auto AUS");
				<passendes Kommando>
			}
		} else {
			if ($debug)
				IPS_LogMessage(IPS_GetName($IPS_SELF), "Bewässerungsautomatik nicht aktiv");
		}
   break;
}

?>

Es gibt einen Unterschied ob das Script sich selbst zeitverzögert wieder startet (Dein Beispiel) oder ob Du ein beliebiges (anderes )Script zeitverzögert starten kannst.

Mein mini script ist dafür gedacht andere scripts mit einem timer zu versehen. Und Du hast natürlich recht es ist eigentlich nichts besonderes, Ich war halt von der Homematic verwöhnt bei der relative Timerverzögerung ganz einfach einzustellen sind.

Ich habe mal sowas ähnliches gebaut:


$EventActive = IPS_SetEventActive( GetValueInteger($TIMERID), false ); 

Diese Zeile ergibt nicht viel Sinn ;). Nimm doch gleich IPS_EventExists. Oder mach ein @ davor. Sonst bekommst du Warnings :wink:
Dein Skript übrigens noch Buggy, da du den Timer auf Täglich stellst. D.h. er ist immer noch relativ und nicht absolut, da er Täglich starten wird… statt nur einmal verzögert :wink:

Aber die Grundidee ist gut :slight_smile:

paresy

Paresy

Danke für den Tip und Dein Script. Guter Hinweis und man lernt halt nie aus :slight_smile:

Hi Bestex und all,

ich hab 6 Bewässerungskreise.
Muss ich die integer Variable und das Timerscript für jeden Kreis anlegen oder reicht das, wenn ichs einmal mache und dann mit

IPS_RunScriptWaitEx(12345,Array("TIMERID" => 23456, "PARENT" => 67890, "DELAY" => 123));

mit den entsprechenden Parametern aufrufe?