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: :slight_smile:](https://community.symcon.de/images/emoji/win10/slight_smile.png?v=9)
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: :confused:](https://community.symcon.de/images/emoji/win10/confused.png?v=9)
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