Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. X-Minuten nach/vor Sunset Funktion auslösen

    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

    X-Minuten nach/vor Sunset Funktion auslösen

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

      Hi!

      ich habe mein Rolladenscript als Javascript mit Unterstützung hier im Forum realisiert. Ich selbst kann leider kein JS Programmieren und bin da auf Hilfe angewiesen. Das script sieht momentan wie folgt aus:

      // Datenpunkt-IDs
      const idAuto = '0_userdata.0.Rollladenautomatik';  // Dummyschalter für Rolladenautomatik
      const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen';  // Dummyschalter für Ausschlaf-Modus
      const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch';  // Szene Rolladen rauf bei Ausschlafen
      const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch';  // Szene Rolladen rauf normalbetrieb
      const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter bei Ausschlafen
      const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter Normalbetrieb
       
      // Variablen werden bei Skriptstart initialisiert
      var auto = getState(idAuto).val;
      var ausschlafen = getState(idAusschlafen).val;
      var tag = isAstroDay();
      var morgens = compareTime('6:30', '8:00', 'between');
      var abends = compareTime('17:00', '21:50', 'between');
       
      function Rollosrauf() {
         if(auto) {
            if(ausschlafen) setState(idAusschlafenRauf, true);
            else setState(idNormalRauf, true);
         }
      }
       
      function Rollosrunter() {
         if(auto) {
            if(ausschlafen) setState(idAusschlafenZu, true);
            else setState(idNormalZu, true);
         }
      }
       
      schedule('30 6 * * *', function() {
         morgens = true;
         if(tag) Rollosrauf();
      });
       
      schedule('0 8 * * *', function() {
         morgens = false;
         if(!tag) Rollosrauf();
      });
       
      schedule('0 17 * * *', function() {
         abends = true;
         if(!tag) Rollosrunter();
      });
       
      schedule('50 21 * * *', function() {
         abends = false;
         if(tag) Rollosrunter();
      });
       
      schedule({astro: 'sunrise'}, function () {
         tag = true;
         if(morgens) Rollosrauf();
      });
       
      schedule({astro: 'sunset', shift: 20}, function () {
         tag = false;
         if(abends) Rollosrunter();
      });
       
      on(idAuto, function(dp) {
         auto = dp.state.val;
      });
       
      on(idAusschlafen, function(dp) {
         ausschlafen = dp.state.val;
      }); 
      

      Im Grunde geht es darum innerhalb eines Zeitkorridors bei Sunset und Sunrise Szenen zu aktivieren bei denen die Rollläden hoch bzw. runter sind bzw. einige Zimmer im Ausschlaf-Modus ausgelassen werden. Das klappt auch vorzüglich.

      Nun ist es im Sommer so, dass man auch noch paar Minuten nach Sunset sie Rollos oben haben will, weil es halt noch ausreichend hell und warm ist - im Winter genau umgekehrt. Aktuell habe ich das mit shift: 20 für die Abends Funktion realisiert - klappt auch.
      Nun hätte ich aber gerne, dass das Offset (hier 20 Minuten) als Variable aus einem Custom-State von ioBroker genommen wird. Der state soll via Schieberegler in Lovelace einstellbar sein von -30 bis +30. Das müsste doch via getstate machbar sein, aber ich bekomme die Syntax nicht hin. Vieleicht könnt ihr mir helfen?
      Besten Dank vorab!

      bahnuhr paul53 3 Replies Last reply Reply Quote 0
      • bahnuhr
        bahnuhr Forum Testing Most Active @LastActionHero last edited by bahnuhr

        @lastactionhero sagte in X-Minuten nach/vor Sunset Funktion auslösen:

        Nun hätte ich aber gerne, dass das Offset (hier 20 Minuten) als Variable aus einem Custom-State von ioBroker genommen wird. Der state soll via Schieberegler in Lovelace einstellbar sein von -30 bis +30. Das müsste doch via getstate machbar sein, aber ich bekomme die Syntax nicht hin. Vieleicht könnt ihr mir helfen?

        z.B.

        var off = getState("dein DP").val;
        
        

        getState hast du doch zig-fach in deinem Script drin.

        L 1 Reply Last reply Reply Quote 0
        • L
          LastActionHero @bahnuhr last edited by

          @bahnuhr
          Ja, das stimmt, aber wird die variable dann auch jedes mal erneuert wenn einer den schieber betätigt oder nur beim start de scripts?
          Und wie muss die syntax dann hier lauten anstatt „shift: 20“? shift: ´off´ ?

          1 Reply Last reply Reply Quote 0
          • bahnuhr
            bahnuhr Forum Testing Most Active @LastActionHero last edited by

            @lastactionhero sagte in X-Minuten nach/vor Sunset Funktion auslösen:

            Lovelace

            kenn ich nicht.

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

              @LastActionHero
              Versuche mal:

              var shift = getState(idShift).val;
              on(idShift, function(dp) {
                 shift = dp.state.val;
              });
              schedule({astro: 'sunset', shift: shift}, function () {
              
              L 1 Reply Last reply Reply Quote 0
              • L
                LastActionHero @paul53 last edited by

                @paul53 Hallo Paul, danke für deine Unterstützung! Ich habe den Code nun in das Script eingearbeitet, der Code ist unten angefügt. Allerdings wird dann die Funktion scheinbar nicht ausgelöst. Die Rolläden schließen um 21:50 wie im Script als Endzeitpunkt angegeben, aber nicht um 21:20+X Minuten (ich hatte 15 ausgewählt, hätten also um 21:35 schließen sollen).

                Passt denn das Script so? Oder kann es am Typ des Datenpunkts Rollo_offset liegen? Diesen hatte ich als Zahl eingestellt. Habe nun mal auf String umgestellt und warte damit den morgigen Abend ab.

                // Datenpunkt-IDs
                const idAuto = '0_userdata.0.Rollladenautomatik';  // Dummyschalter für Rolladenautomatik
                const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen';  // Dummyschalter für Ausschlaf-Modus
                const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch';  // Szene Rolladen rauf bei Ausschlafen
                const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch';  // Szene Rolladen rauf normalbetrieb
                const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter bei Ausschlafen
                const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter Normalbetrieb
                const idRolloOffset = '0_userdata.0.Rollo_offset'; // Offset Schieberegler
                
                // Variablen werden bei Skriptstart initialisiert
                var auto = getState(idAuto).val;
                var ausschlafen = getState(idAusschlafen).val;
                var tag = isAstroDay();
                var morgens = compareTime('6:30', '8:00', 'between');
                var abends = compareTime('17:00', '21:50', 'between');
                var rollooffset = getState(idRolloOffset).val;
                
                function Rollosrauf() {
                   if(auto) {
                      if(ausschlafen) setState(idAusschlafenRauf, true);
                      else setState(idNormalRauf, true);
                   }
                }
                 
                function Rollosrunter() {
                   if(auto) {
                      if(ausschlafen) setState(idAusschlafenZu, true);
                      else setState(idNormalZu, true);
                   }
                }
                 
                schedule('30 6 * * *', function() {
                   morgens = true;
                   if(tag) Rollosrauf();
                });
                 
                schedule('0 8 * * *', function() {
                   morgens = false;
                   if(!tag) Rollosrauf();
                });
                 
                schedule('0 17 * * *', function() {
                   abends = true;
                   if(!tag) Rollosrunter();
                });
                 
                schedule('50 21 * * *', function() {
                   abends = false;
                   if(tag) Rollosrunter();
                });
                 
                schedule({astro: 'sunrise'}, function () {
                   tag = true;
                   if(morgens) Rollosrauf();
                });
                 
                schedule({astro: 'sunset', shift: rollooffset}, function () {
                   tag = false;
                   if(abends) Rollosrunter();
                });
                 
                on(idAuto, function(dp) {
                   auto = dp.state.val;
                });
                 
                on(idAusschlafen, function(dp) {
                   ausschlafen = dp.state.val;
                });
                
                on(idRolloOffset, function(dp) {
                   rollooffset = dp.state.val;
                });
                
                paul53 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @LastActionHero last edited by paul53

                  @lastactionhero sagte: kann es am Typ des Datenpunkts Rollo_offset liegen? Diesen hatte ich als Zahl eingestellt.

                  Es muss eine Zahl sein.
                  Der Wert für "shift" wird nur bei Skriptstart übernommen. Für eine dynamische Anpassung während der Laufzeit müsste schedule() gestoppt und neu generiert werden, was aber mit Astro-Schedules nicht möglich ist.
                  Man muss also ein "normales" Schedule mit Uhrzeit verwenden, wobei die Uhrzeit einmal pro Tag per getAstroDate('sunset') und Korrektur um "shift" ermittelt wird.

                  EDIT: Etwa so:

                  var sunset;
                  
                  function sunsetWithOffset() {
                      const sunsetOff = getAstroDate('sunset').getTime() + 60000 * getState(idRolloOffset).val;
                      const minute = new Date(sunsetOff).getMinutes().toString();
                      const hour = new Date(sunsetOff).getHours().toString();
                      sunset = schedule(minute + ' ' + hour + ' * * *', function() {
                          tag = false;
                          if(abends) Rollosrunter();
                      });
                  }
                  
                  sunsetWithOffset(); // Skriptstart
                  
                  on(idRolloOffset, function(dp) { // Offset wird geändert
                      clearSchedule(sunset); 
                      sunsetWithOffset();
                  });
                  
                  schedule('0 14 * * *', function() { // einmal täglich vor Ereignis
                      clearSchedule(sunset); 
                      sunsetWithOffset();
                  });
                  
                  L 1 Reply Last reply Reply Quote 1
                  • L
                    LastActionHero @paul53 last edited by

                    @paul53 ah, verstehe, das ist eine wertvolle Information, da hätte ich lange mit Astro hantieren können! D.h. dieser Schedule kommt weg, stattdessen dein Scriptblock an diese stelle.

                    schedule({astro: 'sunset', shift: rollooffset}, function () {
                       tag = false;
                       if(abends) Rollosrunter();
                    });
                    

                    Dann müsste auch der Zeitkorridor noch funktionieren - also zwischen 6:30-8:00 und 17:00-21:50?

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

                      @lastactionhero sagte: Scriptblock an diese stelle.

                      Dieser Skriptblock funktioniert nur bei Skriptstart. Eine dynamische Veränderung von shift während der Laufzeit erfolgt nicht. Deshalb ist die aufwändigere Version mit der täglichen Ermittlung der Uhrzeit erforderlich.

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

                        @paul53 ich möchte mich ganz recht herzlich für deine Hilfe bedanken! Ich habe zeitbedingt ein paar Tage gebraucht das Script umzusetzen, aber das ganze klappt wirklich wie geschmiert! Dankeschön!

                        hier nochmal der aktuelle Stand:

                        // Datenpunkt-IDs
                        const idAuto = '0_userdata.0.Rollladenautomatik';  // Dummyschalter für Rolladenautomatik
                        const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen';  // Dummyschalter für Ausschlaf-Modus
                        const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch';  // Szene Rolladen rauf bei Ausschlafen
                        const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch';  // Szene Rolladen rauf normalbetrieb
                        const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter bei Ausschlafen
                        const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter';  // Szene Rolladen runter Normalbetrieb
                        const idRolloOffset = '0_userdata.0.Rollo_offset'; // Offset Schieberegler
                        
                        // Variablen werden bei Skriptstart initialisiert
                        var auto = getState(idAuto).val;
                        var ausschlafen = getState(idAusschlafen).val;
                        var tag = isAstroDay();
                        var morgens = compareTime('6:30', '8:00', 'between');
                        var abends = compareTime('17:00', '22:15', 'between');
                        var rollooffset = getState(idRolloOffset).val;
                        
                        function Rollosrauf() {
                           if(auto) {
                              if(ausschlafen) setState(idAusschlafenRauf, true);
                              else setState(idNormalRauf, true);
                           }
                        }
                         
                        function Rollosrunter() {
                           if(auto) {
                              if(ausschlafen) setState(idAusschlafenZu, true);
                              else setState(idNormalZu, true);
                           }
                        }
                         
                        schedule('30 6 * * *', function() {
                           morgens = true;
                           if(tag) Rollosrauf();
                        });
                         
                        schedule('0 8 * * *', function() {
                           morgens = false;
                           if(!tag) Rollosrauf();
                        });
                         
                        schedule('0 17 * * *', function() {
                           abends = true;
                           if(!tag) Rollosrunter();
                        });
                         
                        schedule('15 22 * * *', function() {
                           abends = false;
                           if(tag) Rollosrunter();
                        });
                         
                        schedule({astro: 'sunrise'}, function () {
                           tag = true;
                           if(morgens) Rollosrauf();
                        });
                         
                        var sunset;
                         
                        function sunsetWithOffset() {
                            const sunsetOff = getAstroDate('sunset').getTime() + 60000 * getState(idRolloOffset).val;
                            const minute = new Date(sunsetOff).getMinutes().toString();
                            const hour = new Date(sunsetOff).getHours().toString();
                            sunset = schedule(minute + ' ' + hour + ' * * *', function() {
                                tag = false;
                                if(abends) Rollosrunter();
                            });
                        }
                         
                        sunsetWithOffset(); // Skriptstart
                         
                        on(idRolloOffset, function(dp) { // Offset wird geändert
                            clearSchedule(sunset); 
                            sunsetWithOffset();
                        });
                         
                        schedule('0 14 * * *', function() { // einmal täglich vor Ereignis
                            clearSchedule(sunset); 
                            sunsetWithOffset();
                        });
                         
                        on(idAuto, function(dp) {
                           auto = dp.state.val;
                        });
                         
                        on(idAusschlafen, function(dp) {
                           ausschlafen = dp.state.val;
                        });
                        
                        on(idRolloOffset, function(dp) {
                           rollooffset = dp.state.val;
                        });
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        925
                        Online

                        31.9k
                        Users

                        80.2k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        354
                        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