"Zustand" einer Boolean-Variable

Hallo,

im Rahmen meiner Beschattungssteuerung habe ich für jede Jalousie eine Boolean-Variable (Einzelvariablen), um die Automatik für die jeweilige Jalousie aus- oder einschalten zu können. Darüber hinaus habe ich eine weitere Boolean-Variable (Gesamtvariable), mit der ich alle Einzelvariablen auf einmal aus- oder einschalten kann.

Wenn ich nun mit der Gesamtvariable alle Einzelvariablen auf false setze, stehen - wie gewollt - die Gesamtvariable wie auch alle Einzelvariablen auf false. Schalte ich nun eine, mehrere oder alle Einzelvariablen über die Einzelvariablen selbst auf true, bleibt die Gesamtvariable auf false. Um mit ihr wieder alle Einzelvariablen auf false setzen zu können, muss ich die Gesamtvariable auf true setzen, dann kann ich wieder auf false gehen.

Was ich umsetzen möchte ist, dass sobald eine Einzelvariable true ist, auch die Gesamtvariable true angezeigt wird, aber ohne dass dadurch alle Einzelvariablen auf true geschaltet werden.

Hat jemand eine Idee, wie ich das umsetzen kann?

Ich hoffe, ich konnte mein Anliegen einigermaßen verständlich schildern:o

Viele Grüße!

Nicht so ganz, wie gehst Du denn da zur Zeit vor mit einem Ereignis und Skript? Dann zeig mal das Skript irgendwo muss da ja ein Fehler drinnen sein.

Ich würde bei jeder Einzelvariable ein ausgelöstes Ereignis hinzufügen, bei bestimmten Wert = true und dann im Skript danach einfach die Gesamtvariable auf true setzen… habe ich jetzt nicht ausprobiert, so würde ich es aber versuchen.

Gesendet von meinem SM-G935F mit Tapatalk

Du kannst in den Skripten ohne Bedenken den Wert der Gesamtvariablen per SetValue umstellen. Das Aktionsskript wird dadurch nicht ausgelöst. Das kann man also einfach in dem Skript der Einzelvariablen mit einbauen.

Aber noch ein paar Fragen zum Konzept: Soll die Gesamtvariable nur zum ausschalten sein oder auch zum einschalten? Was ist wenn du eine Lampe anschaltest und dann auch den gesamten Rest anschalten möchtest? Eventuell würde es sich lohnen anstatt der Gesamtvariablen (oder zusätzlich) einfach zwei Skripte zu definieren. Eins um alle Lampen an- und eins um alle auszuschalten. Da die Software schlecht weiß was du vorhast wenn du die Gesamtvariable aktivierst, wenn ein paar Lampen an und ein paar Lampen aus sind, kannst du ihr das so mitteilen ohne einmal zusätzlich zu schalten weil die Gesamtvariable gerade in der falschen Richtung steht.

Hallo,

erst einmal danke für die Antworten. Leider kann ich erst jetzt reagieren, weil ich gestern Probleme mit IPS hatte.

Mit der Gesamtvariablen möchte ich alle Einzelvariablen jeweils auf einmal ein- und ausschalten können. Bisher habe ich ein Skript, um das umzusetzen, das durch eine Variablenänderung der Gesamtvariablen ausgelöst wird:

If (GetValue(22442 /*[Beschattung\Automatikschaltung\Automatik alle]*/))
{
  setValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/, true);
  setValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/, true);
  setValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/, true);
  setValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/, true);
  setValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/, true);
  setValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/, true);
  setValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/, true);
  setValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/, true);
}

else 
{
  setValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/, false);
  setValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/, false);
  setValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/, false);
  setValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/, false);
  setValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/, false);
  setValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/, false);
  setValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/, false);
  setValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/, false);
}

Um die Gesamtvariable auf true zu setzen, wenn auch nur eine Einzelvariable auf true ist, habe ich ergänzend folgendes Skript, das durch die Änderung einer Einzelvariablen ausgelöst wird:

If ((GetValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/)) or (GetValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/)) or (GetValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/)) or (GetValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/)) or (GetValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/)) or (GetValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/)) or (GetValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/)) or (GetValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/)) && ((!GetValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/)) or (!GetValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/)) or (!GetValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/)) or (!GetValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/)) or (!GetValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/)) or (!GetValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/, false)) or (!GetValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/)) or (!GetValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/))))

{
SetValue(22442 /*[Beschattung\Automatikschaltung\Automatik alle]*/, true);
}

else 

{
SetValue(22442 /*[Beschattung\Automatikschaltung\Automatik alle]*/, false);
}

Allerdings führt das Schalten einer einzelnen Einzelvariablen z.B. auf true und damit das Auslösen des zweiten Skripts ja dazu, dass die Gesamtvariable auf true gesetzt und (auch) damit das erste Skript ausgelöst wird, womit wiederum alle Einzelvariablen auf true gesetzt werden. In diesem Fall soll aber gerade das erste Skript nicht ausgelöst werden. Und hier bin ich bisher mit allen Versuchen ($IPS_Sender…, etc.) gescheitert.

Habt Ihr dazu eine Idee?

Viele Grüße…

Hallo
Schalte doch einfach ,im zweiten Script,den Event vom ersten Script kurz aus und dann wieder ein .
https://www.symcon.de/service/dokumentation/befehlsreferenz/ereignisverwaltung/ips-seteventactive/

