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

      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

                        663
                        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