Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Loeschen von setStateDelayed Ausschaltplanung moeglich ?

    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] Loeschen von setStateDelayed Ausschaltplanung moeglich ?

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

      Hi,

      ich habe ein Problem mit SetDelay. Ich versuche eine Planung fuer das Ausschalten einer Lampe zu loeschen.

      Der Delay scheint aber nur fuer die Einschaltverzoegerung loeschbar zu sein und nicht fuer das Ausschalten der Lampe.

      Hier ist der Case:

        setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true, 0);    // Schalte ohne Verzoegerung ein
        setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",false,30000);   // schalte nach 30 Sekunden aus
        setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true,0,true);    // Schalte die  Lampe sofort an und loesche die Planung
      
      

      Wenn das Script abläuft, dann wird die Lampe nach 30 Sekunden ausgeschaltet, egal was ich im dritten Statement schreibe.

      Gibt es evt noch eine andere Möglichkeit das Ausschalten zu verhindern ?

      vG Looxer

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hallo Looxer,

        @[url=https://github.com/iobroker/ioBroker.javascript/blob/master/README.md#setstatedelayed:

        Javascript Doku"]

        setStateDelayed('Kitchen.Light.Lamp', true,  1000);// Switch ON the light in the kitchen in one second
        setStateDelayed('Kitchen.Light.Lamp', false, 5000, false, function () { // Switch OFF the light in the kitchen in 5 seconds and let first timeout run. 
            log('Lamp is OFF');
        });
        ```` `  
        

        wenn ich die Doku hier richtig verstehe, dann ist das zweite 'false' in Zeile 2 für das Beenden des Timeouts aus Zeile 1 verantwortlich.

        Also müsste Dein Code doch so sein:

        setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true, 0);    // Schalte ohne Verzoegerung ein
         setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",false,30000);   // schalte nach 30 Sekunden aus
         setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true,0,false);    // Schalte die  Lampe sofort an und loesche die Planung
        
        

        Gruß,

        Pix

        1 Reply Last reply Reply Quote 0
        • L
          looxer01 last edited by

          Hi Pix,

          der Hinweis sagt "let timeout run" also vermute ich, dass der timeout nicht gelöscht wird, wenn in Zeile 2 der Docu ein false steht.

          Aber egal wie -true oder false - hab alles probiert. Die Lampe geht aus, was sie doch eigentlich nicht tun sollte ?

          Eigenartig ist auch, dass das ganze mit setState auch nicht funzt:

          setState(IDGruppe12,true);    // Schalte ein
          setTimeout(function (){                                                                             
               setState(IDGruppe12,false);   }, 30000);                                                    
          clearTimeout (IDGruppe12);   / loesche den timeout
          
          

          Könnte es ein Problem mit der JS implementierung geben ?

          vG Looxer

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

            clearTimeout muss auf eine Timer-Variable angewendet werden:

            setState(IDGruppe12,true);    // Schalte ein
            var timer = setTimeout(function (){                                                                             
                 setState(IDGruppe12,false);   }, 30000);                                                   
            clearTimeout (timer);   / loesche den timeout
            
            
            1 Reply Last reply Reply Quote 0
            • blauholsten
              blauholsten Developer last edited by

              @looxer01:

              Hi Pix,

              der Hinweis sagt "let timeout run" also vermute ich, dass der timeout nicht gelöscht wird, wenn in Zeile 2 der Docu ein false steht.

              Aber egal wie -true oder false - hab alles probiert. Die Lampe geht aus, was sie doch eigentlich nicht tun sollte ?

              Eigenartig ist auch, dass das ganze mit setState auch nicht funzt:

              setState(IDGruppe12,true);    // Schalte ein
              setTimeout(function (){                                                                             
                   setState(IDGruppe12,false);   }, 30000);                                                    
              clearTimeout (IDGruppe12);   / loesche den timeout
              
              

              Könnte es ein Problem mit der JS implementierung geben ?

              vG Looxer `

              bin zwar Anfänger, aber ich denke du musst eine Variable dafür verwenden bzw übergeben.

              EDIT: War jemand schneller!

              1 Reply Last reply Reply Quote 0
              • L
                looxer01 last edited by

                jo und so stehts in der Docu:

                myVar = setTimeout(function, milliseconds);
                clearTimeout(myVar);
                
                

                Hab ich wohl nicht ernst genug genommen 😮

                Danke euch

                1 Reply Last reply Reply Quote 0
                • L
                  looxer01 last edited by

                  …also ich möchte gerne ncohmal auf das Thema zurückkommen.

                  Ich habe jetzt versucht setStateDelayed und setTimeout miteinander zu verbinden was auch funktioniert.

                  z.B.

                  Schalte Lampe ein in 10 Sekunden.

                  setStateDelayed(IDGruppe12,true, 10000);
                  
                  

                  Schalte Lampe aus in 30 Sekunden

                  var timer = setTimeout(function (){                                                                             
                     setState(IDGruppe12,false);   }, 30000);  
                  
                  

                  Ich kann die Ausschaltzeit killen durch

                  clearTimeout (timer);
                  
                  

                  Allerdings schaffe ich es nicht die Einschaltverzoergerung zu loeschen. Nach Doku und wie Pix ja auch sagt sollte das mit false moeglich sein.

                  Ich habe true and false getestet mit dem Coding unten. Die Einschaltverzoegerung wird aber nicht gelöscht.

                  setStateDelayed(IDGruppe12,true, 15000);   		// Licht an in  15 Sekunden
                  setStateDelayed(IDGruppe12,true, 10000,false);		// Licht an in 10 Sekunden und loesche 15 Sekunden
                  setStateDelayed(IDGruppe12,false,11000);			// Licht aus in 11 Sekunden
                  
                  

                  bei dem code könnte man erwarten, dass das Licht nach dem Ausschalten nicht mehr eingeschaltet wird.

                  Leider ist das so nicht Das Licht wird nach 15 Sekunden wieder eingeschaltet.

                  Mache ich da noch was falsch ?

                  Oder gibt es noch einen anderen Weg ?

                  vG Looxer

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

                    @looxer01:

                    Hi,

                    ich habe ein Problem mit SetDelay. Ich versuche eine Planung fuer das Ausschalten einer Lampe zu loeschen.

                    Der Delay scheint aber nur fuer die Einschaltverzoegerung loeschbar zu sein und nicht fuer das Ausschalten der Lampe.

                    Hier ist der Case:

                      setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true, 0);    // Schalte ohne Verzoegerung ein
                      setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",false,30000);   // schalte nach 30 Sekunden aus
                      setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true,0,true);    // Schalte die  Lampe sofort an und loesche die Planung
                    
                    

                    Wenn das Script abläuft, dann wird die Lampe nach 30 Sekunden ausgeschaltet, egal was ich im dritten Statement schreibe.

                    Gibt es evt noch eine andere Möglichkeit das Ausschalten zu verhindern ?

                    vG Looxer `
                    Ich denke, das ist ein Bug und es sollte gehen. Muss schauen.

                    Ich kann noch zusätzlich noch so machen, dass die Funktion Händler auf timer zurück gibt und man kann die einfach mit clearTimer löschen.

                    1 Reply Last reply Reply Quote 0
                    • L
                      looxer01 last edited by

                      Hi Bluefox,

                      @looxer01:

                      ch kann noch zusätzlich noch so machen, dass die Funktion Händler auf timer zurück gibt und man kann die einfach mit clearTimer löschen. `

                      ich bin nicht sicher, ob ich das richtig verstanden habe aber ich denke du meinst die javascript Funktion clearTimeout() ?.

                      Die löscht aber nicht die Einschaltverzögerung - oder doch ?

                      vG Looxer

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

                        @looxer01:

                        Hi,

                        ich habe ein Problem mit SetDelay. Ich versuche eine Planung fuer das Ausschalten einer Lampe zu loeschen.

                        Der Delay scheint aber nur fuer die Einschaltverzoegerung loeschbar zu sein und nicht fuer das Ausschalten der Lampe.

                        Hier ist der Case:

                          setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true, 0);    // Schalte ohne Verzoegerung ein
                          setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",false,30000);   // schalte nach 30 Sekunden aus
                          setStateDelayed("hm-rpc.0.IEQ0xxxxxx.1.STATE",true,0,true);    // Schalte die  Lampe sofort an und loesche die Planung
                        
                        

                        Wenn das Script abläuft, dann wird die Lampe nach 30 Sekunden ausgeschaltet, egal was ich im dritten Statement schreibe.

                        Gibt es evt noch eine andere Möglichkeit das Ausschalten zu verhindern ?

                        vG Looxer `
                        War tatsächlich ein Fehler drin. Habe gefixt.

                        Es gibt jetzt auch clearStateDelayed funktion

                        https://github.com/ioBroker/ioBroker.ja … atedelayed
                        5652_ausgabe.jpg
                        5652_html_widget.jpg
                        5652_log.jpg
                        5652_objekte.jpg
                        5652_script.jpg

                        1 Reply Last reply Reply Quote 0
                        • L
                          looxer01 last edited by

                          Hi,

                          vielen Dank für den Fix. clearStateDelayed hilft mir richtig weiter.

                          Allerdings habe ich jetzt noch ein Problem mit dem verzoegerten Einschalten, wenn anschliessend eine Ausschaltplanung folgt.

                          Dann wird nämlich gar nicht erst eingeschaltet. Ich denke, dass das ein Fehler ist

                          Beispiel:

                          setStateDelayed(IDGruppe13,true, 10000); // Schalte ein

                          setStateDelayed(IDGruppe13,false,30000); // schalte nach 30 Sekunden aus

                          • In diesem Fall wird die Lampe gar nicht erst eingeschaltet.

                          • Falls die Lampe eingeschaltet war, dann wird wie erwartet ausgeschaltet.

                          • Eine Einschaltverzoegerung ohne Ausschaltplanung funktioniert wie erwartet.

                          Es scheint also so, dass mit der Ausschaltplanung die Einschaltplanung geloescht wird.

                          vG Looxer

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

                            @looxer01:

                            Hi,

                            vielen Dank für den Fix. clearStateDelayed hilft mir richtig weiter.

                            Allerdings habe ich jetzt noch ein Problem mit dem verzoegerten Einschalten, wenn anschliessend eine Ausschaltplanung folgt.

                            Dann wird nämlich gar nicht erst eingeschaltet. Ich denke, dass das ein Fehler ist

                            Beispiel:

                            setStateDelayed(IDGruppe13,true, 10000); // Schalte ein

                            setStateDelayed(IDGruppe13,false,30000); // schalte nach 30 Sekunden aus

                            • In diesem Fall wird die Lampe gar nicht erst eingeschaltet.

                            • Falls die Lampe eingeschaltet war, dann wird wie erwartet ausgeschaltet.

                            • Eine Einschaltverzoegerung ohne Ausschaltplanung funktioniert wie erwartet.

                            Es scheint also so, dass mit der Ausschaltplanung die Einschaltplanung geloescht wird.

                            vG Looxer > You can clear all running delay for this ID (by default). `

                            
                             setStateDelayed(IDGruppe13,true,  10000);          // Schalte  ein
                             setStateDelayed(IDGruppe13,false, 30000, false);   // schalte nach 30 Sekunden aus
                            
                            
                            1 Reply Last reply Reply Quote 0
                            • L
                              looxer01 last edited by

                              na, super, das hatte ich gewusst aber irgendwie ausversehen das false geloescht und dann uebersehen.

                              Du hast natürlich recht. Danke dir.

                              vG Looxer

                              1 Reply Last reply Reply Quote 0
                              • F
                                Fitti last edited by

                                @paul53:

                                clearTimeout muss auf eine Timer-Variable angewendet werden:

                                setState(IDGruppe12,true);    // Schalte ein
                                var timer = setTimeout(function (){                                                                             
                                     setState(IDGruppe12,false);   }, 30000);                                                   
                                clearTimeout (timer);   / loesche den timeout
                                
                                ```` `  
                                

                                Ich bekomme den clearTimeout nicht hin. Kann es sein, dass es auf zwei unterschiedliche "on" nicht funktioniert?

                                Bei mir läuft trotz eines clears braf weiter. Das sehe ich daran, dass ich einen Zähler um 2 verringere. Ändere ich mein ZählerObject, läuft es doppelt so schnell - manchmal sieht es aus, als ob er dann um 4 reduziert. Ist aber immer nur um 2 , nur zweimal kurz hintereinander

                                Das mache ich:

                                deleteState("javascript.0.EcklichtTimer");  //Aufräumen beim Start: überschreibt dummerweise immer mit null und ist dann keine Zahl mehr.
                                createState("javascript.0.EcklichtTimer", 0, {
                                    type: 'number',
                                    name: 'Ecklicht Timer Rückzähler'
                                });
                                
                                var el1_timer=0;  //extra global definiert
                                
                                // Wenn Bewegung, dann schalte Ecklicht ein, aber nur wenn Ecklicht an war und setzte Timer
                                on({id:"hm-rpc.0.LEQ0112345.1.MOTION"/*Bewegungsmelder Küche NEU:1.MOTION*/,
                                    change: 'ge'
                                }, function () {
                                    clearTimeout(el1_timer);  //Beende späteren Timer, damit die nicht doppelt laufen.
                                    log("Bewegung");
                                    // aber nur wenn Ecklicht auch an war/angehen soll
                                    if (getState("hm-rega.0.3416"/*kueche_Ecklicht_war_an*/).val)  { 
                                        log("Ecklicht war an => Licht wird aktualisiert");
                                        meindingsbums.zone(4).on();  //hier schalte ich was ein -geht
                                        setTimeout(function () {setState("javascript.0.EcklichtTimer",199);},200);   //setze Timer auf 199, 200ms verzögert
                                    }
                                });
                                
                                // Wenn der EcklichTimer gesetzt wurde, dann starte mit dem Runterzählen
                                var mySubscription = on({id:"javascript.0.EcklichtTimer"/*EcklichtTimer*/,
                                    change: 'any'
                                }, function () {
                                    log("Trigger:EcklichtTimer triggerte: " + getState("javascript.0.EcklichtTimer").val);
                                    if (getState("javascript.0.EcklichtTimer").val > 2){
                                        log("Subtrahiere 2: " + getState("javascript.0.EcklichtTimer").val + "-> " + (getState("javascript.0.EcklichtTimer").val-2));
                                        el1_timer = setTimeout(function () {setState("javascript.0.EcklichtTimer", (getState("javascript.0.EcklichtTimer").val-2));}, 2000);
                                    } else {
                                        // Der Timer ist abgelaufen. Schalte Licht aus...
                                        meindingsbums.zone(4).off();  //und aus damit
                                        log("AUs!")
                                    }
                                });
                                

                                Danke wieder im Voraus!

                                Fitti.

                                PS: die var mySubscription = on … habe ich nur noch drinnen, da ich vorher vor hatte die subscription zu beenden. Ist mittlerweile obsolet.

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

                                  Timer sind Objekte:

                                  var el1_timer=null;
                                  

                                  Timer sollten vor Wiederverwendung gelöscht werden:

                                  ...
                                      log("Bewegung");
                                      // aber nur wenn Ecklicht auch an war/angehen soll
                                      if (getState("hm-rega.0.3416"/*kueche_Ecklicht_war_an*/).val)  {
                                          log("Ecklicht war an => Licht wird aktualisiert");
                                          meindingsbums.zone(4).on();  //hier schalte ich was ein -geht
                                          if(el1_timer) clearTimeout(el1_timer);  //Beende späteren Timer, damit die nicht doppelt laufen.
                                          el1_timer = setTimeout(function () {setState("javascript.0.EcklichtTimer",199);},200);   //setze Timer auf 199, 200ms verzögert
                                      }
                                  });
                                  
                                  // Wenn der EcklichTimer gesetzt wurde, dann starte mit dem Runterzählen
                                  var mySubscription = on({id:"javascript.0.EcklichtTimer"/*EcklichtTimer*/,
                                      change: 'any'
                                  }, function (dp) {
                                      log("Trigger:EcklichtTimer triggerte: " + dp.state.val);
                                      if (dp.state.val > 2){
                                          log("Subtrahiere 2: " + dp.state.val + "-> " + dp.state.val-2));
                                          if(el1_timer) clearTimeout(el1_timer);
                                          el1_timer = setTimeout(function () {setState("javascript.0.EcklichtTimer", dp.state.val-2));}, 2000);
                                      } else {
                                          // Der Timer ist abgelaufen. Schalte Licht aus...
                                          meindingsbums.zone(4).off();  //und aus damit
                                          log("AUs!")
                                      }
                                  });    
                                  
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  821
                                  Online

                                  31.9k
                                  Users

                                  80.3k
                                  Topics

                                  1.3m
                                  Posts

                                  6
                                  15
                                  3463
                                  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