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.
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.
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.
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.
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.
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);
?>
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.
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.