Sorry dass ich das Thema wieder hoch hole, aber bei mir ist es immer noch (leider) sehr aktuell. Es kommt an den verschiedensten Stellen immer mal wieder vor, dass sich zwei Variablen, die voneinander abhängen, gegenseitig die Änderungsskripte triggern, was dann endlos weitergeht und schnell zum Absturz bzw. erheblichen Lags führt.
Es ist kein Bug in IPS, sondern ein Problem der Herangehensweise. Warum wähle ich dann eine Herangehensweise, könnte man dann natürlich fragen, bei der sowas passieren kann?
Um es etwas besser verständlich zu machen, was ich da tue und warum, hier ein Beispiel:
Ich habe in einem Raum mehrere Variablen für das Licht. Eine namens Lichtstimmung, die die Index-Nummer der aktuellen Lichtstimmung enthält. Wenn man diese Variable ändert, sollen die Dimmer im Raum alle die jeweils für diesen Dimmer in dieser Stimmung korrekten Wert anfahren.
Jeder Dimmer hat nun wieder auch eine Variable, die den aktuellen Wert in % enthält. Diese werden wie gesagt vom Skript gesetzt sobald man die Variable für Lichtstimmung ändert, man kann sie aber auch einzeln setzen.
Soweit, so simpel.
Nun will ich aber gerne, dass wenn man alle Lampenvariablen einzeln, z.B. im Webfront, auf 0 setzt, dann auch die entsprechende Lichtstimmung in der Lichtstimmungs-Variablen (hier 0 für alles aus) gesetzt wird. Und dort beißt sich die Katze in den Schwanz.
Im Prinzip ist es gar kein Problem, denn wenn ich die letzte Lampe manuell auf 0 gestzt habe, daraufhin die Lichtstimmung z.B. von 1 auf 0 umspringt und er dort nochmals alle Lampen auf 0 setzt, dann werden deren onChange-Events ja gar nicht mehr gefeuert, weil sich ja nichts geändert habe. Wo liegt also das Problem?
Das Problem entsteht, wenn aus irgendeinem Grund zwei unterschiedliche Werte mehr oder midner zeitgleich gesetzt werden, die sich gegenseitig bedingen. Typisches Beispiel ist, dass jemand unkoordiniert auf der Fernbedienung herumdrückt und plötzlich zwei unterschiedliche Lichtszenen unmittelbar hintereinander aufruft.
In IPS scheint es eine Art Queue zu geben mit den Variablenänderungen, die dann durchgegangen wird um die entsprechenden Ereignisse auszulösen. Wenn zwei Ereignisaufrufe dabei sind, die sich auf Umwegen immer wieder gegenseitig auslösen (bspw Szene AUS schaltet Lampe A aus, aber bevor die Ereignisprozedur für Lampe A aufgerufen wird, kommt Szene EIN, welche wiederum Lampe A auf 80% setzt. Dann werden die Ereignisse für Lampe A durchgegangen, zunächst das Ereignis dass sie AUS geht, welches den Aufruf von Szene AUS zur Folge hat und bevor auf diese reagiert werden kann, direkt danach Lampe Änderugn auf 80%, woraufhin die Szene EIN gestzt wird… und wieder von vorne… sehr schnell, sehr oft hintereinander…)
Beim Licht ließ sich das dadurch verhindern, dass man eine Lampe einfach nicht mehrmals pro 2 Sekunden setzen kann, ansonsten wird der Schaltbefehl ignoriert (Ereignisprozedur bricht sofort ab).
Bei Lautstärkewerten kann das aber z.B. schwierig werden, denn diese darf man natürlich auch mehrfach schnell hintereinander verändern (Stichwort Fernbedienung gedrückt halten). Lautstärkewerte sind bei mir auch teilweise recht komplex verknüpft (2 Audio-Kanäle mit Masterregler-variablen, die zu 8 Raumreglervariablen äquivalent sind und mit diesen synchronisiert werden, wenn diese auf den entsprechenden Kanal eingestellt sind, ansonsten unabhängig). Es gibt Probleme wenn man schnell zweimal hintereinander die Lautstärkewerte ändert.
Ich kann aber hier nicht einfach sagen „wenn schonmal geändert in den letzten 2 Sekunden, dann return“, denn es gibt hier ja viele Fälle in denen so häufige Aufrufe legitim sind… knifflig.
Hat jemand eine gute Idee, wie man mit sowas umgehen kann?
Und bitte, Tipps wie „keep it simple“ und „mach sowas einfach nicht“ helfen mir in dieser Sache nicht. Ich weiß selbst, dass ich es mir leichter machen könnte indem ich auf Funktionalität verzichte. Es ist auch nicht so dass meine Skripte nicht 99% gut funktionieren würden, es geht nur um diese eine blöde Situation wenn sich da zwei Änderungen gegenseitig auslösen.
Dafür suche ich händeringend nach einer Lösung, am liebsten wäre mir eine generische Prozedur die man oben in ein Skript schreiben kann, zumindest als „Fallschirm“.
Auch würde mich interessieren ob schon andere über ähnliche Probleme gestolpert sind.