bedingte Ausführung eines Scripts

Ich suche für den folgenden Aufbau eine Lösung und komme da leider nicht weiter.

Ein Hauptschalter soll auf True eine bestimmte IPSLight-Gruppe einschalten und auf False alles an Lampen im Raum ausschalten (das Ausschalten mit eine Rampe d.h. es soll runter gedimmt werden – daher ist das nicht über IPSLight lösbar). Das alles geht schon ohne Probleme.

Jetzt möchte ich jedoch dem Hauptschalter immer den aktuellen Zustand geben wenn ich mal das Licht z.B. vom WebFront oder mittels eines anderen Schalters (andere Stimmung) ein- bzw. ausschalte. Damit, wenn ich das Licht woanders anschalte, ich nicht erst zweimal den Hauptschalter betätigen muss um den richtigen Zustand zu haben. Wenn ich nun immer bei einer Betätigung eines anderen Schalters oder Ausführung eines Scripts den Wert des Hauptschalters setze, wird immer der jeweilige Script für An/Aus der an die Variable des Hauptschalters angebunden ist ausgeführt. Wie kann ich das verhindern?

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.

Tom

Erklären wie es dazu kommt.
Weil dass kann eigentlich nur passieren, wenn du das Script über einen Trigger der Variable startest.
Den Trigger lösch mal, und trage in der Var unter Aktions-Script das Script ein, dann ist die Baustelle weg.
Außerdem im Script immer auf die Systemvariable ‚Sender‘ prüfen, sonst können auch leicht endlosschleifen entstehen.
Michael

Hallo Michael, danke für die Info.

Wie mache ich das:

Tom

Bsp.:
http://www.ip-symcon.de/service/dokumentation/vorgehensweisen/wie-kann-ich/

Gruß
Bruno

Der Link hilft mir da (vom Verständnis) leider auch nicht wirklich weiter. Ich müsste dann ja im ActionScript auch die Variable abfragen? Wenn True dann das, wenn false dann was anderes… Oder verstehe ich da was falsch? Und welche Systemvariable ‚Sender‘ soll ich dazu wie prüfen?

Tom

Mein Hauptschalter ist ein KNX-Schalter. Könnte es sein das es da mit einem Actionskript nicht geht?

EDIT
Hier ist der Hauptschalter eine eingene angelegte Variable, das mit KNX stand vorher nirgends…
Bitte so etwas immer vorher sagen, und dann auch die Frage im Richtigen Unterbereich stellen !

Wenn man es erst verstanden hat, wird es einfache. Verspreche ich :slight_smile:
Habe mich da zu Anfang auch sehr schwer getan und wollte eigentlich schon längst mal einen WIKI Eintrag dafür verfassen…aber naja später vielleicht oder ich versuche es mal hier:

Unabhänging von der Lösung darum etwas Background zu IPS, das mach es leichter.
Variablen von Instanzen bilden den aktuellen Zustand eines Gerätes wieder. Wenn man die Geräte auch steuern kann, so wie eine Standardaktion ausgeführt, das Gerät macht etwas und der neue Status wird wieder angezeigt.

Du möchstet jetzt auch den Status angezeigt haben, und aber auch schalten können.
Sehr empfehlenswert ist hier die gleiche Logik anzuwenden.
Die Anzeige steuerst du z.B. über Trigger von Variablen welche deinen Hauptschalter aktualisieren sollen (Beispiel Script A).
Die Steuerung, sofern vom WebFront erfolgt, kannst du über ein anderes Script (Beispiel Script B) ausführen lassen, welches in der Hauptschalter-Variable unter ‚Eigene Aktion‘ eingetragen wird.
Natürlich kann man beide Scripte auch in Einem Unterbringen. Aber dies kann zu Problemen wie z.B. Endlosschleifen führen wenn man nicht aufpaßt und das im Script entstechend unterbindet.
Hier mal ein Beispiel zu deiner Anfrage:
Du drückt im Webfront auf den Hauptschalter, hierdurch schaltet das Script jetzt 5 Lichter aus. Durch die aktualisierung der Stati der Lichter wird der Trigger zur aktualisierung der Anzeige der Hauptvariable ausgeführt und das Script noch 5x gestartet. Und diese schalten die Lichter noch mal ‚aus‘ und noch mal werden 5 Trigger ausgelöst usw…

Darum erst mal mit zwei Scripten, ist einfach einfacher …
Beispiel Script A
Hinterlegt als Ziel in allen Triggern, welche bei aktualisierung der einzelnen Licht auslösen müssen.
Wenn Licht An => Hauptschalter AN
Wenn Licht Aus und alle anderen auch Aus => Hauptschalter aus


