Ablaufsteuerung (Zeitverögrung in Skript)

Hallo,

die Beleuchtung meines Aquariums wird per Infrarotfernbedienung (IRTrans) gesteuert.
Ich möchte einen sanften Sonnenaufgang mit 20 Stufen in einer bestimmten Zeit (1Stunde) programmieren.
Die Ansteuerung der Tasten durch ein Skript (IRT_SendOnce…) funktioniert bereits.

Ich weiß jedoch nicht, welches die beste (sinnvollste) Möglichkeit des zeitlichen Ablaufs ist.

Die erste Idee ist, alle Befehle (20x IRT_SendOnce…) hintereinander in einem Skript auszuführen.
Die Pausen dazwischen könnte man doch mit Sleep() lösen, oder spricht etwas dagegen?
Dies hätte auch den Vorteil, dass ich nur 2 Skripte bräuchte (Aufgang/Untergang) und diese Skripte dann durch eine Zeitschaltuhr variabel starten könnte.

Ich weiß jedoch noch von der Atmel Mikrocontrollerprogrammierung, dass man durch bestimmte Befehle bei Zeitabläufen
das System stark belastet und es dafür bessere und schlechtere Lösungen gibt.
Ist das hier evtl. auch so?
Beeinflusst z.B. ein „Sleep“ Befehl in Skript-A evtl. die Ausführung eines Skriptes-B?
Denn der „Sleep“ Befehl würde in diesem fall 20x180sec andauern…

Danke für eure Rückmeldungen !

Das funktioniert nicht, ein Script kann maximal 60 Sekunden laufen.
Michael

Das funktioniert nicht, da ein Skript eine Laufzeitbegrenzung hat, Du kannst zwar für Millisekunden oder auch mal für Sekunden pausieren, wenn es sich aber um Minuten oder 1 Stunde handelt musst Du mit einem Timer arbeiten.

Hallo Lenz,

Das geht so nicht. Der sleep befehl pausiert das ganze script und dann gibt es einen timeout.
Ich würde da eine Variable anlegen mit der ich die schritte mit zähle und dann einen script Timer der diese hoch oder runter zählt.
Wenn dann max oder min von der hilfsvariable erreicht ist hört er auf.
Den Infarot befehl kannst du da drin dann auch ausführen.
Anstoßen kannst du das ganze dann indem du den wert dieser variablen auf 1 für Aufgang oder Max für untergang setzt. Wenn sie 0 ist dann ist die Funktion inaktiv.

Sent from my SM-G935F using Tapatalk

Du könntest über einen Scripttimer zyklisch das Script aufrufen und mit einer Zählervariablen deine Sequenz durchlaufen.

Ein Skript wird nach dieser Zeit in der IPS-Expertenansicht „PHP-Informationen“ rot markiert, PHP läßt es aber weiterlaufen.
Ich habe nicht ausgereizt zu welchem Zeitpunkt der Hammer fällt, es sind aber länger als 5 Minuten; hatte ja schon mal hier beschrieben, dass ich ein Skript vorsichtshalber nach 5 Minuten abbreche: „Das Stoppen des PHP-Skriptes ist erforderlich, weil Skripte unter IPS nur eine begrenzte Laufzeit haben dürfen (sie werden auch schon nach etwa einer Minute in der Expertenansicht „PHP-Informationen“ rot markiert). Macht aber nichts, wir machen ein Revolving, indem sich das Aktions-Skript kurz vor seinem Ende selbst aufruft“
(Erforderlich ist das ganze, weil das Skript laufend neue Messwerte liefert).

Viel Grüsse
Harald

Das ist aber ein Fehler, und je nach IPS / PHP Version wird das Script auch wirklich abgebrochen.
Michael

In der SYMCON-Doc steht unter PHP wie man die Maximale Skriptlaufzeit einstellt.
In meiner Windows-Version steht in der „php.ini“
max_execution_time=600

Also können die Skripte bis zu 10 Minuten laufen, ausser man verlängert das Limit noch innerhalb des Skriptes mit set_time_limit.
Möglicherweise hab ich die „php.ini“ mal dementsprechend editiert, denn in meinen Raspis steht ‚max_execution_time=30‘, allerdings in den beschriebenen Skripten noch zusätzliche Parameter, hier ein Auszug:

...
// Parameter:
$Laufzeit = (4 * 60);       // in sec. des Skriptes (anschließend Selbstaufruf bei Revolving)
set_time_limit (5 * 60);    // maximale PHP-Ausführungszeit in Sekunden
$ZeitAL = time ();                      // Laufzeit-Messung (alive)
...

                do {            // während BLEscan
...
// 2. Timer:  $Laufzeit = (4 * 60) in sec. des Skriptes (anschließend Selbstaufruf bei Revolving)
                            if (($ZeitAL + $Laufzeit) < time ()) {     // ZeitLimit
                                $lSem = 'BLEscan';     // Loop beenden
                        IPS_RunScriptEx ($_IPS['SELF'], array (// Selbstaufruf
                            'TRIG'  => $_IPS['SELF'], // wurde aufgerufen von ....
                            'GenEv' => 'Revolving',
                            'GenDt' => time ()));
                             }
...
                } while ($lSem <> 'BLEscan');       // Ende LE
// alles beenden
....

Viel Grüsse
Harald

Ich kann nur davon abraten es global zu verändern.
Besser gezielt, wenn ein Script wirklich länger braucht die Zeit im Script anzuheben.
Sonst hat man irgendwann so etwas hier:
Hilfe, „zu viele gleichzeitige Skripte, verwerfe ausführung“
Michael