Hallo
Um ein Script verzögert auszuführen, habe ich eine handliche Funktion geschrieben.
Diese lief lange Zeit problemlos. Das tut sie auch jetzt noch, aber seit einiger Zeit verursacht sie zwei Fehlermeldungen, die ich nicht deuten kann:
„Error updating on message SE_EXECUTE for Sender 22569. Error: GetObject for ID 22569 failed“
„Error updating on message EM_UPDATE for Sender 36418. Error: GetObject for ID 36418 failed“
<?
// Demo code:
IPS_LogMessage('Delayed_Exec_Demo', 'Demo started, waiting for timer to expire...');
exec_delayed(15, "IPS_LogMessage('Delayed_Exec_Demo', 'Timer expired, delayed code executed.');");
// Die eigentliche Funktion:
function exec_delayed($delay /*sec*/, $code) {
// creates a temp script with self-delete
global $IPS_SELF;
$callers_name = IPS_GetName($IPS_SELF);
$scriptID = IPS_CreateScript(0);
// set trigger
IPS_SetScriptTimer($scriptID, $delay);
$a = IPS_GetChildrenIDs($scriptID);
$timerID = $a[0];
$filename = "#tmp_{$scriptID}.php";
if (substr($code,-1,1) != ';') {
$code .= ';';
}
// Das temporäre Script:
$tmp_code = <<<EOT
<?
$code
IPS_SetScriptTimer($scriptID, 0);
IPS_DeleteEvent($timerID);
IPS_DeleteScript($scriptID,true);
?>
EOT;
file_put_contents($filename, $tmp_code);
IPS_SetName($scriptID, "Tmp-Script for '$callers_name': $code");
IPS_SetScriptFile($scriptID, $filename);
} // exec_delayed
?>
Funktionsweise:
Die Funktion erzeugt ein Script mit dem auszuführenden Code und fügt weiteren Code hinzu. Dieser stoppt den Timer (Zeile 25) und löscht dann den Timer (26) und das Script (26) inkl. Datei. Dann wird der Verzögerungstimer für dieses temporäre Script gestartet. Wenn die Zeit abgelaufen ist, wird das Script ausgeführt, welches sich praktischerweise gleich selber löscht.
Anmerkung:
Im realen Betrieb verwende ich einen vordefinierten Ordner „Scheduled Actions“, in den die temporären Scripts abgelegt werden (anstatt wie hier im Wurzelknoten). Das hat den nützlichen Nebeneffekt, dass ich sehr einfach alle allenfalls noch wartenden Aktionen auf einen Schlag löschen kann. Ohne diesem Trick kann die Sache leicht zu einem Fohlzirkus ausarten, wenn damit z.B. eine Abwesenheitssimulation aufsetzt und vorzeitig zurück kommt…
Hat jemand eine Idee, was hier los sein könnte und wie das Problem zu beheben wäre?
Ich habe übrigens IPS 2.6 beta in Betrieb. Wenn ich mich nicht irre, tauchte das Problem aber schon ab 2.5 auf.
Beste Grüsse,
Dieter