Shutter Control - IPS_RunScript

Hallo zusammen,

leider habe ich hier im Forum nichts passendes gefunden oder die Suche falsch bemüht.

Ich habe ein Script, welches über IPS_RunScript viele kleine Einzeiler ausführt.

Alle Scripte, die aufgerufen werden, machen eigentlich nur eines:

SC_Move(1234 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Erker Tür rechts]*/, 100);

Rolläden über das Shutter Control runterfahren.

Doch, wenn ich das „Ober-Script“ aufrufe, arbeitet IPS einen Teil ab und dann geht gar nichts mehr. Nicht einmal den Dienst zu beenden geht. Nur ein Neustart des Servers hilft.

Hier mein Script:

<?
//Variablen holen

$EG_status = GetValue(29806 /*[.Variablen\Rolladen EG Status]*/);
$OG_status = GetValue(58199 /*[.Variablen\Rolladen OG Status]*/);

if ($OG_status == false) {
//Sprachmeldung ausgeben
TTS_Speak(16663 /*[.System Instanzen\Text To Speech Stefan]*/, "Es wird dunkel. Die Rolläden im Obergeschoss werden geschlossen.", true);
// Obergeschoss Schlafzimmer
IPS_RunScript(49937 /*[Obergeschoss\Schlafzimmer\Rolladen\Rolladen Balkontür geschlossen]*/);
// Obergeschoss Turmzimmer
IPS_RunScript(40971 /*[Obergeschoss\Turmzimmer\Rolladen\Rolladen Balkontür geschlossen]*/);
IPS_RunScript(40027 /*[Obergeschoss\Turmzimmer\Rolladen\Rolladen Fenster geschlossen]*/);
// Obergeschoss Gästezimmer
IPS_RunScript(41681 /*[Obergeschoss\Gästezimmer\Rolladen\Rolladen Fenster geschlossen]*/);
// Obergeschoss Flur
IPS_RunScript(36165 /*[Obergeschoss\Flur OG\Rolladen\Rolladen Fenster geschlossen]*/);
// Obergeschoss Badezimmer
IPS_RunScript(45596 /*[Obergeschoss\Badezimmer\Rolladen\Rolladen Fenster geschlossen]*/);
//Variable für "zu" setzen
SetValue(58199 /*[.Variablen\Rolladen OG Status]*/, True);
}

if ($EG_status == false) {
//Sprachmeldung ausgeben
TTS_Speak(16663 /*[.System Instanzen\Text To Speech Stefan]*/, "Die Rolläden im Erdgeschoss werden geschlossen.", true);
// Keller Arbeitszimmer
IPS_RunScript(52846 /*[Keller\Arbeitszimmer\Rolladen\Rolladen geschlossen]*/);
// Erdgeschoss Gästebadezimmer
IPS_RunScript(11188 /*[Erdgeschoss\Gäste-WC\Rolladen\Rolladen Fenster geschlossen]*/);
// Erdgeschoss Küche
IPS_RunScript(12610 /*[Erdgeschoss\Küche\Rolladen\Rolladen Fenster geschlossen]*/);
IPS_RunScript(12217 /*[Erdgeschoss\Küche\Rolladen\Rolladen Tür geschlossen]*/);
//Erdgeschoss Wohnzimmer
IPS_RunScript(59070 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Fenster links geschlossen]*/);
IPS_RunScript(26697 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür links geschlossen]*/);
IPS_RunScript(47672 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür mitte geschlossen]*/);
IPS_RunScript(42825 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür rechts geschlossen]*/);
IPS_RunScript(10613 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Terrassentür geschlossen]*/);
IPS_RunScript(51801 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Tür rechts geschlossen]*/);
//Variable für "zu" setzen
SetValue(29806 /*[.Variablen\Rolladen EG Status]*/, True);
}
?>

Was ist hier unsauber programmiert oder wo liegt der Fehler?

Die Sprachausgabe und das Setzen der Variablen funktioniert. Nur die Befehle an die Shutter Control Instanzen werden nicht vollständig abgearbeitet.

Wenn ich jedes einzelne „Unterscript“ nacheinander händisch ausführe, klappt es.

Vielleicht weiss jemand Hilfe.

Gruß

Jimmy

Hallo Jimmy,

mir scheint hier einfach zu viel parallel zu laufen, es werden hier ja alle verfügbaren PHP-Slots verbraucht und IPS hängt dann, es stehen ja max. 10 für ausführbare Scripts zu Verfügung. Ich würde das mal mit IPS_RunScriptWait versuchen.

Hallo Ferengi,

danke für den Tip. Habe ihn auch gleich umgesetzt.

