Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Script wird mehrfach ausgeführt

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Script wird mehrfach ausgeführt

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      andre1000 last edited by

      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é

      G 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by paul53

        @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.

        1 Reply Last reply Reply Quote 0
        • G
          Georgius @andre1000 last edited by

          @andre1000

          Was willst Du überhaupt erreichen?

          1 Reply Last reply Reply Quote 0
          • A
            andre1000 last edited by

            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é

            G 1 Reply Last reply Reply Quote 0
            • G
              Georgius @andre1000 last edited by

              @andre1000

              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.

              1 Reply Last reply Reply Quote 0
              • A
                andre1000 last edited by

                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é

                1 Reply Last reply Reply Quote 0
                • G
                  Georgius last edited by Georgius

                  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?

                  1 Reply Last reply Reply Quote 0
                  • A
                    andre1000 last edited by

                    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 wird

                        if (!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:
                    0a5be7f2-2fdf-45ca-bffb-4ecdb4f979e8-grafik.png
                    Was mich wundert, ist warum die Variable erst im nächsten Script aktualisiert ist.

                    1 Reply Last reply Reply Quote 0
                    • A
                      andre1000 last edited by

                      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.
                      07b30bf2-e620-4fd0-b01b-a05b0f546258-grafik.png

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      964
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      688
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo