Seltsame Fehlermeldung

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

Meine Frage scheint ins Sommerloch gefallen zu sein…

Es würde mir weiter helfen, wenn jemand kurz den Code ausprobieren könnte, um zu sehen, ob die Fehlermeldung mit meiner Installation zu tun hat.

Danke,
Dieter

vermutlich kann niemand was mit dem obigen Posting anfangen (ich auch nicht wirklich).
Aber so gehts:


<?
// http://www.ip-symcon.de/forum/f52/seltsame-fehlermeldung-18977/#post169091
// 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

?>

wobei mir der Code fast nach dem ersten IPS-Virus aussieht :smiley:

Heisst das, dass du keine Fehlermeldungen erhältst, wenn du diesen Code ausführst? Weil bei mir erscheinen die Fehlermeldungen nach wie vor, auch bei der von dir korrigierten Version.
In dem Fall muss wohl etwas bei meiner Installation im Argen liegen.

Schade, wenn niemand etwas mit dem Code anfangen kann.
Eigentlich wollte ich ihn mal veröffentlichen, weil ich ihn eigentlich schon sehr nützlich finde.
Ehrlich gesagt finde ich die „offizielle“ Methode etwas umständlich, weil ja das ganze Script nach Ablauf des Timers wieder aufgerufen wird. D.h. ausserhalb des if’s darf kein Code stehen, sonst geschieht schnell Unvorhergesehenes.

if($_IPS['SENDER'] == "TimerEvent") {
IPS_SetScriptTimer($IPS_SELF, 0);
} else {
IPS_SetScriptTimer($IPS_SELF, 60);
}

Demgegenüber kannst die exec_delayed() irgendwo mitten im Code haben, ohne dass etwas schief geht.

...
exec_delayed(10, "IPS_LogMessage('...')");
...

Und wie angedeutet kannst du problemlos sämtliche wartenden Scripts auf einen Schlag aus dem Verkehr ziehen, weil all diese Timer in einem Ordner zusammengefasst sind. (Natürlich gibt’s auch dafür eine Hilfsfunktion).

Nach meinem Dafürhalten wären das genügend Gründe, um diese Funktion ziemlich nützlich zu finden. Aber vielleicht bin ich ja der einzige, der gewisse Aktionen zeitversetzt ausführen lassen möchte… :wink:
Gruss, Dieter

Ich hab dieses Problem hier im Tab offen und werde es mir ansehen, da die o.g. Fehlermeldungen niemals auftreten sollten :wink:
Noch ein wenig Geduld.

paresy

Heisst das, dass du keine Fehlermeldungen erhältst, wenn du diesen Code ausführst?

ja, keine Fehlermeldung, die Objekte werden angelegt und anschl. durch Timer wieder gelöscht

Schade, wenn niemand etwas mit dem Code anfangen kann.

:confused: versteh ich nicht ganz: war das nun eine Supportanfrage oder der Versuch, ein eigenes Script zu veröffentlichen?
Bisher hab ich das eher als Support-Anfrage verstanden.
wenn das anderen Forenteilnehmern auch so geht wie mir (bezogen auf die Fragestellung) ist die geringe Response m.E. nicht überraschend.

Empfehlung: bring das Script erstmal zum Laufen und erkläre dann den potenziellen Usern, was man damit machen kann und welche Vorteile das bringt.

Da hast du natürlich völlig recht, das war in der Tag ein Gemisch von beidem:-)
Solange ich nicht überzeugt bin, dass das Skript sauber funktioniert, kann ich es allerdings nicht veröffentlichen.
Werde ich aber zu gegebener Zeit tun.

huch, es lebt noch. Also doch nichtin der Hose verlustig gegangen :smiley: