Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Code Optimierung bei 6 Timern - wie

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Code Optimierung bei 6 Timern - wie

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

      Liebe Leute,

      ich hab wiedermal einen "einfach gestrickten" Code von mir, der mit einer neuen Anwendung nun an seine Grenzen stößt und ich nicht mehr weiter weiß.

      Der unten angeführte Code macht nichts anderes, als nach 5, 6,7 8, 9 und 10 Minuten die Rollläden immer ein Stück weiter nach obenm zu stellen iund so im Zimmer langsam hell zu machen.

      ! if ((getState(idLuxmeter).val >= 10 ) && (getState(idRollladenSZ).val === 0)){ var timer1 = null; var timer2 = null; var timer3 = null; var timer4 = null; var timer5 = null; var timer6 = null; if(timer1) clearTimeout(timer1); timer1 = setTimeout(function() {setState(idRollladenSZ, 13)}, 300000); if(timer2) clearTimeout(timer2); timer2 = setTimeout(function() {setState(idRollladenSZ, 23)}, 360000); if(timer3) clearTimeout(timer3); timer3 = setTimeout(function() {setState(idRollladenSZ, 35)}, 420000); if(timer4) clearTimeout(timer4); timer4 = setTimeout(function() {setState(idRollladenSZ, 52)}, 480000); if(timer5) clearTimeout(timer5); timer5 = setTimeout(function() {setState(idRollladenSZ, 70)}, 540000); if(timer6) clearTimeout(timer6); timer6 = setTimeout(function() {setState(idRollladenSZ, 100)}, 600000); } !

      Nun möchte ich das einerseits vereinfachen und wieder a bisserl was lernen, andererseits aber eine Funktion einführen, die die Timer alle stoppt, sodern die Rollladen NICHT auf der eigentlich nun vorgegebenen Position stehen.

      Also, z.B: es startet mit dem ersten Timer und der Rollladen geht ein Stück auf - nun möchte ich das aber nicht und stoppe die Bewegung am Schalter + stelle ihn wieder runter auf geschlossen.

      Der nächste Timer soll somit immer nur dann ausgeführt werden, wenn der Rollladen an der Position des vorigen Timers steht, sonst nicht….

      :?: :?: :?: wie geht das sinnvoll?

      Ich würde die einzelnen Timer verschachteln und so immer nur den nächsten Starten wenn der vorige abgelaufen ist, aber dann hab ich ja mit dem If's 6 Co "Hunderte" Verschachtelungen in geschwungenen Klammern...das muss ja irgendwie einfacher gehen, oder?

      Liebe Grüße

      tom

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

        Dafür sind die Funktionen setInterval() und clearInterval() in Zusammenhang mit einer Zählvariablen besser geeignet.

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

          @paul53:

          Dafür sind die Funktionen setInterval() und clearInterval() in Zusammenhang mit einer Zählvariablen besser geeignet. `

          …perfekt, danke! Werd' ich mir anschauen.

          Liebe Grüße

          Tom

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

            Liebe Leute,

            irgendwie kappier ich die Funktion von setInterval nicht ganz - ich versuche die Dauer variabel zu gestalten, aber egal was für einen Wert ich im Objekt stehen hab, er macht immer den ersten Wert = 60 Sekunden….

            ! ````
            setInterval(function(Anwesenheit_Timer_Tom) {

            helper  = getState(id_Tom_count).val;
            .......
            
            .......
            
            .......
            
            .......
                    setState(id_Tom_Intervall, Intervall);
                }
            });
            

            }, getState("javascript.0.Anwesenheit.Tom.Telefon_Tom_Intervall"/Telefon_Tom_Intervall/).val);

            ! ````

            Wie bringe ich ihn dazu diesen Wert in der letzten Zeile auch tatsächlich immer auszulesen?

            Liebe Grüße

            tom

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

              @etv:

              nach 5, 6,7 8, 9 und 10 Minuten die Rollläden immer ein Stück weiter nach obenm zu stellen `
              Die Funktion kann man mit einer festen Intervallzeit von 1 Minute realisieren.

              var timer = null;
              var cnt = 0;
              var pos = 0;
              
              function rollosHoch() {
                 cnt = 0;
                 pos = getState(idRollladenSZ).val;
                 if (getState(idLuxmeter).val >= 10 && pos === 0) {
                    timer = setInterval(function() {
                       cnt++;
                       if(cnt === 5) pos = 13;
                       if(cnt === 6) pos = 23;
                       if(cnt === 7) pos = 35;
                       if(cnt === 8) pos = 52;
                       if(cnt === 9) pos = 70;
                       if(cnt === 10) {
                          pos = 100;
                          clearInterval(timer);
                          timer = null;
                       }
                       if(pos) setState(idRollladenSZ, pos);  
                    }, 60000); // 1 Minute
                 }
              }
              

              @etv:

              stoppe die Bewegung am Schalter + stelle ihn wieder runter auf geschlossen. `
              Beim Stopp per Schalter wird auch der Timer gestoppt.

                 if(timer) {
                    clearInterval(timer);
                    timer = null;
                 }
              
              1 Reply Last reply Reply Quote 0
              • etv
                etv last edited by

                wow….. 😄

                Es ist immer ein Wahnsinn, wenn ich eure Scripte sehe - da muss ich dann erst mal 5 Minuten drüber nachdenken warum das überhaupt geht 😄 😄 😄

                Danke für den Input - bau ich gleich um!

                Liebe Grüße

                tom

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

                  Liebe Leute,

                  jetzt muss ich da nochmal was nachfragen zu dem Thema setInterval.

                  Wie muss der Aufbau der Funktion setInterval korrekt aussehen, wenn das Script bei jedem Ablauf des Intervalls die vorige setInterval Funktion wieder löscht und "sich selbst" erneut startet.

                  Also in etwa so:

                  timer = setInterval(function() {

                  ….die Funktion läuft

                  ...

                  ...

                  clearInterval(timer);

                  timer = null;

                  }, 60000);

                  ...und jetzt wieder von vorne starten aber mit anderem Intervall???

                  Liebe Grüße

                  tom

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

                    @etv:

                    wenn das Script bei jedem Ablauf des Intervalls die vorige setInterval Funktion wieder löscht und "sich selbst" erneut startet. `
                    Nach jeder Intervalldauer stoppen entspricht der Funktion setTimeout(). setIntervall() verwendet man, wenn mehrere gleich lange Intervalle bis zu einer Abbruchbedingung ausgeführt werden sollen.

                    function mache_verzoegert(delay) { // delay in s
                      setTimeout(function() {
                         // Hier die Aktion
                         let delay_neu = // Berechnung neue Verzögerungszeit;
                         if(!Abbruchbedingung) mache_verzoegert(delay_neu); // Schleife soll nicht ewig laufen !
                      }, 1000 * delay);
                    }
                    
                    // Erster Aufruf mit 1 Minute Verzögerung
                    mache_verzoegert(60);
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • etv
                      etv last edited by

                      @paul53:

                      @etv:

                      wenn das Script bei jedem Ablauf des Intervalls die vorige setInterval Funktion wieder löscht und "sich selbst" erneut startet. `
                      Nach jeder Intervalldauer stoppen entspricht der Funktion setTimeout(). setIntervall() verwendet man, wenn mehrere gleich lange Intervalle bis zu einer Abbruchbedingung ausgeführt werden sollen.

                      function mache_verzoegert(delay) { // delay in s
                        setTimeout(function() {
                           // Hier die Aktion
                           let delay_neu = // Berechnung neue Verzögerungszeit;
                           if(!Abbruchbedingung) mache_verzoegert(delay_neu); // Schleife soll nicht ewig laufen !
                        }, 1000 * delay);
                      }
                      
                      // Erster Aufruf mit 1 Minute Verzögerung
                      mache_verzoegert(60);
                      
                      ```` `  
                      

                      herzlichen Dank, dann hab ich da Äpfel und Birnen vermischt 😄

                      Liebe Grüße

                      tom

                      PS: warum gibt's im Forum keine "DANKE"-Button mehr oder find' ich ihn nur nicht mehr?? :?:

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      856
                      Online

                      31.7k
                      Users

                      79.9k
                      Topics

                      1.3m
                      Posts

                      2
                      9
                      695
                      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