$newvalue=false;  // Neuer Wert für den Hauptschalter

if (GetValueBoolean(23456 /* STATE Licht 1 */)) $newvalue=true;   //Wenn STATE TRUE (an) ist, dann neuer Wert Hauptvaribale auch TRUE (an)

if (GetValueBoolean(34567 /* STATE Licht 2 */)) $newvalue=true;   //Wenn STATE TRUE (an) ist, dann neuer Wert Hauptvaribale auch TRUE (an)
.
.
.
SetValueBoolean(65432 /* Hauptschalter */),$newvalue);

Beispiel Script B (habe hier mal HM_ genommen, bitte anpassen)
Hinterlegt in der Hauptvariable als ‚Eigene Aktion‘.
Aufgabe ist über das WebFront das Licht auszuschalten.
Wenn der Hauptschalter also schon aus ist, nix machen.
Wenn der Hauptschalter an ist => Licht ausschalten


if (!$_IPS['VALUE']) // nur ausschalten ! ist ein Inverter, $_IPS['VALUE'] == False geht auch
{
     HM_WriteValueBoolean(123456,"STATE",false);
     HM_WriteValueFloat(98765,"LEVEL",0.0);
}

Und was war nun mit ‚Sender‘ :confused:
Wenn du beides in Script packen würdest gibt es Chaos.
Über die Statusvariable $_IPS[‚SENDER‘] kann mit einer IF-Abfrage geprüft werden wer/wie das Script gestartet wurde.

If ($_IPS['SENDER']=="Variable") /* Script wurde durch einen Variablen-Trigger aufgerufen. */
If ($_IPS['SENDER']=="WebFront") /* Script wurde durch eine Bedienaktion (Eigene Aktion) am WebFront aufgerufen.
*/

Ein Beispiel wie alles im einem Script sein könnte:


if ($_IPS['SENDER']=="Variable") /* Script wurde durch einen Variablen-Trigger aufgerufen. */
{
 $newvalue=false;  // Neuer Wert für den Hauptschalter

 if (GetValueBoolean(23456 /* STATE Licht 1 */)) $newvalue=true;   //Wenn STATE TRUE (an) ist, dann neuer Wert Hauptvaribale auch TRUE (an)

 if (GetValueBoolean(34567 /* STATE Licht 2 */)) $newvalue=true;   //Wenn STATE TRUE (an) ist, dann neuer Wert Hauptvaribale auch TRUE (an)
 .
 .
 .
 SetValueBoolean(65432 /* Hauptschalter */),$newvalue);
}
elseif ($_IPS['SENDER']=="WebFront") /* Script wurde durch eine Bedienaktion (Eigene Aktion) am WebFront aufgerufen. */
{
 if (!$_IPS['VALUE']) // nur ausschalten ! ist ein Inverter, $_IPS['VALUE'] == False geht auch
 {
     HM_WriteValueBoolean(123456,"STATE",false);
     HM_WriteValueFloat(98765,"LEVEL",0.0);
 }  // Alles Einschalten geht auch, einfach if  & else verwenden und keinen Inverter, if dann für alles an, else für alles aus-schalten.
}

Hoffe ich konnte Dir etwas helfen.

Michael

Hallo Michael, vielen Dank für Deine Mühe und Entschuldigung für die Verwirrung. Mir war nicht klar dass es von der Art des Produktes abhängig ist. Heißt Deine beschriebene Vorgehensweise trifft nicht auf mein Problem/meine Fragestellung zu? Kann mir da eventuell jemand helfen wie ich das angehen kann?

Tom

Ist auch nicht zwangsweise; aber da dein Hauptschalter eine KNX-Instanz ist, welche ja schon auf dem Bus irgendwas macht, geht das so zumindet nicht.
Wäre der Hauptschalter eine eigene angelete Variable ohne Instanz geht es.

Dein Problem (wie sich das anhört :stuck_out_tongue: ) ist vermutlich durch deine KNX-Programmierung bedingt. Darum wäre die Frage dort besser aufgehoben. Ich habe leider null Plan von KNX und kann dir da gar nicht helfen.
Wenn du diesen KNX-Hauptschalter nicht verwendest, geht das oben geschriebene natürlich.
Nur mußt du die entsprechenden EIB_ Befehle nutzen…

Michael

Ich habe das jetzt anders „erschlagen“. Ich triggere den Hauptschalter auf Änderung und schau dann ob die IPSLight-Gruppe des Raumes „an“ ist. Wenn diese „an“ ist wurde schon etwas mittels eines anderen Schalters eingeschalten und der Hauptschalter macht aus. Genau wie ich es wollte. Es führen wie immer viele Wege nach Rom…

Tom