Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. async-await sleep stoppen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    async-await sleep stoppen

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

      Moin,
      habe schon gesucht hier aber irgendwie nix gefunden.
      Ich verwende im Script mit einem Bewegungsmelder einen async-await sleep Timer.
      Das Licht soll sich einschalten beim betreten des Raums und nach 10 Minuten wieder ausgehen.

      Beispiel:

      on({id: RFCode, val: "123456"},  async function() {
          setState(Light, true);
           await Sleep(600000);
          setState(Light, false);
      });
      

      Wenn ich aber schon vorher den Bewegungsmelder durch das rausgehen wieder auslöse, soll das Licht natürlich dann schon nach zB. einer Wartezeit von 30 Sekunden wieder ausgehen.
      Und der 10Minuten Timer soll gelöscht werden.

      Falls ich dann innerhalb der Wartezeit von 30 Sekunden den Raum wieder betrete, soll der Wartezeit-Timer wieder gelöscht werden, sodass das Licht gar nicht erst ausgeht.
      Und der 10 Minuten-Timer soll erneut wieder starten.

      Hat jemand so etwas eventuell mal umgesetzt und kann mir zeigen, wie man das machen würde?
      Ganz generell bin ich in Javascript nur rudimentär fit und würde mir das ein- und ausschalten sicher irgendwie umständlich hinprokeln. Aber wie ich die await sleep-Timer stoppe weiß ich bis heute nicht.
      Wäre klasse, wenn mir jemand auf die Sprünge helfen kann.

      Grüße aus Hamburg

      Asgothian 1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @Smartin last edited by Asgothian

        @smartin sagte in async-await sleep stoppen:

        Moin,
        habe schon gesucht hier aber irgendwie nix gefunden.
        Ich verwende im Script mit einem Bewegungsmelder einen async-await sleep Timer.
        Das Licht soll sich einschalten beim betreten des Raums und nach 10 Minuten wieder ausgehen.

        Beispiel:

        on({id: RFCode, val: "123456"},  async function() {
            setState(Light, true);
             await Sleep(600000);
            setState(Light, false);
        });
        

        Wenn ich aber schon vorher den Bewegungsmelder durch das rausgehen wieder auslöse, soll das Licht natürlich dann schon nach zB. einer Wartezeit von 30 Sekunden wieder ausgehen.
        Und der 10Minuten Timer soll gelöscht werden.

        Falls ich dann innerhalb der Wartezeit von 30 Sekunden den Raum wieder betrete, soll der Wartezeit-Timer wieder gelöscht werden, sodass das Licht gar nicht erst ausgeht.
        Und der 10 Minuten-Timer soll erneut wieder starten.

        Hat jemand so etwas eventuell mal umgesetzt und kann mir zeigen, wie man das machen würde?
        Ganz generell bin ich in Javascript nur rudimentär fit und würde mir das ein- und ausschalten sicher irgendwie umständlich hinprokeln. Aber wie ich die await sleep-Timer stoppe weiß ich bis heute nicht.
        Wäre klasse, wenn mir jemand auf die Sprünge helfen kann.

        Grüße aus Hamburg

        solange du via

            setState(Light, true);
             await Sleep(600000);
            setState(Light, false);
        

        arbeitest wird es nicht gehen. Was du nutzen musst ist:

            setState(Light, true);
            lightTimeout= setTimeout(function() {  setState(Light, false); }, 60000)
        

        nutzen. Dann kannst du durch

        clearTimeout(lightTimeout)
        

        den Timeout zum ausschalten löschen.

        S 1 Reply Last reply Reply Quote 1
        • S
          Smartin @Asgothian last edited by

          @asgothian
          Das hilft mir auf jeden Fall schon mal weiter, danke!
          Kann ich mit einer if Abfrage oder so irgendwie herausfinden, ob ein Timeout gerade aktiv ist?
          Ich weiß sonst nicht, wie ich herausfinde, ob die Wartezeit von 30 Sekunden gerade läuft.

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

            @smartin sagte: Kann ich mit einer if Abfrage oder so irgendwie herausfinden, ob ein Timeout gerade aktiv ist?

            Ja, wenn die Timer-Variable zum Ablauf der Zeit und beim Stoppen auf null gesetzt wird.

            if(lightTimeout) {
                clearTimeout(lightTimeout);
                lightTimeout = null;
            }
            
                setState(Light, true);
                lightTimeout = setTimeout(function() {  
                    setState(Light, false);
                    lightTimeout = null;
                }, 60000)
            
            S 1 Reply Last reply Reply Quote 1
            • S
              Smartin @paul53 last edited by

              Super, vielen Dank für Eure Tipps, !
              Habe es jetzt so umgesetzt

              var Timeout1 = null;
              var Timeout2 = null;
              
              on({id: RFCode, val: "12345"}, function() {
              if (getState(Light).val === false) {
              	setState(Light, true);
              	TimerLang();
              	      
              } else if(Timeout1) {
                  clearTimeout(Timeout1);
                  Timeout1 = null;
              	TimerKurz();
              
              } else if(Timeout2) {
                  clearTimeout(Timeout2);
                  Timeout2 = null;
              	TimerLang();
              }});
              
              function TimerLang() {
              	Timeout1= setTimeout(function() {
              		setState(Light, false);
              		Timeout1 = null;
              	 }, 600000)};
              	 
              function TimerKurz() {
              	Timeout2= setTimeout(function() {
              		setState(Light, false);
              		Timeout2 = null;
              		}, 30000)};
              

              Falls man das noch eleganter machen kann, immer her mit den Tipps.
              Ich bin wie gesagt nicht so der JS Held, aber zumindest funktioniert es 😊

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

              Support us

              ioBroker
              Community Adapters
              Donate

              999
              Online

              31.7k
              Users

              79.6k
              Topics

              1.3m
              Posts

              3
              5
              310
              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