Einstieg ins Skripten

Guten Morgen ihr!

Ich habe mich mittlerweile etwas vertraut gemacht mit der Oberfläche von IPS und möchte anfangen, eigene Skripte zu schreiben und damit mal ein wenig zu experimentieren.

Nun hänge ich aber aktuell beim Einstieg fest. Nehmen wir mal an, ich habe einen Button ($button) und einen Schalter, den ich damit ein- oder ausschalten möchte ($switch).

Intuitiv würde ich jetzt hingehen und bei der State-Variable des Switches (also Boolean on oder off) ein Skript hinzufügen. Wie sähe jetzt aber ein simples Skript aus, das den Status des Buttons abfragt und dementsprechend das Licht ein- oder ausschaltet?

Außerdem noch eine Frage zum Workflow: Die Schalter-Variable hat im Grunde nur den Wert „Initial Press“; bisher frage ich also den Aktualisierungszeitpunkt ab, macht das Sinn? Also wenn der Button gedrückt wird, ändern sich Datum und Uhrzeit in der Spalte „Aktualisiert“, und wenn das geschieht, wird ein Schalter ausgelöst.

Und ZigBee funktioniert ja, wenn ich das richtig verstanden habe, nicht bidirektional. Habt ihr kluge Tipps, wie man hier Probleme tracken kann? Also wenn ich z. B. dreimal einen Button betätige und nichts passiert, beim vierten Mal drücken geht aber plötzlich doch das Licht an. Wie geht ihr bei sowas auf Fehlersuche? Speichert ihr gleichzeitig Einträge in einer Log-Datei ab?

In dem Fall wäre es nicht so dramatisch, da der Button ja eh keinen On oder Off Wert hat. Ich könnte mir aber vorstellen, dass es schwer wird, wenn man verschiedene Geräte hat, deren On/Off-Werte sich aneinander orientieren sollen.

Vielen Dank auf jeden Fall schonmal für eure Tipps,
Patrick

Du solltest in Instanzen und Variablen denken. Ich vermute, Dein Button ist eine Variable und Dein Schalter eine Instanz.

Der Wert des Buttons ist in der Systemvariable $_IPS[‚VALUE‘] enthalten.
Mehr dazu hier:
https://www.symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/

Nein, das macht keinen Sinn. Besser auf das Skript ein Ereignis legen, welches „bei Aktualisierung“ auslöst.

Wie kann ich das hier unterscheiden? Ich hatte gedacht, dass die Geräte an sich Instanzen sind, die Zustände aber Variablen (in der Übersicht die lila Tags). Also „Arbeitszimmer“ (Osram Steckdose) und „SmartSwitch“ (Xiaomi Switch) Instanzen, „State“ und „Button 1“ Variablen.

Wo ist hier der Vorteil? Das soll keine Kritik sein, ich versuche nur, es nachzuvollziehen. Bis jetzt habe ich es so gelöst, dass ich per Rechtsklick auf den „State“ der Steckdose ein Ereignis hinzugefügt habe. Wenn ich stattdessen ein Skript anhänge, in dem das Licht eingeschaltet wird und dem Skript ein Ereignis hinzufüge - inwiefern unterscheidet sich der Ablauf dann?

Und: Wenn ich es über ein Ereignis löse, benötige ich dann überhaupt den Wert des Buttons? Dann könnte ich ja nur ein Skript nehmen, in dem das Licht eingeschaltet wird - und dieses Skript dann mit einem Event versehen. Die logische Abfrage innerhalb des Skriptes bleibt ja dann aber aus, bzw. ich möchte ja gerade versuchen, es ausschließlich über Skripte zu lösen, um hier einen Einstieg zu bekommen.

Werde morgen ausführlich darauf eingehen .

Genau so ist es richtig. „Arbeitszimmer“ und „Smart_Switch“ sind Instanzen, das da drunter sind die Variablen. Das Du die Begrifflichkeiten Instanz und Variable bereits richtig zuordnen kannst, war aus Deinem ersten Beitrag nicht ersichtlich. Sorry.