Jetzt fährt IPS zwar brav nacheinander die Rolläden hoch, aber nach 6 Scripten ist Schluß. Zwar kein Absturz mehr, aber das Script wird nicht zu Ende abgearbeitet.

Irgendeine Idee?

Gruß

Jimmy

Ich nehme mal an Du hast für das Hochfahren auch so ein Script, poste das mal bitte und markiere mal an welcher Stelle nichts mehr abgearbeitet wird.

Klar, hab ich da ein Script:

<?
// Keller Arbeitszimmer
IPS_RunScriptWait(28319 /*[Keller\Arbeitszimmer\Rolladen\Rolladen offen]*/);
// Erdgeschoss Gästebadezimmer
IPS_RunScriptWait(56437 /*[Erdgeschoss\Gäste-WC\Rolladen\Rolladen Fenster offen]*/);
// Erdgeschoss Küche
IPS_RunScriptWait(49572 /*[Erdgeschoss\Küche\Rolladen\Rolladen Fenster offen]*/);
IPS_RunScriptWait(34742 /*[Erdgeschoss\Küche\Rolladen\Rolladen Tür offen]*/);
//Erdgeschoss Wohnzimmer
IPS_RunScriptWait(49032 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Fenster links offen]*/);
IPS_RunScriptWait(57957 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür links offen]*/);
IPS_RunScriptWait(31216 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür mitte offen]*/);
*Markierung* IPS_RunScriptWait(22159 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Erker Tür rechts offen]*/);
IPS_RunScriptWait(49843 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Terrassentür offen]*/);
IPS_RunScriptWait(38078 /*[Erdgeschoss\Wohnzimmer\Rolladensteuerung\Rolladen Tür rechts offen]*/);
// Obergeschoss Schlafzimmer
IPS_RunScriptWait(23355 /*[Obergeschoss\Schlafzimmer\Rolladen\Rolladen Balkontür offen]*/);
// Obergeschoss Turmzimmer
IPS_RunScriptWait(37614 /*[Obergeschoss\Turmzimmer\Rolladen\Rolladen Balkontür offen]*/);
IPS_RunScriptWait(55194 /*[Obergeschoss\Turmzimmer\Rolladen\Rolladen Fenster offen]*/);
// Obergeschoss Gästezimmer
IPS_RunScriptWait(23513 /*[Obergeschoss\Gästezimmer\Rolladen\Rolladen Fenster offen]*/);
// Obergeschoss Flur
IPS_RunScriptWait(19312 /*[Obergeschoss\Flur OG\Rolladen\Rolladen Fenster offen]*/);
// Obergeschoss Badezimmer
IPS_RunScriptWait(34894 /*[Obergeschoss\Badezimmer\Rolladen\Rolladen Fenster offen]*/);
//Variablen für "auf" setzen
SetValue(58199 /*[.Variablen\Rolladen OG Status]*/, False);
SetValue(29806 /*[.Variablen\Rolladen EG Status]*/, False);
?>

Und hier die Fehlermeldung beim Ausführen:

Fatal error: Maximum execution time of 180 seconds exceeded in [Rolladen alle auf] on line 13

IPS ist während der Ausführung auch nicht mehr ansprechbar, d. h. Bewegungsmelder sind unberücksichtigt. Nicht sehr WAF.

Bitte um Hilfestellung.

Gruß
Jimmy

Ok jetzt ist´s klar, die Scriptlaufzeit ist jetzt zu lang.:o Das wird so nichts.
Das ganze Ding muß auf Timer umgestellt werden. Ich bastel da mal was.

Da bin ich mal gespannt. Ich als php-Azubi fand keinen anderen Weg, sorry.

Sonst baue ich das nächste Mal ein Haus mit weniger Rolläden :wink:

Gruß

Jimmy

Wie wäre es dann, wenn ich noch je Raum ein Script ohne „Wait“ bauen würde und die einzelnen Räume mittels „Wait“ aufrufen würde?

Ginge das? Wäre IPS während des gesamten Scripts „aufnahmebreit“?

Wieviele Scripte darf ich dann ohne „Wait“ starten, ohne IPS „auf die Bretter zu schicken“?

Warte mal hab das dann gleich besser.:wink:

Ich bin für jede Ausbildungsstunde offen :wink:

Herzlichen Dank schon für Deine Hilfe.

