Skripte einzeln ausführen, aber wie?

Hallo,

ich schalte Heizungsventile über die RS232 Schnittstelle. Rufe daher für jede Heizung ein Script auf (siehe Bild im Anhang).

Das Problem ist jetzt, dass scheinbar die Skripte wild durcheinander ausgeführt werden. Es muss aber sequentiell jedes Skript nacheinander abgearbeitet werden.

Hier kurz das Skript:

/*


IP-SYMCON Event Scripting


File : HeizungBad_ON.ips.php
Trigger :
Interval :
*/

//Etwas über den COM Port senden
COMPort_SendText(54981, „g“);
COMPort_SendText(54981, „1“);
COMPort_SendText(54981, chr(4));
IPS_Sleep(200);
?>

Wie gesagt es werden von dieser Sorte mehrere aufgerufen (siehe Anhang). Wie bekomme ich es hin, das eins nach dem anderen ausgeführt wird?
Semaphor wartet ja leider nur eine bestimmte Anzahl Sekunden und beendet das Skript dann ganz.

Ideen?

Gruß,
chris

Also ich würde ein „Materscript“ vorschlagen.

Je nach zeitlichem Ablauf startest Du dann mit IPS_RunScript alle Scripte nacheinander.

Das Grundgerüst kannst Du Dir hier ansehen.

Wenn ein Script auf das andere warten muss sieht es allerdings anders aus…

Hallo,

ich möchte es eigentlich vermeiden, ein spezielles Script zu schreiben um alle Heizungen ein bzw. auszuschalten.

Es wird bestimmt auch noch mehr an logic hinzukommen (Heizung je nach Temperatur, Zeit schalten).

Daher wäre es denke ich besser jede Heizung in einem eigenen Script zu schalten und nur sicherzustellen, dass die Scripte gegeneinander verriegelet sind.

Mir ist allerdibngs nicht klar, was passiert, wenn wie in dem Beispiel von mir mehrer Skripte gleichzeitig aufgerufen werden? Werden diese Sequentiell abgearbeitet? Ich denke nicht, ich glaube es laufen alle nahezu gleichzeitig (scheduling)?

Könnte ich mir evtl. selber ein Semaphor basteln, indem ich eine globale variable anlege und sobald ein Skript das senden auf dem COM Port anfang diese auf true setzt und die anderen Skripte müssen halt warten? Wobei da glaube ich wieder das Problem ist, das es mit PHP nicht so einfach ist eine Warteschleife hinzubekommen, oder?

Bin mir aber nicht sicher, dass wenn ich das Semaphor dann wieder auf false setze die wartenden Skripte nicht gelcihzeitig loslaufen?

Kann mir jemand sagen, ob es so funktionieren könnte? Oder hat jemand eine andere Idee?

Gruß,
chris

Ich hatte ein ähnliches Problem beim Schalten meiner Lautsprecher für eine Durchsage …

Ich setze eine Variable in IPS, wenn das Script beginnt.
Mit einer IF-Anweisung frage ich diese Variable in jedem Script ab.
Ist sie gesetzt, setze ich (ELSE) den Script-Timer auf xxSek. (wird nach dem IF wieder auf 0 gesetzt). So wird das Script auf jeden Fall mit etwas Zeitverzögerung ausgeführt.

Ich finde es auch (noch) etwas umständlich, aber es geht :wink:

Hallo Uwe…

Umständlich vielleicht, aber so bist du freilich sicher, dass es wirklich läuft. Ich finde deine Lösung sogar relativ professionell. Einzig wäre anzumerken, dass wenn ein script, warum auch immer, die Variable nicht wieder zurückändert, dass deine komplette Steuerung steht.

Ich würde mir in die Variable die Datum und Uhrzeit schreiben statt True/false. Wenn die Uhrzeit jünger als X Minuten ist entspricht das einer Sperre für andere Scripts. Wenn die Zeit abgelaufen ist können neue Scripte ausgeführt werden. Wenn du die Sperre aufhenben willst setzt du die Variable einfach auf 01.01.1900 0:00 Uhr - oder soetwas.

So können sich die Scripte nicht gegenseitig „festfressen“ und alle sequentiellen Eigenschaften, wie du sie beschrieben hast, bleigen erhalten… Das integrierte Semapore-Management macht effektiv nichts anderes, und das hat auch schon so seine Berechtigung.

Gruß,

Toni

Vielen Dank!

Werde mal Uwes weg probieren.

Gruß,
Chris

Hier nun mein Code:

<?
/*


IP-SYMCON Event Scripting


File : HeizungBad_OFF.ips.php
Trigger :
Interval :
const HeizEss = 0;
const HeizStube = 1;
const HeizSchlaf = 2;
const HeizBuero = 3;
const HeizBad = 4;

*/

IPS_SetScriptTimer(„HeizungBad_OFF“, 0);

if(IPS_SemaphoreEnter(„rs232“, 1000))
{
//Etwas über den COM Port senden
COMPort_SendText(54981, „g“);
COMPort_SendText(54981, „0“);
COMPort_SendText(54981, chr(4));
IPS_Sleep(200);
IPS_SemaphoreLeave(„rs232“);
IPS_LogMessage(„Heizungssteuerung“,„Heizung Bad AUS“);
}
else
{
IPS_SetScriptTimer(„HeizungBad_OFF“, 1);
echo „FAIL“;
}

?>

Das ganze scheint zu funktionieren.

Falls jemand noch Verbesserungsvorschläge hat, gerne her damit!

Gruß,
chris

Danke für die Blumen, Toni :smiley:
Ich mache die Rücksetzung in einem anderen Script, das auch wieder mehrfach angesteuert wird. Das läuft seit ein paar Tagen absolut klaglos. Sollte ich Probleme entdecken, werde ich deinen Tipp verwenden.

@chris: ich würde den Script-Timer noch höher setzen, dann läufst du nicht Gefahr, das plötzlich 5 Scripte immer wieder versuchen sich zu stören.
Bei Heizungsaktoren/sensoren muss das IMHO kein Sekundentakt sein.