Frage zu IPS_SetScriptTimer und Hintergrundverhalten

Hallo,

Ich möchte in 4 Sekunden einen Script ausführen, also fand ich auf der Suche den Befehle IPS_SetScriptTimer. Jetzt möchte ich aber wissen (weils nicht explizit dabeisteht). Ob nach Ablauf der 4 Sekunden der Timer wieder von vorne anfängt und so lange in einer Schleife ist, bis ich SetScriptTimer mit dem Paramter 0 aufrufe! -Oder (wie ich vermute) der Scipt dann einmalig ausführt und der ScriptTimer beendet ist.

Außerdem würde ich gerne wissen (ich glaub nicht) ob während dieser Zeit im Hintergrund alle anderen Scripts normal abgearbeitet werden? Also ich denke da an so Befehle wie wait oder pause wie ich sie aus anderen Programmiersprachen kenne. Diese stoppen zweifellos die Scriptbearbeitung und bleiben solange in der Funktion hängen, bis die Zeit um ist!

  • gibt es in PHP überhaupt so einen Befehl?

lg, Jürgen

  1. Ja der Timer startet nach 4s das Script neu, bis du Ihn auf 0 setzt.
  2. Alle Scripte laufen normal weiter, da IPS Multithreadfähig ist, glaube bis 10 Ports gleichzeitig.

MfG Thomas

danke. daraus ergibt sich eine weitere Frage…
also setze ich einfach in dem aufgerufenen script den Befehl nochmal ab, jedoch mit Wert „0“, oder?

daraus ergeben sich zwei weitere Fragen…

  1. gibt es einen pointer auf den eigenen script, sodaß ich nicht den gleichen Scriptnamen im String angeben muss? Ich meine etwa so…

IPS_SetScriptTimer(thisscript,0);

  1. Da habe ich irgendwo den php Befehl gefunden require_once(…) - wäre dieser für diesen meinen zweck nicht auch geeignet? ach nein kann ja nicht sein, der kann ja nicht getimed werden! - ok vergiß die zweite Frage

lg, Jürg

Ich glaube das suchst Du:


$IPS_SELF

MfG Thomas

oh wonderful - works great, danke schön

Hallo Ferengi-Master,
hmmmm, das macht mich schon wieder nachdenklich. Weil nämlich wenn ich schon bei meinen 2 lumpigen Lämpchen die ich derzeit zum steuern verwende (quasi mein Lernprojekt) schon 2 solche ScriptTimer verwende, dann sind 10 ScriptTimer bei einer komplexen Haussteuerung sehr schnell erreicht! grübel grübel

Frage 1)
Kann es sein das man ScriptTimer -Funktionen dann also eher vermeiden sollte! Andererseits sehe ich jetzt keinen anderen Weg. Denn viele Auslöser haben Aktionen zur Folge die nicht sofort, sondern etwas verzögert stattfinden sollen.

Frage 2)
Was passiert wenn deine Annahme mit 10 stimmt, und ein 11ter oder weitere SetScriptTimer im code aufgerufen werden? Kommt es zu einem Fatal error, oder werden diese einfach in eine Warteschleife gestellt, bevor sie des Systems Aufmerksamkeit erhalten…?!

Nee, was Thomas meint sind die maximal gleichzeitig ausführbaren Scripte. Ein kleines Script ist aber in millisekunden ausgeführt, dann ist schon wieder Platz für das nächste. Ein Script darf dabei auch nicht unbegrenzt lang sein. Das bezieht sich nicht auf Zeilen sondern auf die Zeit die es braucht um ausgeführt zu werden. Danach läuft es in den Timeout (glaub nach 30 Sekunden) und wird automatisch beendet (terminiert).

10 können (konnten) gleichzeitig ausgeführt werden. Aber ich glaube diese Information ist schon garnicht mehr aktuell, oder? Ich glaub paresy hat die Zahl mal hochgesetzt oder abgeschafft… bin mir aber nicht sicher.

