Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Scheduling / Timing in Java Script

    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

    Scheduling / Timing in Java Script

    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      opöl last edited by opöl

      Hallo zusammen,

      ich habe mal eine Frage im Zusammenhang mit dem Scheduling / Timing in Java Script.
      Vielleicht kann mir jemand einmal einen Schubs geben.

      Ich habe eine Funktion "abfrageTasmota", die alle 6 Sekunden ausgeführt wird und nach einer Minute (also nach 10 Aufrufen) ein Ergebnis liefert. So wie unten dargestellt klappt das auch problemlos per Scheduler.

      schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
      

      Ich würde allerdings gerne das Ergebnis immer zur (bzw. kurz vor) jeder vollen Minute erhalten, unabhängig davon, wann das Script mal gestartet wurde. Daher würde ich das gerne mit dem Scheduler einmal in der Minute starten und dann alle 6 Sekunden erneut ausführen. Leider klappt das nicht so, wie ich mir das vorgestellt habe:

      schedule('59 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
      setTimeout(abfrageTasmota, 6000)
      

      Welchen Denkfehler mache ich und wie kann ich das Problem lösen?

      Vielen Dank und Gruß

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @opöl last edited by

        @opöl sagte: Ergebnis immer zur (bzw. kurz vor) jeder vollen Minute erhalten

        function abfrageTasmota() {
            // Abfrage
            if(new Date().getSeconds() == 59) {
                // Auswertung
            }
        }
        
        schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
        
        O 1 Reply Last reply Reply Quote 0
        • O
          opöl @paul53 last edited by

          @paul53 ,

          Danke, das wäre ein denkbarer Ansatz, dazu müsste ich aber das Script umbauen. Sonst passen die Berechnungen nicht mehr zur Ausgabe. Die stehen erst nach den 10 Durchläufen zur Verfügung. Wenn ich Deinen Ansatz richtig verstehe, dann verhält sich die Ausgabe dazu asynchron. Ich würde lieber bei einem Aufruf per Scheduler und einem Delay mit sleep oder Timeout arbeiten.
          Vielleicht hat jemand dazu eine Idee?

          Gruß

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @opöl last edited by paul53

            @opöl sagte: verhält sich die Ausgabe dazu asynchron.

            Nein, die Auswertung der 10 zuvor abgefragten Werte erfolgt in der 59. Sekunde synchron.
            Asynchron wäre die Auswertung zur 59. Sekunde mit einem Abfrage-Intervall von 6 s.

            O 1 Reply Last reply Reply Quote 0
            • O
              opöl @paul53 last edited by

              @paul53 ,

              mein Script sammelt bei jeder Runde Werte ein, bildet daraus durch Addition und Division durch 10 die Mittelwerte und führt noch weitere Berechnungen aus und zählt einen Zähler von 1 bis 10 hoch. Damit das stimmt, müssen alle 10 Durchläufe zur 59. Sekunde abgeschlossen sein.
              Bei dem gegebenen Zeitplan (59,05....) ist aber nicht sichergestellt, dass zur 59 Sekunde alle Durchläufe erfolgt sind. Was ist, wenn das Script z.B. zur 30. Sekunde gestartet wird?

              Gruß

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @opöl last edited by paul53

                @opöl sagte: Was ist, wenn das Script z.B. zur 30. Sekunde gestartet wird?

                Dann werden beim ersten Durchlauf nur 5 Werte eingesammelt, danach aber jede Minute 10 Werte. Das kann man prüfen.

                var cnt = 0;
                var sum = 0;
                function abfrageTasmota() {
                    // Abfrage
                    sum += wert;
                    cnt++;
                    if(new Date().getSeconds() == 59) {
                        if(cnt == 10) {
                            // Auswertung
                        }
                        cnt = 0;
                        sum = 0;
                    }
                }
                
                schedule('59,05,11,17,23,29,35,41,47,53 * * * * *', abfrageTasmota); // Alle 6 Sekunden ausführen
                
                O 1 Reply Last reply Reply Quote 0
                • O
                  opöl @paul53 last edited by

                  @paul53 ,

                  hat geklappt. Danke.
                  Ich musste noch ein paar Variablen umbauen und mit Denkfehlern kämpfen, aber jetzt funktioniert alles so wie es soll.

                  Gruß

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  879
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  2
                  7
                  236
                  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