Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Schleife langsamer ausführen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Gelöst] Schleife langsamer ausführen

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

      Hallo,

      ich versuche vergebens eine Schleife langsamer ablaufen zu lassen. In der Schleife wird ein IR Signal gesendet, aber leider so schnell hintereinander dass das Gerät es nicht regestriert.

      Schön wäre das einmal pro Sekunde gedrückt wird. Habe schon geguckt wegen Timeout, aber das bezieht sich wohl eher auf knopf gedrückt x sekunden später ausführen oder?

      Wenn ich versuche die Schleife mit einer Schleife auszubremsen so:

      while (k <= i){

      setState("broadlink.0.learnedSignals.Ventiplus",true);

      for(z = 1;z <= 50000; z++) {}

      k++;

      }

      Dann wird einmal gedrückt, für eine zeit gewartet und dann wieder schnell gedrückt…. also würde die zweite Schleife nur 1 mal ausgeführt.

      Gibt es da eine einfache Lösung?

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

        @toto:

        In der Schleife wird ein IR Signal gesendet, aber leider so schnell hintereinander dass das Gerät es nicht regestriert. `
        Sollen mehrere Kommandos/Werte gesendet werden ? Oder soll ein Kommando mehrmals wiederholt werden ?

        Beschreibe bitte erst einmal, was in der Schleife unter welchen Bedingungen (Zeitabstand ?) passieren soll.

        1 Reply Last reply Reply Quote 0
        • T
          toto last edited by

          Es soll das gleiche Kommando mehrmals ausgeführt werden. Im Abstand von einer Sekunde. Zeile mit broadlink. Die sendet ein IR Signal zum Ventilator, um die Luftstärke zu erhöhen bzw. niedriger. Habe dazu Variablen die die aktuelle Stufe speichern, so das der Wert ausgerechnet wird für x mal hoch oder runter schalten. Da die while Schleife aber z. B. 5 mal sofort hintereinander sendet, kommt höchstens 3 mal an. Da der Ventilator 10 Stufen hat und ich das mit Alexa steuer, wäre es super die Signale im richtigen Abstand zu senden.

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

            @toto:

            Es soll das gleiche Kommando mehrmals ausgeführt werden. Im Abstand von einer Sekunde. `
            Dafür gibt es die JS-Funktion timer = setInterval(callback, 1000) (Abstand 1 s). Wenn das Senden der gewünschten Anzahl Kommandos erfolgt ist, wird mit clearInterval(timer) beendet. Etwa so:

            var timer = null;
            var anzahl;  // wird irgendwo im Skript berechnet
            
            function CountDown(s) {
               setState("broadlink.0.learnedSignals.Ventiplus",true);
               s--;
               timer = setInterval(function () {
                     if (s > 0) {
                        setState("broadlink.0.learnedSignals.Ventiplus",true);
                        s--;
                     } else {
                        if(timer) clearInterval(timer);
                     }
                  }, 1000);
            }
            
            CountDown(anzahl);
            
            1 Reply Last reply Reply Quote 0
            • T
              toto last edited by

              VIELEN DANK ^^ Funktioniert bestens.

              Noch eine Frage nebenbei. Ich habe einen Datenpunkt als Zahl, die Unit habe ich leer gelassen, da nicht nötig. Min 0 Max 100. So kann ich sagen Alexa Stelle Stufe auf 7. Das komische ist, dass dann als Wert 7.0000001 übergeben wird. Aber warum??? Bei 3 ist es genau 3. Habe das im Code mit Math.round gelöst. Kann man einem Objekt im vorraus Nachkommastellen streichen lassen? Ist das mit der 1 am Ende ein Fehler von Alexa oder dem Cloud Adapter?

              Falls noch jemand Infrarot Geräte hat und so ein Code benötigt:

              ! ````
              var Stufe;
              var interval;
              var timer = null;
              var anzahl;
              function CountDownPlus(s) { //Funktion Taste Plus im Abstand 1 Sekunde drücken.
              setState("broadlink.0.learnedSignals.Ventiplus",true);
              s--;
              timer = setInterval(function () {
              if (s > 0) {
              setState("broadlink.0.learnedSignals.Ventiplus",true);
              s--;
              } else {
              if(timer) clearInterval(timer);
              }
              }, 1000);
              }
              ! function CountDownMinus(s) { //Funktion Taste Minus im Abstand 1 Sekunde drücken.
              setState("broadlink.0.learnedSignals.Ventiminus",true);
              s--;
              timer = setInterval(function () {
              if (s > 0) {
              setState("broadlink.0.learnedSignals.Ventiminus",true);
              s--;
              } else {
              if(timer) clearInterval(timer);
              }
              }, 1000);
              }
              ! on({id: "javascript.0.Wind"/javascript.0.Wind/, change: "any"},
              ! function (obj) {
              var x = obj.state.val; //Übergebener Wert von der .Wind ID
              x = Math.round(x); //Nachkommastellen wegkürzen
              Stufe = (getState("javascript.0.Stufe").val); //Aktuelle Stufe
              Stufe = Math.round(Stufe);
              ! if (Stufe < x) {
              anzahl = x - Stufe;
              ! CountDownPlus(anzahl);
              ! Stufe = x;
              setState("javascript.0.Stufe", Stufe); //Neue aktuelle Stufe
              ! } else if (Stufe > x) {
              anzahl = Stufe - x;

              CountDownMinus(anzahl);

              Stufe = x;
              setState("javascript.0.Stufe", Stufe);
              

              }});

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

              Support us

              ioBroker
              Community Adapters
              Donate

              817
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              2
              5
              1743
              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