Man könnte nun hingehen und mit IPS_Sleep arbeiten. Dann wartet das Script 4 Sekunden bevor die nächste Zeile ausgeführt wird. Das geht solange gut bis das Script insgesammt zu lange dauert. Bei kurzen Sleeps gibts da aber keine Probleme, kannst du ruhig nutzen.

Benutz aber dennoch ruhig die Timer. Das ist ein sauberer und sicherer Weg. Sofern du nicht vergisst einen Timer wieder zu löschen, wenn du ihn nicht mehr brauchst. Denn sonst wird er in der Tat alle 4 Sekunden, wie in deinem Beispiel, ausgeführt.

Gruß,

Toni

Hallo Hinti,

Toni ist mit zuvorgekommen :), aber hat er hat völlig Recht.

Wie der Name schon sagt, besitzt jedes Skript einen ScriptTimer. Wenn Du also 200 Skripte hast, hast Du Du auch ebensoviele Timer. Sie existieren immer, egal, ob Du sie benutzt oder nicht.

Alle gleichzeitig laufenden Skripte werden unabhängig voneinander abgearbeitet. Es findet keine gegenseitige Beeinflussung statt.

Im Allgemeinen ist 10 (?) eine großzügig bemessene Anzahl, wenn man einige Grundsätze berücksichtigt. Ein Skript sollte immer nur eine Laufzeit von wenigen Millisekunden haben. Es ist auch nichts dagegen einzuwenden, wenn ab und zu einmal ein Sleep(…) Befehl verwendet wird. Allerdings sollte man Laufzeiten von mehreren Sekunden vermeiden. Ein Programmablauf der lange Wartezeiten erfordert, sollte auf mehrere, zeitgesteuerte Skripte oder Skriptaufrufe aufgeteilt werden. Damit wird sichergestellt, dass immer nur sehr wenige Skripte gleichzeitig laufen.

Wer wegen übermäßiger Benutzung von Sleep(…) Befehlen zu Laufzeiten von mehr als 10s kommt, hat schlicht und einfach schlecht programmiert und sollte sein Konzept überdenken. Gerade für solche Fälle ist der ScriptTimer sehr hilfreich.

Übrigens:
Deine Fragen wären alle durch die Dokumentation beantwortet worden. Sowohl der ScriptTimer als auch die Systemvariablen ($IPS_SELF) werden dort beschrieben.

Gruß
HJH

Ja besten dank für eure erklärungen, aber eins noch… in der Doku zu ScriptTimer steht geschrieben:

[i]Hinweise:

Das Script wird erst nach Ablauf des Timers ausgeführt
Durch Übergabe des Intervalparameters ’ 0 ’ kann der Scripttimer deaktiviert werden [/i]

… und daraus geht absolut nicht hervor dass der Timer immer wieder von neuem beginnt. Die Aussage mit der ‚0‘
bezieht sich für mich nämlich nur darauf, wenn man einen vorzeitigen Abbruch wünscht.
bzw. läßt die Doku eben genau meine ursprüngliche Frage offen :wink:

Ich versuche natürlich schon durch eigenständiges Suchen alles rauszufinden. Keine Frage. Aber aus den Diskussionen geht wesentlich mehr
Hintergrundwissen hervor, als in der Doku vorhanden. Ich suche auch immer im gesamten Forum nach evtl. zutreffenden threads.
na ja, die eine oder andere wiederholung wird sich trotzdem nicht vermeiden lassen.

Hallo Hinti,

ich weiß nicht, wo Du diesen Text gefunden hast.

In der offiziellen Dokumentation ist das Verhalten des Befehls IPS_SetScriptTimer(…) nämlich eindeutig beschrieben.

Bitte halte Dich an die IP-Symcon Dokumentationsseite.

Gruß
HJH

tja, das muss man natürlich erstmal wissen. habe dieses manual nicht gefunden.
Aber an die Dokumentaionsseite habe ich mich gehalten. ich habe den Befehl da gefunden…

IPS_SetScriptTimer

Dieses manual bereichert jetzt meinen horizont um einiges… danke das du mich von der leitung geschubst hast, auf der ich gestanden habe.
Aber zumindest siehst du durch meinen link, dass ich keine Märchen erfunden habe, und ausgegangen bin ich auch von der Dokumentationsseite.

Hallo Hinti,

das ist mir jetzt ein Rätsel.

Wenn ich auf der genannten Dokumentationsseite den Befehl auswähle, wird mir die korrekte Beschreibung angezeigt. So, wie ich es erwartet habe.

Die betreffenden Links sind nämlich schon vor vielen Wochen aktualisiert worden.

Hast Du evtl. ein uraltes Bookmark?

Gruß
HJH

Hallo,

ich habe jetzt auch mal eine Frage dazu…

Ich habe ein Script, da stehen allein 4x sleep(10) u. 8x IPS_sleep(2100) drin, scheint aber trotzdem problemlos zu laufen.
Wie ist das nun genau mit den Script-Pausen u. der Runtime in Scripts?
Werden die Sleeps überhaupt mit gezählt?
Mich verunsichert das jetzt, da ich das Script eigentlich noch erweitern wollte.
Könnte das mal einer im Detail aufklären, bitte!

Hallo HJH, da ich blöderweise zu dumm war das Manual zu finden, habe ich auf der linken seite, da wo die Suchleiste der Doku-Wiki-Seite ist, „SetScriptTimer“ eingegeben. Danach kommen Übereinstimmungen und darüber gelangst du auf die entsprechende Seite. Probiers mal, das geht auf jedenfall immer noch.

Aber jetzt da ich von dem Manual weiß, fällt es mir wie Schuppen von den Augen, daß ich zuvor nicht fündig wurde, bzw. warum du dachtest: „zum guguck nochmal,
warum schaut sich der Hinti bloß nicht das Manual an“
:rolleyes:

Aufgrund der aktuell dazugekommen Frage von Nancilla, denke ich war es die Disskusion ohnehin wert.
(Nicht nur das ich endlich weiß wo das Manual ist)

Ja werden sie…

Du bist jetzt bei 16840 ms - alleine für die Sleeps. Da PHP Code rasendschnell ausgeführt wird kannst du ihn bei der Berechnung vernachlässigen. Erreichst du die 30000 ms (also 30 Sekunden) ist Ende. Das ist eine Tatsache.

Man kann diesen Wert, also die 30 Sekunden, verändern. Davon rate ich aber unbedingt ab. Es kann durch elendst lange Scriptlaufzeiten leicht zu einem „Stau“ kommen und es scheint dann als hätte IPS, genauer PHP, sich aufgehängt. Einige User haben da schon Erfahrung mit :wink:

Wenn du es aber dennoch ausprobieren willst musst du dich mal in der PHP Doku umsehen. Irgendwo hier im Forum findest du es aber auch.

Gruß,

Toni

Hallo Toni,

Und was ist mit den (PHP)-Sleeps?
Das sind ja schon 4x 10 Sekunden (sleep(10)) und trotzdem läuft das Script bisher problemlos.
Kann man diese Sleeps vernachlässigen?

Oh… hatte übersehen, dass das andere sleeps sind als die „üblichen“ :o

Musste ich ehrlichgesagt auch nachlesen.

Demnach fällt sleep nicht in den Bereich der Scriptlaufzeit. Das würde sich auch mit deinen Beobachtungen decken…

Edit:

Übrigens: Habs grad mit IPS_Sleep probiert. Geht offenbar auch, was mich ehrlichgesagt selbst etwas verwundert.

Gruß,

Toni

Demnach fällt sleep nicht in den Bereich der Scriptlaufzeit. Das würde sich auch mit deinen Beobachtungen decken…

Na da bin ich ja jetzt beruhigt:) und kann mal erweitern.

Die IPS_Sleep(2100) hatte ich übrigens mit „IPS_RunScript“ in andere Scripts „vergelagert“, fällt mir noch ein…

Hallo Forum,

