Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Funktion bei Trigger und zeitgesteuert ausführen

    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

    Funktion bei Trigger und zeitgesteuert ausführen

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

      Moin zusammen,

      ich stehe vor folgendem Problem, auf das ich leider nichts mit der Suche gefunden habe (evtl. auch das falsche gesucht):

      Ich habe immer wieder Berechnungen oder dergleichen, die getriggert ausgeführt werden sollen. Manche Trigger kommen aber sehr unregelmäßig, sodass ich entweder bei Trigger oder nach Zeitplan die gleiche Funktion ausführen möchte (quasi: bei Trigger oder spätestens nach x Minuten).
      Ich versuche mir dazu eine Funktion zu schreiben, die Trigger-id, Intervall und auszuführende Funktion (inkl. der Argumente) als Argument haben soll. Leider ohne Erfolg.
      Vielleicht kann mir hier jemand weiterhelfen? Vielleicht gibt es auch eine viel einfacherer Lösung?

      function FunctionSubscrAndPeriodic (funcName, minutesVar, id2Subscribe, changeVar = 'any') {
          on ({id: id2Subscribe, change: changeVar}, funcName);
          schedule(`*/${minutesVar} * * * *`, function() { funcName });
      }
      
      function Addition (a, b) {
          setState('0_userdata.0.example_state', a + b);
      }
      
      FunctionSubscrAndPeriodic(Addition(1,2), 1, '0_userdata.0.kPreCtrl');```
      
      Wäre über eine Hilfestellung sehr dankbar!
      
      Grüße
      arteck paul53 haus-automatisierung 3 Replies Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @mortalskillz last edited by

        @mortalskillz cronjob ??? warum schwer wenns einfach geht ?

        M 1 Reply Last reply Reply Quote 0
        • M
          mortalskillz @arteck last edited by

          Wäre dann aber nur zeigesteuert (ohne subscribe), oder?

          Hättest Du vielleicht ein kleines Beispiel, was auch Noobs wie ich verstehen?

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

            @mortalskillz sagte: bei Trigger oder spätestens nach x Minuten

            Innerhalb der Trigger-Callback-Funktion ein Intervall stoppen und starten. Dann erfolgt der zyklische Funktionsaufruf nur, wenn Trigger ausbleiben. Beispiel:

            const idSrc1 = '...';
            const idSrc2 = '...';
            const idDst  = '0_userdata.0.example_state';
            
            function Addition(a) {
                setState(idDst, a + getState(idSrc2).val, true);
            }
            
            var timer = null;
            
            on({id: idSrc1}, function(dp) {
                Addition(dp.state.val);
                clearInterval(timer);
                timer = setInterval(function() {
                    Addition(dp.state.val);
                }, 60000);
            });
            
            M 1 Reply Last reply Reply Quote 1
            • M
              mortalskillz @paul53 last edited by

              @paul53
              Genau. Die Lösung wäre natürlich perfekt. Werde ich definitiv testen (bin zur Zeit im Urlaub).
              Meine hätte ja bei jedem Trigger und einmal pro Minute ausgeführt, d.h. wenn ein Trigger kommt, wären zwei Ausführungen pro Minute passiert (eine durch den Trigger, die andere durch den schedule).

              Da ich das aber ganz oft brauche mit unterschiedlichsten Callback Funktionen, wollte ich eine Funktion schreiben, der ich Trigger-ID, Intervall und Callback-Funktion (inkl. Argumenten) übergebe. Und daran scheitere ich leider.

              Irgendwie bekomme ich es nicht hin, einer Funktion eine andere Funktion als Argument zu übergeben...
              Aber ich werde das mal mit Deiner Version prüfen!

              Danke schon einmal bisher!

              1 Reply Last reply Reply Quote 0
              • haus-automatisierung
                haus-automatisierung Developer Most Active @mortalskillz last edited by haus-automatisierung

                @mortalskillz sagte in Funktion bei Trigger und zeitgesteuert ausführen:

                Ich versuche mir dazu eine Funktion zu schreiben, die Trigger-id, Intervall und auszuführende Funktion (inkl. der Argumente) als Argument haben soll.

                FunctionSubscrAndPeriodic(Addition(1,2), 1, '0_userdata.0.kPreCtrl');
                

                Du führst so aber die Funktion Addion direkt aus und übergibst das Ergebnis als 1. Parameter an FunctionSubscrAndPeriodic. Somit steht in funcName wahrscheinlich undefined (gibt ja nix zurück).

                Du müsstest schon die Funktion selbst als Parameter übergeben:

                FunctionSubscrAndPeriodic(Addition, 1, '0_userdata.0.kPreCtrl');
                

                Und dann innerhalb FunctionSubscrAndPeriodic aufrufen mit funcName(1, 2). Wenn Du die Parameter auch mit übergeben willst (verstehe das Beispiel mit den statischen Werten nicht), dann könnte man die Funktion noch einmal in eine anonyme Funktion wrappen.

                EDIT: so

                function FunctionSubscrAndPeriodic(func, minutesVar, id2Subscribe, changeVar = 'any') {
                    on ({id: id2Subscribe, change: changeVar}, func);
                    schedule(`*/${minutesVar} * * * *`, func);
                }
                
                function Addition(a, b) {
                    setState('0_userdata.0.example_state', a + b);
                }
                
                FunctionSubscrAndPeriodic(function() { Addition(1, 2); }, 1, '0_userdata.0.kPreCtrl');
                
                haus-automatisierung 1 Reply Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @haus-automatisierung last edited by haus-automatisierung

                  Ich würde aber die Reihenfolge der Parameter ändern und die Callback-Funktion nach hinten packen. So ist es ja bei on und schedule z.B. auch. Dann kann man das schöner formatieren. z.B.

                  function FunctionSubscrAndPeriodic(id2Subscribe, minutesVar, callback, changeVar = 'any') {
                      on ({ id: id2Subscribe, change: changeVar }, callback);
                      schedule(`*/${minutesVar} * * * *`, callback);
                  }
                  
                  function Addition(a, b) {
                      setState('0_userdata.0.example_state', a + b);
                  }
                  
                  FunctionSubscrAndPeriodic('0_userdata.0.kPreCtrl', 1, () => {
                      Addition(1, 2);
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  993
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  4
                  7
                  301
                  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