Kann das leider mangels Rolläden nicht testen aber so müßte das in etwa gehen:


   $id_rolladen = 12345; //Integer Variable Counter

   $rolladen = GetValueInteger($id_rolladen);
    
   $laufzeit = array(2,5,6); //Rolladenlaufzeiten in Sekunden

   switch($rolladen)
   {
        case '0':
        //hier der Rolladen hoch Befehl für den ersten Rolladen
        break;

        case '1':
        //hier der Rolladen hoch Befehl für den zweiten Rolladen
        break;

        case '2':
        //hier der Rolladen hoch Befehl für den dritten Rolladen
        break;
    }

    IPS_SetScriptTimer($IPS_SELF, $laufzeit[$rolladen]); //Timer
    $rolladen = $rolladen+1;
    SetValueInteger($id_rolladen, $rolladen);
    
    $anzahl = count($laufzeit);
    if($rolladen == $anzahl)
    {
        IPS_SetScriptTimer($IPS_SELF, 0); //Timer abschalten
        SetValueInteger($id_rolladen, 0);
    }



Bitte die eine Integer Variable anlegen.
Beispiel ist für drei Rolläden, ist aber beliebig erweiterbar.
Das array ist dann mit den Zeiten für das Hochfahren der entsprechenden Rolläden zu füllen.

Hallo,

nutzt du mit dem SHuttermodul das Shutterscript aus der Doku, oder das auf timer umgestellte Shutterscript?

Den mit der Timervariante sollte es keine Laufzeitüberschreitung mehr geben, da das Shutterscript max 1 Sekunden pro Rolladen dann läuft.

Gruß Philipp

Hallo Philipp,

hatte noch das Standard-Script drin. Heute habe ich mal ein bisschen Zeit gehabt und das timergesteuerte Script getestet.

Komplett auf und zu funktioniert gut.

Allerdings möchte ich ein Sonnenschutz-Script für sechs Rolläden im Wohnzimmer realisieren. Jeden einzelnen Rolladen per Script auf die gewünschte Position zu fahren klappt jedes Mal. Doch wenn ich alle sechs Rolläden über ein Script fahren lasse, stoppen die Rolläden immer an unterschiedlichen Positionen.

Kann das irgendwie elegant umgangen werden? Ich möchte ja nicht jedes mal sechs Scripte starten.

Hier mal mein Sonnenschutz-Script:

<?
SC_Move(11111 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Fenster links]*/, 50);
SC_Move(22222 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Erker Tür links]*/, 33);
SC_Move(33333 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Erker Tür mitte]*/, 32);
SC_Move(44444 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Erker Tür rechts]*/, 33);
SC_Move(55555 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Terrassentür]*/, 33);
SC_Move(66666 /*[Erdgeschoss\Wohnzimmer\.Shutter Control\Shutter Control Tür rechts]*/, 28);
?>

Werde gleich noch Ferengi´s Script testen.

Gruß

Jimmy

versuche mal ein Ips_Sleep(20); nach jedem Befehl
.

versuche mal ein Ips_Sleep(20); nach jedem Befehl

Das hat leider auch nicht geklappt :frowning:

Aber einen Versuch war es wert.

bei mir hat das Skript geholfen. Vielen Dank!

…und welches?

Ich benutze zwar ein ganz anderes Script als das Shutter Modul aber der Effekt ist der gleiche. Einzelne Jalousien werden 100% richtig gesteuert aber wenn viele gleichzeitig starten funktioniert es nicht mehr genau.
Die Idee mit dem Sleep ist auch schon ok. Allerdings ist 20ms absolut nicht ausreichend. Bei mir funktioniert es ganz gut mit sleep-zeiten zwischen 2000 und 4000ms zwischen den einzelnen Jalousien.

Ob es eine Verzögerung seitens IPS gibt, wenn viele Ereignisse fast gleichzeitig ein Script triggern wollen? Irgendenwo entsteht auf jeden Fall eine Verzögerung.

mfg
Smudo

Ob es eine Verzögerung seitens IPS gibt, wenn viele Ereignisse fast gleichzeitig ein Script triggern wollen? Irgendenwo entsteht auf jeden Fall eine Verzögerung.

Das wurde im Forum schon mehrfach beschrieben, es laufen die Threadslots voll, eine Timerbasierende Lösung ist hier immer besser.

also ich habe alle Rolläden als Shutter Control Instanzen angelegt. wenn ich mehrere Rolläden in einem Script herunterfahren möchte nutze ich Ferengi’s Script vom 1.6. in diesem Thread damit es keine Timeout errors gibt. So fährt eine nach der anderen Rollade herunter.

Da ich zusätzlich die Rolläden ausserhalb von IP-Symcon mit einem Taster bediene, kann ich jedoch leider nicht die Prozentzahlen nutzen und habe deshalb die gewünschten Zeiten selber gestoppt und nutze nun SC_MoveUp (bzw. down). Ich hoffe, jemand verrät mir noch, wie ich die Position der Shutter Control Instanzen verändern kann, ohne die Rollade zu bewegen.

soll ich Ferengis angepasstes Skript mal posten?