das ideale Skript, ist eines, das nicht läuft. Es benötigt keine CPU-Zeit, keinen Speicher und weder IP-Symcon noch das Betriebssystem (Windows) müssen sich um dessen Verwaltung kümmern.

Daher ist es immer sinnvoll längere Sleep(…) Befehle zu vermeiden, denn wenn ein Skript nichts tut, ist es auch nicht nötig es weiterlaufen zu lassen. Ein schlafendes Skript benötigt zwar kaum CPU-Zeit, aber trotzdem Speicher und Verwaltungsaufwand.

Ich habe hier ein Skript angefügt, mit dem beliebige Sequenzen von Skripten zeitgesteuert abgearbeitet werden können.
Man zerlegt dazu zweckmäßigerweise sein Projekt in mehrere Phasen und bringt diese in eigenen Skripten unter.

Das Sequencer-Skript ist dazu gedacht die Phasen-Skripte nach einer bestimmten Verzögerung zu starten. Jede Phase hat ihr eigenes Skript („Phase_x.ips.php“) und ihr eigenes Verzögerungsintervall. Die Kommentare im Skript geben hierüber näher Auskunft.

Es ist sogar möglich Endlosschleifen zu programmieren, ohne einen Timeout befürchten zu müssen. Auch sind beliebig lange Sequenzen möglich.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Sequencer.ips.php
Trigger  : ScriptTimer
Interval : (verschiedene)
Author   : HJH
Date     : 30.10.07
*/



$phaseVar = "PhaseCounter";            // Name der Variablen für den Phasenzähler

// In diesem Beispiel werden 5 Phasen abgearbeitet (0...4).
// Die Anzahl lässt sich beliebig erhöhen.
// Die Abarbeitungsreihenfolge kann beliebig festgelegt werden.
// Phasen können auch mehrfach aufgerufen werden.
// Es lassen sich auch Schleifen erzeugen.
$sequencer = array(0 => array(10, 1),  // auf Phase 0 folgt nach 10s Phase 1, auszuführendes Skript: "Phase_1.ips.php"
                   1 => array(3,  4),  // auf Phase 1 folgt nach  3s Phase 4, auszuführendes Skript: "Phase_4.ips.php"
                   2 => array(30, 3),  // auf Phase 2 folgt nach 30s Phase 3, auszuführendes Skript: "Phase_3.ips.php"
                   3 => array(5,  2),  // auf Phase 3 folgt nach  5s Phase 2, auszuführendes Skript: "Phase_2.ips.php"
                   4 => array(7,  5),  // auf Phase 4 folgt nach  7s Phase 5, auszuführendes Skript: "Phase_5.ips.php"
                   5 => array(0,  0)); // auf Phase 5 folgt nach  0s Phase 0, 0s bedeutet: die Sequenz ist beendet




switch ($IPS_SENDER)
{
 case "Execute":                       // Skript wurde von Hand gestartet: Grundzustand herstellen
  SetValueInteger($phaseVar, 0);                           // Phasenzähler rücksetzen
  IPS_SetScriptTimer($IPS_SELF, 1);                        // ScriptTimer starten
 break;

 case "Variable":                      // Skript wurde durch eine Trigger-Variable gestartet
 break;

 case "TimerEvent":                    // Skript wurde vom ScriptTimer gestartet: Phasenwechsel steht an
  $phase = GetValueInteger($phaseVar);
  IPS_RunScript("Phase_". $phase);                       // Skript für aktive Phase abarbeiten
  SetValueInteger($phaseVar, $sequencer[$phase[1]]);     // nächste Phase festlegen
  IPS_SetScriptTimer($IPS_SELF, $sequencer[$phase[0]]);  // Zeit festlegen, wann die nächste Phase beginnen soll
 break;
}
?>

Das Skript ist noch nicht getestet. Ich denke aber, dass der Zweck klar zu erkennen ist. Vielleicht kann man es später unter die nützlichen Skripte einreihen.

Gruß
HJH

Hallo,

Wer WIIPS einsetzt, hat automatisch schon einmal 180 Sekunden zur Verfuegung. Nur mal so zur Info.

Gruss Torro