Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Rollladen Script mit Sunrise/Sunset und zusätzlicher Bedingung

    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

    Rollladen Script mit Sunrise/Sunset und zusätzlicher Bedingung

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

      Hi!

      Ich versuche grade mein Rollladen Script mit Blocky zu erstellen. Leider gibt es mehrere Bedingungen und ich komme nicht weiter! Ich habe mal mein aktuellen Stand angehangen.

      Das Rollladenscript soll bei Sonnenuntergang prüfen ob der Dummy Rollladenautomatik aktiviert ist (manuell angelegter Datenpunkt true/false), soll dann im nächsten Schritt prüfen ob der Dummy Rollo_Winter aktiviert ist und dann die Szene Winter_Rollo true setzen, falls der Winter Dummy false ist, soll er Sommer_Rollo true setzen. Ich nutze 2 versch. Szenen im Sommer/Winter weil im Winter zusätzlich der Balkon Rollo geschlossen werden soll, im Sommer bleibt der offen.

      So, nun zu meiner frage: In FHEM konnte man bei der Astrofunktion definieren, dass die Aktionen bei Sinrise, aber in keinem Fall vor einer bestimmten Uhrzeit auszuführen waren.

      Beispiel: Sommersunrise ist 5:40Uhr, wenn man nun als variable nicht-vor-uhrzeit 7:00Uhr eingestellt hatte, wurde die aktion auch erst um 7:00 ausgeführt. War sunrise dann 7:10Uhr, kam die aktion um 7:10. In die andere Richtung ging das genau so: Sunset bei 8:00, die aktion soll aber nicht nach 7:30 ausgeführt werden, d.h. jede aktion sunset später 7:30 wird bei 7:30uhr ausgeführt.

      Wie lässt sich das hier in iobroker umsetzen?!
      3800_unbenannt.png

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

        @LastActionHero:

        Sommersunrise ist 5:40Uhr, wenn man nun als variable nicht-vor-uhrzeit 7:00Uhr eingestellt hatte, wurde die aktion auch erst um 7:00 ausgeführt. War sunrise dann 7:10Uhr, kam die aktion um 7:10. In die andere Richtung ging das genau so: Sunset bei 8:00, die aktion soll aber nicht nach 7:30 ausgeführt werden, d.h. jede aktion sunset später 7:30 wird bei 7:30uhr ausgeführt.

        Wie lässt sich das hier in iobroker umsetzen?! `
        Mit Skriptvariablen, die zu den entsprechenden Zeitpunkten gesetzt werden.

        Wenn es nicht Blockly sein muss, dann etwa so:

        // Datenpunkt-IDs
        const idAuto = '...';  // Rolladenautomatik
        const idWinter = '...';
        const idWinterRauf = '...';  // Rolladen rauf im Winter
        const idSommerRauf = '...';  // Rolladen rauf im Sommer
        
        // Variablen werden bei Skriptstart initialisiert
        var auto = getState(idAuto).val;
        var winter = getState(idWinter).val;
        var tag = isAstroDay();
        var morgens = compareTime('7:00', '7:30', 'between');
        
        function Rollosrauf() {
           if(auto) {
              if(winter) setState(idWinterRauf, true);
              else setState(idSommerRauf, true);
           }
        }
        
        schedule('0 7 * * *', function() {
           morgens = true;
           if(tag) Rollosrauf();
        });
        
        schedule('30 7 * * *', function() {
           morgens = false;
           if(!tag) Rollosrauf();
        });
        
        schedule({astro: 'sunrise'}, function () {
           tag = true;
           if(morgens) Rollosrauf();
        });
        
        schedule({astro: 'sunset'}, function () {
           tag = false;
        });
        
        on(idAuto, function(dp) {
           auto = dp.state.val;
        });
        
        on(idWinter, function(dp) {
           winter = dp.state.val;
        });      
        
        

        Das muss natürlich noch um "Rollos runter" am Abend erweitert werden

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

          Hi!

          Habe mir das script übers wochenende angeschaut und auch grade nochmal. Ich verstehs nicht 🙂 könntest du mir die einzelnen blöcke nochmal komentieren? Ich würde die logik gerne verstehen, das würde mir sehr weiter helfen!

          Variablen, Function, constanten sind klar! ich stelle mal meine Fragen bzw. meine Komentare direkt in den Code:

          schedule('0 7 * * *', function() {    /// Morgens um 7Uhr wird geprüft... 
             morgens = true;                       // Wozu das? warum hier nochmal die Zeitspanne zw. 7:00 und 7:30?
             if(tag) Rollosrauf();                    // wenn Uhrzeit nach Sunrise -> Rollos hochfahren
          });
          
          schedule('30 7 * * *', function() {      /// Morgens um 7:30Uhr wird geprüft... 
             morgens = false;                         // Verstehe ich auch nicht, warum ist 7:30 nun false?
             if(!tag) Rollosrauf();                    // Wenn zwar immernoch kein Sunrise, aber 7:30Uhr trotzdem Rollos hochfahren
          });
          
          schedule({astro: 'sunrise'}, function () {           // Bei sunrise ausführen....
             tag = true;                                               // Versteh ich auch nicht, warum wird nochmal Tag abgefragt? Wenn Sunrise ist, ist doch automatisch Tag
             if(morgens) Rollosrauf();                             // Wenn Zeit zwischen 7:00 und 7:30Uhr rollos hochfahren
          });
          
          schedule({astro: 'sunset'}, function () {   // Bei sunset nix machen?!
             tag = false;
          });
          
          on(idAuto, function(dp) {                        // was machen die beiden Blöcke hier?
             auto = dp.state.val;
          });
          
          on(idWinter, function(dp) {
             winter = dp.state.val;
          });     
          
          
          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            Das gesamte Skript wird nur ein einziges Mal bei Start des Skriptes ausgeführt. Wenn danach etwas passieren soll, werden Auslöser benötigt. Das können zeitliche Auslöser sein (schedule()) oder Auslöser, die auf Ereignisse reagieren(on()).

            schedule('0 7 * * *', function() {    // Morgens um 7Uhr wird ausgelöst
               morgens = true;                       // die Variable wird aktualisiert (morgens beginnt)
            
            
            schedule('30 7 * * *', function() {      // Morgens um 7:30Uhr wird ausgelöst
               morgens = false;                         // die Variable wird aktualisiert (morgens endet)
            
            
               tag = true;                          // Variable wird aktualisert (Tag beginnt), Variable tag wurde bei Sonnenuntergnag auf false gesetzt
            
            

            @LastActionHero:

            schedule({astro: 'sunset'}, function () {   // Bei sunset nix machen?!
               tag = false;  // Variable wird aktualisiert (Tag endet)
            });
            ```` `  
            

            @paul53:

            Das muss natürlich noch um "Rollos runter" am Abend erweitert werden `
            Die Bedingungen für "Rollos runter" am Abend hast Du noch nicht mitgeteilt.

            @LastActionHero:

            on(idAuto, function(dp) {                        // was machen die beiden Blöcke hier?
               auto = dp.state.val;
            });
            
            on(idWinter, function(dp) {  // Triggern bei Wertänderung
               winter = dp.state.val;    // winter = Wert des Datenpunktes
            });
            ```` `  
            

            Diese beiden Blöcke aktualisieren die Skripvariablen auto und winter genau dann, wenn sich der Wert des entsprechenden Datenpunktes ändert.

            Eine Beschreibung der Funktionen des Javascript-Adapters inkl. Auslöser findes Du auf https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md.

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

              mensch was eine komplexe logik, aber ich habs verstanden mit deiner Hilfe, Danke! 🙂 naja eigentlich nicht komplex, aber da muss man erstmal drauf kommen wenn man das nicht tag für tag programmiert 🙂

              Ich habs mal versucht selbst um die abendliche Funktion zu erweitern! Habs jetzt so mal ans Laufen gebracht und bin gespannt obs klappt 🙂

              // Datenpunkt-IDs
              const idAuto = 'Dummyschalter.0.Automation.Rolloautomatik';  // Dummyschalter für Rolladenautomatik
              const idWinter = 'Dummyschalter.0.Automation.Rollo_winter';  // Dummyschalter für Winterbetrieb
              const idWinterRauf = 'scene.0.Rollo_hoch';  // Szene Rolladen rauf im Winter
              const idSommerRauf = 'scene.0.Rollo_hoch';  // Szene Rolladen rauf im Sommer
              const idWinterZu = 'scene.0.Rollo_winter_runter';  // Szene Rolladen runter im Winter
              const idSommerZu = 'scene.0.Rollo_sommer_runter';  // Szene Rolladen runter im Sommer
              
              // Variablen werden bei Skriptstart initialisiert
              var auto = getState(idAuto).val;
              var winter = getState(idWinter).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(winter) setState(idWinterRauf, true);
                    else setState(idSommerRauf, true);
                 }
              }
              
              function Rollosrunter() {
                 if(auto) {
                    if(winter) setState(idWinterZu, true);
                    else setState(idSommerZu, 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'}, function () {
                 tag = false;
                 if(abends) Rollosrunter();
              });
              
              on(idAuto, function(dp) {
                 auto = dp.state.val;
              });
              
              on(idWinter, function(dp) {
                 winter = dp.state.val;
              }); 
              
              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              558
              Online

              31.9k
              Users

              80.2k
              Topics

              1.3m
              Posts

              2
              5
              2316
              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