Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Gartenbewässerung 5min ein; 10min Pause; 4 mal wiederholen.

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Gartenbewässerung 5min ein; 10min Pause; 4 mal wiederholen.

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

      Guten Abend zusammen,

      ich bin gerade dabei meine Bewässerung für den Rasen zu realisieren.

      Ich wollte mir ein bool setzen, welches ich auch anderen Programmen oder auch Tastern setzen kann.

      "MyStates.Gartenbewässerung"

      wenn dieser State auf "true" steht, sollte die Bewässerung für 5 min aktiv sein, dann 10 min Pause und das in einer Schleife von 3 mal.

      Mein erster Versuch sieht wie folgt aus, aber sobald mein State auf true steht, wird die Funktion nur ein mal ausgelöst, glaub ich zumindest.

      on({id: 'javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/', val: true}, function (obj) {
          function timer(start) {
          setTimeout(function () { //The timer
              log('Start der Bewässerung');
          }, start*3000); //needs the "start*" or else all the timers will run at 3000ms
      }
      
      for(var start = 0; start < 3; start++) {
          timer(start);
      }
      });
      

      Wenn ich nur

          function timer(start) {
          setTimeout(function () { //The timer
              log('Start der Bewässerung');
          }, start*3000); //needs the "start*" or else all the timers will run at 3000ms
      }
      
      for(var start = 0; start < 3; start++) {
          timer(start);
      }
      

      als Script laufen lassen, dann wird das 3 mal ausgeführt.

      Mit Blockly krieg ich garnichts hin. Das Wiederhole Dingen löst mit oder auch ohne Timeout direkt 3 mal aus. Ich meine gelesen zu haben, dass ein Timeout in einer schleife nicht berücksichtig wird.

      Hat wer eine Idee für mein Problem??

      Gruß und Vielen Dank.

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

        @ple:

        sollte die Bewässerung für 5 min aktiv sein, dann 10 min Pause und das in einer Schleife von 3 mal. `
        Für eine periodische Wiederholung gibt es setInterval(callback, interval). Etwa so:

        var interval = null;
        var count;
        
        on({id: 'javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/', val: true}, function () {
           count = 3;
           interval = setInterval(function() {
               setState('ID_der_Bewässerung', true);
               setTimeOut( function() {
                    setState('ID_der_Bewässerung', false);
                    count--;
                    if(count === 0) clearInterval(interval);      
                }, 5 * 3600000);
            }, 15 * 3600000);
        });   
        
        1 Reply Last reply Reply Quote 0
        • P
          ple last edited by

          Besten Dank erst mal.

          var interval = null;
          var count;
          
          on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () {
             log("Trigger ausgelöst");
             count = 5;
             interval = setInterval(function() {
                 setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true);
                 log("einschalten");
                 setTimeOut( function() {
                     log("ausschalten");
                      setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false);
                      count--;
                      if(count === 0) clearInterval(interval);      
                  }, 1 * 3600000);
              }, 1 * 3600000);
          });   
          

          bei dem Code komme nur bis log(ausgelöst)

          bis zum setState kommt er erst garnicht. Hast du vielleicht noch eine Idee??

          Gruß

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

            Hallo ple,

            ich folgende unkonventionelle Lösung. Sie läuft (habs getestet).

            ! ```
            `var aktor_array = ['true','false','false','true','false','false','true','false','false'];
            var aufloesung = 5; // 5Sekunden // wenn Minuten dann noch * 60 oder gleich 300 eintragen
            var idAktor = "AKTOR_ID.STATE"; // Das Ventil, das das Wassser rauslässt
            var idTrigger= "javascript.0.MyStates.Gartenbewässerung"/Gartenbewässerung aktiv/;
            ! // ab hier nix mehr ändern
            on({id:idTrigger, change: 'ne'}, function (obj) {
            ! var i=0;
            if (obj.state.val) { // wenn trigger true
            // repeat with the interval of 5 seconds
            interval = setInterval(function(){
            //setState(idAktor, aktor_array[i]; // Aktor ein/ausschalten
            log(aktor_array[i]);
            i++;
            }, aufloesung * 1000);
            ! // Stoppen
            setTimeout(function() {
            clearInterval(interval);
            }, aktor_array.length * aufloesung * 1000);

            } else { // wenn trigger false
                clearInterval(interval);
            }
            

            });`

            ! Du trägst einen Aktor ein, der das Wassser steuert (ist noch auskommentiert).
            ! Du brauchst einen Trigger (eine ID, einen Taster oder ein Boolean-Objekt, das du vorher mit createStates() angelegt hast).
            ! Die Basis ist ein Array. Deine Zeiten waren 5min an und 10min aus. Ich habe das aufgeteilt in 5min an, 5min aus, nochmal 5min aus. Daraus ergibt sich bei einer Auflösung von 5min eine Abfolge von ein und aus, die ich im Array mit true und false abgebildet habe.
            ! Zum Test läuft das ganze jetzt im Sekundenzeitraum statt Minutenzeitraum. Du kannst es leicht auf Minuten umstellen.
            ! Zum Stoppen braucht e clearInterval. Entweder, wenn der Triger auf false geht oder wenn das Array abgearbeitet ist (hier, wenn die vorher errechnete Dauer zur Abarbeitung des Arrays verstrichen ist (setTimeout und Array-Länge mal Auflösung).
            ! Probier es einfach mal aus. 😛
            ! Gruß
            ! Pix[/i][/i]

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

              @ple:

              bei dem Code komme nur bis log(ausgelöst) `
              Ach ja, setInterval verzögert sofort. Dann besser so:

              var interval = null;
              var count;
              
              function pulse() {
                 setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true);
                 log("einschalten");
                 setTimeOut( function() {
                      log("ausschalten");
                      setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false);
                      count--;
                      if(count === 0) clearInterval(interval);     
                  }, 1 * 3600000);
              }
              
              on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () {
                 log("Trigger ausgelöst");
                 count = 5;
                 pulse();
                 interval = setInterval(pulse, 2 * 3600000);
              });
              
              1 Reply Last reply Reply Quote 0
              • P
                ple last edited by

                @pix:

                Hallo ple,

                ich folgende unkonventionelle Lösung. Sie läuft (habs getestet).

                ! ```
                `var aktor_array = ['true','false','false','true','false','false','true','false','false'];
                var aufloesung = 5; // 5Sekunden // wenn Minuten dann noch * 60 oder gleich 300 eintragen
                var idAktor = "AKTOR_ID.STATE"; // Das Ventil, das das Wassser rauslässt
                var idTrigger= "javascript.0.MyStates.Gartenbewässerung"/Gartenbewässerung aktiv/;
                ! // ab hier nix mehr ändern
                on({id:idTrigger, change: 'ne'}, function (obj) {
                ! var i=0;
                if (obj.state.val) { // wenn trigger true
                // repeat with the interval of 5 seconds
                interval = setInterval(function(){
                //setState(idAktor, aktor_array[i]; // Aktor ein/ausschalten
                log(aktor_array[i]);
                i++;
                }, aufloesung * 1000);
                ! // Stoppen
                setTimeout(function() {
                clearInterval(interval);
                }, aktor_array.length * aufloesung * 1000);

                } else { // wenn trigger false
                    clearInterval(interval);
                }
                

                });`

                ! Du trägst einen Aktor ein, der das Wassser steuert (ist noch auskommentiert).
                ! Du brauchst einen Trigger (eine ID, einen Taster oder ein Boolean-Objekt, das du vorher mit createStates() angelegt hast).
                ! Die Basis ist ein Array. Deine Zeiten waren 5min an und 10min aus. Ich habe das aufgeteilt in 5min an, 5min aus, nochmal 5min aus. Daraus ergibt sich bei einer Auflösung von 5min eine Abfolge von ein und aus, die ich im Array mit true und false abgebildet habe.
                ! Zum Test läuft das ganze jetzt im Sekundenzeitraum statt Minutenzeitraum. Du kannst es leicht auf Minuten umstellen.
                ! Zum Stoppen braucht e clearInterval. Entweder, wenn der Triger auf false geht oder wenn das Array abgearbeitet ist (hier, wenn die vorher errechnete Dauer zur Abarbeitung des Arrays verstrichen ist (setTimeout und Array-Länge mal Auflösung).
                ! Probier es einfach mal aus. 😛
                ! Gruß
                ! Pix
                ! Da wäre ich im Leben nicht draufgekommen, mein Gott.
                ! Wie lange muss ich mich mit Java beschäftigen um das zu verstehen, geschweige den Syntax auswendig zu können.
                ! Ich werde es morgen mal testen, nachdem ich den Robi für Mähen installiert habe.
                ! Werde berichten.
                ! Gruß[/i][/i]
                ``` `

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

                  @pix:

                  ich folgende unkonventionelle Lösung. Sie läuft (habs getestet). `
                  Mit der Lösung kann nur ein Tastverhältnis Ein:Aus von 1:1 erzeugt werden.

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

                    Hallo,

                    eigentlich war das nicht so schwer. Es dauert länger, eine verständliche Erklärung zu formulieren.

                    Du kannst das Array natürlich auch ändern.

                    true true false false true false true false

                    = 10min an, 10min aus, 5min an, 5min aus, 5min an, 5min aus

                    oder du ändert die auflösung auf zehn Minuten:

                    true true true false true true false true false

                    = 30min an, 10min aus, 20min an, 10min aus, 10min an, 10min aus

                    Und unter das clearInterval() kannste du noch ein setState(idAktor, false) setzen, damit das Ventil auch wirklich zugeht, wenn Schluss ist oder vorher abgebrochen wird.

                    Und falls du die Auflösung sehr klein wählst und true oder false sich häufig wiederholen, kannst du vor dem setState noch abfragen, ob der alte Zustand anders als der neue Zustand ist. Also nur einschalten, wenn aus und ausschalten, wenn gerade aus. Das spart Funk.

                    Gute Nacht

                    Pix

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

                      @paul53:

                      @ple:

                      bei dem Code komme nur bis log(ausgelöst) `
                      Ach ja, setInterval verzögert sofort. Dann besser so:

                      var interval = null;
                      var count;
                      
                      function pulse() {
                         setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true);
                         log("einschalten");
                         setTimeOut( function() {
                              log("ausschalten");
                              setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false);
                              count--;
                              if(count === 0) clearInterval(interval);     
                          }, 1 * 3600000);
                      }
                       
                      on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () {
                         log("Trigger ausgelöst");
                         count = 5;
                         pulse();
                         interval = setInterval(pulse, 2 * 3600000);
                      });
                      ```` `  
                      

                      Geht fast 🙂

                      javascript.0	2017-06-21 22:41:16.714	error	Error in callback: ReferenceError: setTimeOut is not defined
                      javascript.0	2017-06-21 22:41:16.713	info	script.js.Programme.Gartenbewässerung3: einschalten
                      javascript.0	2017-06-21 22:41:16.711	info	script.js.Programme.Gartenbewässerung3: Trigger ausgelöst
                      javascript.0	2017-06-21 22:41:03.830	info	script.js.Programme.Gartenbewässerung3: registered 1 subscription and 0 schedules
                      

                      Ich muss mir auch mal bald Gedanken machen über einen Killoff oder so. Nicht das ich mal 15 qm Wasser auf dem Rasen verteile. 🙂 im Moment ist das noch in der ccu mit 20 min.

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

                        Hallo Paul,
                        @paul53:

                        @pix:

                        ich folgende unkonventionelle Lösung. Sie läuft (habs getestet). Mit der Lösung kann nur ein Tastverhältnis Ein:Aus von 1:1 erzeugt werden.
                        ich weiß nicht genau, was du meinst. Natürlich werden (bei Auflösung 5s) eben nur alle 5s Befehle (ein oder aus) gesendet.

                        Sieht bei mir im Log so aus. Achte auf die Zeiten:

                        22:40:42.830	[info]	javascript.2 Start javascript script.js.Test.Test_Intervall
                        22:40:42.830	[info]	javascript.2 script.js.Test.Test_Intervall: registered 1 subscription and 0 schedules
                        22:40:55.427	[info]	javascript.2 script.js.Test.Test_Intervall: true
                        22:41:00.429	[info]	javascript.2 script.js.Test.Test_Intervall: false
                        22:41:05.430	[info]	javascript.2 script.js.Test.Test_Intervall: false
                        22:41:10.437	[info]	javascript.2 script.js.Test.Test_Intervall: true
                        22:41:15.440	[info]	javascript.2 script.js.Test.Test_Intervall: false
                        22:41:20.444	[info]	javascript.2 script.js.Test.Test_Intervall: false
                        22:41:25.446	[info]	javascript.2 script.js.Test.Test_Intervall: true
                        22:41:30.449	[info]	javascript.2 script.js.Test.Test_Intervall: false
                        

                        Pix

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

                          @ple:

                          javascript.0 2017-06-21 22:41:16.714 error Error in callback: ReferenceError: setTimeOut is not defined `
                          Sorry: Schreibfehler. Richtig:

                             setTimeout( function() {
                          
                          1 Reply Last reply Reply Quote 0
                          • P
                            ple last edited by

                            Ok, jetzt gehts ohne Fehlermeldung, aber leider bleibt er durchgehend eingeschaltet.

                            Er läuft nicht durch das ausschalten.

                            Morgen mal weiterrücken:-(

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            449
                            Online

                            31.7k
                            Users

                            79.8k
                            Topics

                            1.3m
                            Posts

                            3
                            12
                            1770
                            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