Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Timer abbrechen

    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

    Timer abbrechen

    This topic has been deleted. Only users with topic management privileges can see it.
    • UncleSam
      UncleSam Developer @MaikB85 last edited by

      @MaikB85 Das Problem ist, dass du die beiden var innerhalb des on() Handlers hast. Dadurch gelten sie nur während dem abarbeiten eines einzigen Events.

      Also einfach die Deklarationen ganz aussen machen und schon ist die Welt in Ordnung.

      M 1 Reply Last reply Reply Quote 0
      • M
        MaikB85 @UncleSam last edited by

        @UncleSam Oh man tatsächlich...Danke jetzt klappt es!

        @guergen Deine Lösung würde auch funktionieren. Ich arbeite aber lieber mit JavaScript statt mit Blocky. Danke!

        Eine Frage evtl. noch. in dem von Blocky erzeugtem Script wird "async function" verwendet. Macht das einen Unterschied in dem Fall?

        G paul53 2 Replies Last reply Reply Quote 0
        • G
          guergen @MaikB85 last edited by guergen

          @MaikB85 Das kann ich Dir garnicht sagen, habegrade mal drin rumgeclickt um zu sehen wo das herkommt.... weiss ich nicht
          Ist das denn kein Java-Script, was ich dabei gepackt habe?
          Zumindest dachte ich das immer....

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

            @MaikB85 sagte:

            wird "async function" verwendet. Macht das einen Unterschied in dem Fall?

            Nein.

            1 Reply Last reply Reply Quote 0
            • K
              klassisch Most Active last edited by

              die Suche nach async und clearTimer Timer stoppen führt mich hierher.

              Ich verwende gerade Funktionen, die ich nicht verstehe und nicht weiß, ob da alle Timer gecleared werden, bzw. wie man das erzwingen könnte.

              Im Prinzip geht es um Dimmerrampen.

              • Einschalten
              • Halten
              • Runterrampen

              Funktioniert so weit. Aber das Thema retriggern und timer clearen ist mit unklar.
              Dort https://www.mediaevent.de/javascript/async-await.html

              habe ich gefunden

              const delay = seconds => {
              	return new Promise (
              		resolve => setTimeout (resolve, seconds * 1000)
              	)
              };
              

              Damit kann man dann einfach und elegant kleine Pausen einbauen, um den Fluß und die Ausgaben besser zu kontrollieren, ohne die Übersicht zu verlieren. Beispiel

              on({id: motionSensorId, change: "ne"}, async function(dp){
                  // dim up  
                  // colorTep down (numberwise)
                  if (dp.state.val){
                      //
                      lampOnTimeDepending();
                      console.log('starting hold time');
                      await delay(10); // hold time
                      console.log('end hold time, starting ramp down');
                      setState(lampTransition_time, transitionTimeRampDown);
                      await delay(0.1);
                      setState(lampBrightness,1);
                      await delay(transitionTimeRampDown + 1)
                      setState(lampTransition_time, transitionTimeNormal);
                      await delay(0.1);
                      setState(lampOnOff,false);
                  }
              });
              
              

              Das scheint auch so weit zu funktionieren.
              Aber ich frage mich, was passiert, wenn diese Funktion während des Ablaufs erneut getriggert wird?
              Deshalb wollte ich gerne zu Beginn der Funktion alle laufenden Timer abbrechen. Wie könnte man dabei vorgehen?

              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @klassisch last edited by ticaki

                @klassisch
                Mehrfach Aufrufe kannst du nur durch Kontrollvariable und eine If Abfragen for jedem await abfangen.

                z.B. Nur den neusten Aufruf abarbeiten:

                var t = 0;
                
                function test (){
                  var t1 = ++t;
                  if (t1 == t) { // diesen Block für jedes await
                    // führe Code aus
                  }
                  // Am Ende
                  if (t1 == t) t = 0;
                }
                

                oder in dem du die Funktion sperrst solange sie läuft, also eine globale Variable am Anfang abfragen dann setzten und am Ende zurück setzten.

                Kann man diesen Code nicht über lampe.action() kürzer machen und weniger fehler anfällig?

                K 1 Reply Last reply Reply Quote 1
                • K
                  klassisch Most Active @ticaki last edited by

                  @ticaki sagte in Timer abbrechen:

                  Vielen Dank für Deine Hilfe.
                  Hatte in der Zwischenzeit einige Stellen gefunden, und gesehen, daß das zu nichts vernünftigem führt.
                  Und es ist ja noch schlimmer, bei einer Lampensteuerung mit manueller Eingriffsmöglichkeit muß man laufende Timer auch wieder löschen können.

                  Mittlerweile habe ich deshalb eine "Hybridlösung" implementiert. Kurze Wartezeiten in Subsekundenbereich zur Sicherstellung der Befehlsfolge (zuerst DImmgeschwindigkeit, dann Zielwert) habe ich mit await gemacht.
                  Die längeren Timer mit der klassischen Methode ineinandergeschachtelter setTimeout Funktionen. Die kann ich dann bei manuellen overrides per clearTimeout auch löschen.
                  Im Subsekundenbereich bringen die awaits auch nchts durcheinander.

                  Kann man diesen Code nicht über lampe.action() kürzer machen und weniger Fehleranfällig?

                  Ich kenne mich leider mit Eigenschaften und Objekten nicht wirklich aus.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @klassisch last edited by

                    @klassisch
                    Ich nutze deconz und da geht z.b. sowas:

                    setState('deconz.0.lights.0017880003a0037c.action', '"on": true, "bri": ' + bri + ', "ct": ' + ct);
                    
                    K 1 Reply Last reply Reply Quote 0
                    • K
                      klassisch Most Active @ticaki last edited by

                      @ticaki Ich vermute mal, daß das nur eine eine andere Art der Darstellung bzw Adressierung ist.
                      Deconz scheint hier ein Array oder key-values-paare zu nutzen.
                      im ioBroker.zigbee Adapter gibt es halt für jeden Parameter wie bright, Farbtemp, state, etc jeweils einen eigenen Datenpunkt.

                      Die Frage ist jetzt, wie die Daten an die Leuchten übertragen werden.
                      Beim normalen javascript kann man anscheinend nicht so genau vorhersagen, ob die setState in der aufgeschriebenen Reihenfolge abgearbeitet werden. Und damit können sich die Leuchten man so oder auch anders verhalten.

                      Werden beim Deconz die Daten gleichzeitig als Block an die Leuchte übertragen? Das wäre ein Vorteil und könnte die kurzen await überflüssig machen.
                      Die timer für die längeren hold times und Rampen muß man nach wie vor selbst handhaben.

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer @klassisch last edited by

                        @klassisch
                        soweit ich weiß werden die Befehle mit action() als Block an das Gerät gesendet.

                        K 1 Reply Last reply Reply Quote 0
                        • K
                          klassisch Most Active @ticaki last edited by

                          @ticaki das wäre ein echter Vorteil. Das Zigbee Protokoll des Geräts muß das auch ermöglichen.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          852
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          6
                          16
                          863
                          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