Es liest sich so, dass Du ein Skript zyklisch laufen lassen möchtest, um den Aktualisierungszeitpunkt der Variable abzufragen, damit Du entsprechend darauf reagieren kannst, wenn sich die Variable geändert hat. Das geht prinzipiell, frisst aber zu viele Ressourcen und ist etwas umständlich. Genau dafür sind Ereignisse da.

Der Ablauf wird sich nicht unterscheiden. Das Ergebnis wird genau das Gleiche sein. Ich persönlich habe mir in über 10 Jahren IP-Symcon gewisse Dinge angewöhnt. Dazu gehört zum Beispiel, dass ich Ereignisse niemals unter Variablen erstelle, sondern immer nur unter Skripten. Ich habe auch separate Kategorien für die Instanzen. Wenn ich z.B. mein Außenlicht in Abhängigkeit der Außenhelligkeit schalten möchte, dann gibt es innerhalb der Kategorie „Außen“, die Kategorie „Beleuchtung“. Da sind die Instanzen für die Beleuchtung drin. Dann gibt es innerhalb der Kategorie „Außen“ noch eine Kategorie „Automatiken“. Da ist dann ein Skript drin, welches auf Änderung der Außenhelligkeit reagiert und somit die Beleuchtung einschaltet. Ich finde es so am Einfachsten, am Schnellsten und am Übersichtlichsten. Wenn ich Ereignisse unter die Variablen hängen würde, dann wird es schnell unübersichtlich. So jedenfalls meine Meinung. Das darf aber jeder so machen, wie er möchte.

Gehen wir davon aus, Du hast im WebFront einen Button mit angehängtem Aktionskript. Du musst innerhalb des Skriptes ja wissen, ob der Button gerade „Aus“ oder „An“ geschaltet wurde. Von daher brauchst Du den Wert des Buttons. Dieser wird Dir mit $_IPS[‚VALUE‘] innerhalb des Skriptes zur Verfügung gestellt.
Du kannst natürlich auch ein Skript nehmen und unter das Skript ein Ereignis hängen, welches auf Änderung des Buttons reagiert. Auch das wäre möglich. Viele Wege führen nach Rom.

Vielen Dank @DerStandart, das bringt auf jeden Fall etwas Licht ins Dunkel. :slight_smile:

Angenommen Du möchtest mit einem Button im Webfront einen Aktor (Licht) ein und ausschalten.

Dann kannst Du die Umsetzung des Buttons im Webfront auch über den Status des Zielaktors realisieren. Sprich erst wenn der Zielaktor = Ein, dann Variable des Schalters umstellen. Somit verhindert man paradoxe Zustände, sollte aus welchen Gründen auch immer der Zielaktor nicht reagieren.
Sonst könnte es sein das der Button in ‚Ein‘ steht, das Ziel aber im Status ‚Aus‘, weil der Aktor aus welchen Gründen auch immer nicht reagiert hat.

Wenn der Aktor nicht reagiert, gibt es keine Rückmeldung, also bleibt der Status so wie er ist. Nix mit paradoxen Zuständen. Zumindest nicht bei KNX.

Der Button welcher das Script gestattet hat würde aber auf ein stehen, obwohl das Script eventuell einen Fehler geworfen hat und der Aktor tatsächlich auf Aus steht.
Natürlich steht dann auch die Variable vom Aktor auf Aus. Aber der Button halt nicht und die Fehlermeldung wurde durch das Ereignis im Log abgelegt und nicht im Frontend angezeigt.

Das ist ein Beispiel für ein schlechtes Aktionsskript, wie es auch in der Doku steht.
Diese Weg nach Rom also nicht benutzen.
Michael

Stimmt, das hätte ich noch explizit dazuschreiben sollen. Danke für die Klarstellung.