Du willst ja, dass das Script an der Gesamtvariablen nur abläuft, wenn du es per Button auslöst, nicht wenn du es per Script setzt, also frage doch einfach $_IPS[‚SENDER‘] ab!

Danke, 1007, ich habe das zweite Skript wie folgt angepasst:

IPS_SetEventActive(42672 /*[Beschattung\Skripte\Automatik alle 1\Bei Variablenaktualisierung der Variable ""]*/, false);

If ((GetValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/)) or (GetValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/)) or (GetValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/)) or (GetValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/)) or (GetValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/)) or (GetValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/)) or (GetValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/)) or (GetValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/)) && ((!GetValue(10663 /*[Beschattung\Automatikschaltung\Automatik KiZ]*/)) or (!GetValue(41732 /*[Beschattung\Automatikschaltung\Automatik Sz]*/)) or (!GetValue(56324 /*[Beschattung\Automatikschaltung\Automatik Az]*/)) or (!GetValue(10154 /*[Beschattung\Automatikschaltung\Automatik K L]*/)) or (!GetValue(59513 /*[Beschattung\Automatikschaltung\Automatik Kü]*/)) or (!GetValue(37277 /*[Beschattung\Automatikschaltung\Automatik WZ K]*/, false)) or (!GetValue(19118 /*[Beschattung\Automatikschaltung\Automatik WZ L]*/)) or (!GetValue(23104 /*[Beschattung\Automatikschaltung\Automatik WZ P]*/))))

{
SetValue(22442 /*[Beschattung\Automatikschaltung\Automatik alle]*/, true);
}

else

{
SetValue(22442 /*[Beschattung\Automatikschaltung\Automatik alle]*/, false);
}

IPS_SetEventActive(42672 /*[Beschattung\Skripte\Automatik alle 1\Bei Variablenaktualisierung der Variable ""]*/, true);

Leider ist es so, dass bei Schalten einer Einzelvariable z.B. auf true das erste Skript trotzdem (auch) ausgelöst wird, so dass alle Einzelvariablen auf true gesetzt werden. Weißt Du, wie es richtig geht???

Hallo Hagbard235,

danke für den Hinweis. Da ich aber vorhabe, die Automatik auch über einen Homematic-Schalter ein- und ausschalten zu können, muss es auch per Skript zugänglich sein…

Du willst also , dass das Hauptscript beim Update von einem Script aufgerufen das angehängte Event-Script ausführt (Homematic-Schalter) und beim anderen Script soll das Event-Script nicht ausgeführt werden (Update durch „untergelagertes“ Script) ?? Schon etwas schräg oder?

Ich würde das ja aufteilen, also einen Event-Trigger auf die „Untervariablen“ legen, wenn das aufgerufen wird den Zustand updaten und für das Schalten von Homematic ein 2. Script, das explizit den Schaltvorgang auslöst, also die Untervariablen auf „true“ setzte. Im ersten, dass den Zustand überprüft kannst du , wenn du es auch als Action-Script fürs Webfront nehmen willst, den Sender abfragen, oder machst dafür ein 3. Script.

Hallo
Hab das gerade mal getestet und es ist so, dass bei „IPS_SetEventActive“ es einige Zeit ( Millisekunden )
braucht bis „umgesetzt“ ist.
Teste doch mal nach dem deaktivieren bzw vor dem aktivieren ein

IPS_Sleep(100);

einzubauen.

Würde ich eher nicht machen… wenn dann jemand mehrere Einzel-Schalter schnell aufeinander drückt kann das „witzig“ werden… der Zustand des Events ist dann eher Glückssache

Aktuell hast du scheinbar ein ausgelöstes Ereignis, das auf eine Variablenänderung reagiert. Das Ereignis reagiert auf jede Änderung der Variable, egal aus welcher Quelle. Du möchtest allerdings, dass dieses Skript nur ausgelöst wird, wenn die Variable über das WebFront geändert wird. Das ist genau das, was ein Aktionsskript ausmacht. Vielleicht solltest du einfach dein ausgelöstes Ereignis durch ein Aktionsskript auf der Gesamtvariablen ersetzen. Schau dir das hier mal an: Aktionsskripte — IP-Symcon :: Automatisierungssoftware

Nein, wie er oben schon schrieb möchte er auch auf andere Scripte reagieren… was aber meiner Meinung nach schon ein Konstruktionsfehler ist… er packt zu viel in ein und das selbe Script

Und ein Aktionskript muss er schon haben, sonst kann er den Wert im Webfront gar nicht setzen!

Das sollte ja keine all zu große Problematik mit dem Aktionsskript sein. Dann ruft man bei dem entsprechenden Schalter halt das gleiche Skript auf.

Und man kann die Funktionalität einem existierenden Aktionsskript auch einfach hinzufügen. Je nachdem was im aktuellen Aktionsskript steht kann man das komplette Schalten entweder mit hinzufügen oder halt in ein separates Skript auslagern, welches im Aktionsskript aufgerufen wird.

Vielen Dank noch mal an Euch alle für die Hinweise und Ideen.

Ich habe es nun zunächst über IPS_SetEventActive und IPS_Sleep(50) gelöst - das klappt soweit auch, selbst wenn ich alle Einzelvariablen (auch mehrfach) direkt hintereinander schalte…

Dennoch werde ich mir den Weg über ein Aktionsskript noch einmal überlegen, da muss ich mich aber erst mal einlsen…

Viele Grüße!!!