NEWS
Script wird mehrfach ausgeführt
-
Moin zusammen,
ich habe das Problem, dass ein Skript doppelt ausgeführt wird. Inzwsichen habe ich auch die vermeindliche Ursache gefunden, aber noch keine Idee, wie ich es besser machen kann.Hier die Situation:
Es wird ein Taster betätigt, daruf werden mehrere Objekte im Script A geändert:on({id: 'javascript.0.Zustand.EG.Licht-Schummer'}, function (obj) { if (!getState('javascript.0.Zustand.EG.Licht-Schummer').val ) { setState('javascript.0.Zustand.Wohnzimmer.Licht-Schummer',0); setState('javascript.0.Zustand.Wohnzimmer.Licht-Dunkel',0); setState('javascript.0.Zustand.Wohnzimmer.Licht-Hell',0); } });
Diese Objekte werden dann von einem weiteren Script B weiterverarbeitet:
on([ 'javascript.0.Zustand.Wohnzimmer.Licht-Dunkel', 'javascript.0.Zustand.Wohnzimmer.Licht-Hell', 'javascript.0.Zustand.Wohnzimmer.Licht-Schummer', 'javascript.0.Zustand.Wohnzimmer.Alles-an', 'javascript.0.Zustand.Wohnzimmer.Test' ], function (obj) { ...
Meine Vermutung ist, dass im Script A die Objekte nacheinander gesetzt werden und somit das Script B dreimal ausgeführt wird.
Vielen Dank für die Unterstützung
André -
@andre1000 sagte:
Meine Vermutung ist, dass im Script A die Objekte nacheinander gesetzt werden und somit das Script B dreimal ausgeführt wird.
Deine Vermutung ist richtig, aber nur dann, wenn sich der Wert aller 3 Datenpunkte durch das Script A ändert.
-
Was willst Du überhaupt erreichen?
-
Moin,
was möchte ich mit den Scripten erreichen.
Script A weist die Schalterbedienung einem internen Objekt zu. Von dieser Art gibt es mehrere mit den gleichen Zielobjekten.
Script B fasst alle Informationen zusammen und sendet diese per CAN-Telegramm an eine Steuerung zur Umsetzung der Schalthandlung (Relais) weiter.
Also, die Struktur ist so vorgegeben, leider aktuell nicht kompatibel mit meiner Programmierung.Hat jemand eine Idee, was ich anders/besser machen kann?
André
-
Ich würde noch einen fiktiven Schalter dazu nehmen. Den in allen Skript A mit schalten und nur den in B abfragen.
Oder in B in dem if ein "und variable ist fasch" ergänzen.
Dann
die Variable auf wahr setzen
Was der Skript alles machen soll
Etwas warten
Die Variable wieder auf falsch setzen.Ob und wie lange das warten dauert hängt von der Laufzeit (mit Reserve) von Skript A ab.
-
Die Idee mit dem fiktiven Schalter hatte ich auch schon. Leider wird daruch die gesamte Struktur in IoBroker zu unübersichtlich.
Die zweite Idee mit der IF Abfrage hört sich interessant an. Was ist die beste Zeit dafür? Reichen 10ms aus?André
-
Kannst ja ausprobieren. Einfach im 2. Skript ein Log mitlaufen lassen.
Aber warum wird das mit dem Schalter unübersichtlich? Hast Du mehrere Skript B?
-
Ja, ich habe mehrere Scripte, die den Zustand ändern können.
Ich habe die Idee mit der IF Abfrage ausprobiert. Leider ohne positives Ergebnis.
Für mich scheint es so, als wenn das Script B parallel gestartet wird. Jedenfalls wir die Statusänderung des Hilfszustandes nicht im zweiten Script verwendet:
Ein Log ist in Script A, im Script B wurde so agepasst, dass der Haupteil nur ausgeführt wirdif (!getState('javascript.0.CAN_OUT.Help.0x3xx').val) // CAN Trigger { setState('javascript.0.CAN_OUT.Help.0x3xx', 1); // CAN Trigger
Die Hilfsvariable wird im Script C zurückgesetzt.
setStateDelayed('javascript.0.CAN_OUT.Help.0x3xx', 0, 100); // CAN Trigger
Hier der Log dazu:
Was mich wundert, ist warum die Variable erst im nächsten Script aktualisiert ist. -
Moin
bin schin etwas weiter gekommen.
Habe jetzt eine Java Variable genommen, damit läuft die IF Abfrage in Script B. Jedoch muss ich die Variable trotzdem in Script C zurücksetzten.setTimeout(function() {CAN_OUT_Help_0x13x;}, 100);
funktioniert in Script B leider nicht.
Jetzt habe ich das nächste Problem.
Es werden ja insgesamt drei Zustände durch Script A verändert. Leider wird nur die erste übernommen, obwohl die Zustände bereits seit ca 200ms gespeichert sind.