NEWS
Scripte stossen sich gegenseitig an (loop)
-
Hallo zusammen
Dies ist ein generelles Problem, welches ich nun schon mehrmals hatte, ich nun aber einfach versuche mit diesem simplen Beispiel zu erklären.
Ich habe für eine LED vier verschiedene Objekte:
- Level (0-100)
- Rot (0-255)
- Grün (0-255)
- Blau (0-255)
Ich habe 2 Scripte erstellt:
- Wenn eines der Farben-Datenpunkte geändert wird, so wird der "Level" neu berechnet
- Wenn der Level-Wert verändert wird, so werden die Farben-Datenpunkte neu berechnet.
In beiden Blockly-Scripten wird die Ausgabe auf eine ganze Zahl gerundet, bevor diese in das Objekt geschrieben wird.
Durch das Runden auf die Ganz-Zahl kann es nun aber vorkommen, dass sich die beiden Scripte gegenseitig anstossen und dies in einem unendlichen Loop endet.Ich habe dies lösen können, indem ich noch einen weiteren Datenpunkt erstellt habe, welcher vor den Änderungen für 100ms auf true und anschliessend wieder auf false gesetzt wird. Die Scripte haben dann beide die Logik, dass nur etwas getan werden soll, wenn der neue Datenpunkt auf "false" steht.
Funktioniert zwar, ist aber nicht sehr elegant. Hat hierfür jemand eine Lösung, welche ohne zusätzlichen Datenpunkt auskommt?Ich könnte z.B. die beiden Scripte in ein einzelnes Script verwandeln und auswählen, dass das Script nur gestartet werden darf, wenn dieses nicht bereits läuft.
Nur wie lässt sich dies einstellen? -
@wizzardking sagte:
Hat hierfür jemand eine Lösung, welche ohne zusätzlichen Datenpunkt auskommt?
Zusätzliche Abfrage (für Instanz: Javascript.0)
falls Ursprung != "system.adapter.javascript.0" und vorheriger Ursprung != "system.adapter.javascript.0"
-
Danke Vielmals.
Nur, wie lässt sich der Ursprung auf ein spezifisches Script zurückführen?
In IOBroker wird als Ursprung einfach immer nur der Javascript Adapter (system.adapter.javascript.0) angezeigt.Wenn ich nun aber mittels eines anderen Scripts die RGB Werte verändere, dann sollte der Level Wert aber dennoch verändert werden, was in dem Fall aber nicht passieren würde.
-
@wizzardking Wo kommt die ursprüngliche Änderung her? Eigentlich gibt es für sowas das ACK (bestätigt) Flag.
Bei Änderungen aus anderen Adaptern oder dem Admin ist dieses false, dann musst du drauf reagieren. Wenn du selbst die Datenpunkte setzt, ohne dass darauf reagiert werden soll (also eine Bestätigung), solltest du das Flag setzen.Das gleiche dürfte auch für Skripte gelten. Also nur auf ACK=false triggern, "fremde" Datenpunkte mit ACK=false setzen und "eigene" Datenpunkte mit ACK=true setzen.