Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Sektionen Shutter Control je nach Sonnenwinkel (Azimuth)

    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

    Sektionen Shutter Control je nach Sonnenwinkel (Azimuth)

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

      Es gibt zwar den Adapter ShutterControl, der war mir aber für meine Zwecke nicht geeignet.
      Ich will je nach Sonnen-Azimuth verschiedene Sektoren vom Haus mit den Rollo abschatten.
      Für die Ermittlung der Sektionen gibt es www.sonnenverlauf.de.
      Man sucht sein Haus und verändert auf der Zeitachse dann die Position der Sonne. Dann die Anfangs und Endwerte des Azimuth notieren und in die Konstanten der Sektionen eintragen.

      Außerdem wird der Adapter Weatherunderground benötigt sowie suncalc.

      Um den Sonnenstand zuberechen :

      function today () {
          var d = new Date();
          return (formatDate(d, "TT.MM.JJJJ SS:mm:ss"));
      }
      
      function Sonnenstand_berechnen () {
          var now = new Date();
          var sunpos = suncalc.getPosition(now, lat, long);
          var h = sunpos.altitude * 180 / Math.PI;
          var a = sunpos.azimuth * 180 / Math.PI + 180;
          setState(idEle, Math.round(10 * h) / 10, true);
          setState(idAzi, Math.round(a), true);
          var heute = today(); // aktuelles Datum und aktuelle Zeit
          setState(idTime,heute);
      }
       
      schedule("* * * * *", Sonnenstand_berechnen); // jede Minute
      
      

      Shutter Control Script :
      Das Script verwendet eine Liste der Sektionen, in der Begin und Ende des Azimuth deklariert wird.
      Die Sektionenliste kann erweitert oder verkleinert werden, je nach Bedarf.

      Die Funktion ScheduleOneSection berechnet dann ob die Rollos runtergefahren werden :
      Wenn Temperatur größer als die Min Temperatur ist.
      Wenn die Sektion innerhalb der Grenzen liegt
      Wenn die Bewölkung in den nächsten 4 Stunden unter der definierten Mindestgrenze liegt.

      Rollo wieder rauf, wenn Sonnenstand außerhalb der Sektion oder Bewölkung über der max. Grenze.

      Wenn kein Aussentemperatur Sensor vorhanden ist, kann auch die Temperatur von der Wettervorhersage verwendet werden.

      Das Script bewegt die Rollo nur einmal, man kann also manuell auch die Rollo verdunkeln oder rauffahren.

      // Sonnenstand 
      // Ost = 100° bis 210°  (ca. 9:00 bis 14:00)
      // Süd = Dach 150° bis 270° (ca. 12:00 bis 18:00)
      //       Wand 180° bis 270° (ca. 13:00 bis 18:00)
      // schedule nach Sonnenstand Azimuth
      // wenn Ost, dann alle Rollos auf Ostseite runterfahren auf Abschattung
      // wenn Süd, dann alle Rollos auf Südseite runterfahren auf Abschattung
      // Sonnenstand wurde mit www.sonnenverlauf.de ermittelt
      
      // Script benötigt noch die Adapter Weatherunderground sowie suncalc
      
      const idAzi = 'javascript.0.Sonnenstand.Azimut';
      const AussenTemp = 'hm-rega.0.8536';
      
      
      const cAziOstBegin = 100;
      const cAziOstEnd = 210;
      const cAziSuedDachBegin = 150;
      const cAziSuedDachEnd = 270;
      const cAziSuedWandBegin = 180;
      const cAziSuedWandEnd = 270;
      
      
      const idOstActive = "SonnenRollo.Ost.Active";
      const idOstEnabled = "SonnenRollo.Ost.Enabled";
      const idOstBeginAzi = "SonnenRollo.Ost.BeginAzi";
      const idOstEndAzi = "SonnenRollo.Ost.MaxAzi";
      const idSuedDachActive = "SonnenRollo.Sued.Dach.Active";
      const idSuedDachEnabled = "SonnenRollo.Sued.Dach.Enabled";
      const idSuedDachBeginAzi = "SonnenRollo.Sued.Dach.BeginAzi";
      const idSuedDachEndAzi = "SonnenRollo.Sued.Dach.EndAzi";
      const idSuedWandActive = "SonnenRollo.Sued.Wand.Active";
      const idSuedWandEnabled = "SonnenRollo.Sued.Wand.Enabled";
      const idSuedWandBeginAzi = "SonnenRollo.Sued.Wand.BeginAzi";
      const idSuedWandEndAzi = "SonnenRollo.Sued.Wand.EndAzi";
      const idCloudp = "SonnenRollo.Cloudp";
      const idMaxCloudp = "SonnenRollo.MaxCloudp";
      const idAussenTempMin = "SonnenRollo.MinAussenTemp";
      
      const cAussenTempMin = 20.0;
      const cMaxCloudp = 30;
      
      const idCloud0h = 'weatherunderground.0.forecastHourly.0h.sky';
      const idCloud1h = 'weatherunderground.0.forecastHourly.1h.sky';
      const idCloud2h = 'weatherunderground.0.forecastHourly.2h.sky';
      const idCloud3h = 'weatherunderground.0.forecastHourly.3h.sky';
      
      const creatStateList = [
          {name :idOstEnabled, initial:false, type:"boolean", role : "value"},
          {name :idOstActive, initial:false, type:"boolean", role : "value"},
          {name :idOstBeginAzi, initial:cAziOstBegin, type:"number", role : "value"},
          {name :idOstEndAzi, initial:cAziOstEnd, type:"number", role : "value"},
          {name :idSuedDachEnabled, initial:false, type:"boolean", role : "value"},
          {name :idSuedDachActive, initial:false, type:"boolean", role : "value"},
          {name :idSuedDachBeginAzi, initial:cAziSuedDachBegin, type:"number", role : "value"},
          {name :idSuedDachEndAzi, initial:cAziSuedDachEnd, type:"number", role : "value"},
          {name :idSuedWandEnabled, initial:false, type:"boolean", role : "value"},
          {name :idSuedWandActive, initial:false, type:"boolean", role : "value"},
          {name :idSuedWandBeginAzi, initial:cAziSuedWandBegin, type:"number", role : "value"},
          {name :idSuedWandEndAzi, initial:cAziSuedWandEnd, type:"number", role : "value"},
          {name :idCloudp, initial:0, type:"number", role : "value"},
          {name :idMaxCloudp, initial:cMaxCloudp, type:"number", role : "value"},
          {name :idAussenTempMin, initial:cAussenTempMin, type:"number", role : "value"},
      ]
      
      creatStateList.forEach (function(item) {
          createState(item.name, item.initial, { 
              type: item.type,
              min: 0,
              def: 0,
              role: item.role
          });
      });
      
      
      // Liste aller Rollos in den Sektionen
      // Ost
      const idRolloWohn1 = 'hm-rpc.0.HEQ0226186.1.LEVEL';
      const idRolloWohn2 = 'hm-rpc.0.HEQ0226973.1.LEVEL';
      const idRolloTuerGast = 'hm-rpc.1.LEQ0474520.3.LEVEL';
      const idRolloTuerBibliothek = 'hm-rpc.1.LEQ0474515.3.LEVEL';
      
      const OstRolloRunterList = [
          {name :idRolloWohn1, value:65},
          {name :idRolloWohn2,  value:65},
          {name :idRolloTuerGast,  value:65},
          {name :idRolloTuerBibliothek,  value:47}
      ]
      
      const OstRolloRaufList = [
          {name :idRolloWohn1, value:100},
          {name :idRolloWohn2,  value:100},
          {name :idRolloTuerGast,  value:100},
          {name :idRolloTuerBibliothek,  value:100}
      ]
      
      // Sued
      // Dach
      const idRolloDFFBibliothek = 'hm-rpc.1.EEQ0049007.3.LEVEL';
      const idRolloDFFBibliothekState = 'hm-rpc.0.LEQ0173556.1.STATE';
      const idRolloDFFWernerBuero = 'hm-rpc.1.EEQ0048996.3.LEVEL';
      const idRolloDFFWernerBueroState = 'hm-rpc.0.LEQ0174059.1.STATE';
      const idRolloDFFAngelikaBuero = 'hm-rpc.1.EEQ0048971.3.LEVEL';
      const idRolloDFFAngelikaBueroState = 'hm-rpc.0.LEQ0173973.1.STATE';
      
      const SuedDachRolloRunterList = [
          {name :idRolloDFFBibliothek, value:30, state:idRolloDFFBibliothekState},
          {name :idRolloDFFWernerBuero,  value:30, state:idRolloDFFWernerBueroState},
          {name :idRolloDFFAngelikaBuero,  value:30, state:idRolloDFFAngelikaBueroState}
      ]
      
      const SuedDachRolloRaufList = [
          {name :idRolloDFFBibliothek, value:100, state:idRolloDFFBibliothekState},
          {name :idRolloDFFWernerBuero,  value:100, state:idRolloDFFWernerBueroState},
          {name :idRolloDFFAngelikaBuero,  value:100, state:idRolloDFFAngelikaBueroState}
      
      ]
      
      
      // Wand
      
      const idRolloKueche = 'hm-rpc.0.IEQ0018796.1.LEVEL';
      const idRolloSchlaf = 'hm-rpc.0.HEQ0226866.1.LEVEL';
      
      const SuedWandRolloRunterList = [
          {name :idRolloKueche, value:40},
          {name :idRolloSchlaf,  value:25}
      ]
      
      const SuedWandRolloRaufList = [
          {name :idRolloKueche, value:100},
          {name :idRolloSchlaf,  value:100}
      ]
      
      // Rollo bewegen, je nach ActionList
      // Bei Kipp-Fenster wird der Fenstersensor ausgewertet (wenn state vorhanden) ->
      // keine Bewegung wenn Fenster offen
      function RolloAction (ActionList) {
          ActionList.forEach (function(item) {
              let doIt = true;
              if (item.state) {
                  doIt = !getState(item.state).val;
              }
              if (doIt==true) setState (item.name,item.value);
          });
      };
      
      // Mittelwert der Bewölkung für die nächsten 4 Stunden
      function getCloudPercent() {
          let c = getState (idCloud0h).val+getState (idCloud1h).val+getState (idCloud2h).val+getState (idCloud3h).val;
          c /=4;
          return (c);
      }
      
      
      const SectionList = [
          {name:'Ost',Enabled:idOstEnabled,Active:idOstActive,RolloRunterList:OstRolloRunterList,
           RolloRaufList:OstRolloRaufList,AziBegin:idOstBeginAzi,AziEnd:idOstEndAzi},
          {name:'SuedDach',Enabled:idSuedDachEnabled,Active:idSuedDachActive,RolloRunterList:SuedDachRolloRunterList,
           RolloRaufList:SuedDachRolloRaufList,AziBegin:idSuedDachBeginAzi,AziEnd:idSuedDachEndAzi},
          {name:'SuedWand',Enabled:idSuedWandEnabled,Active:idSuedWandActive,RolloRunterList:SuedWandRolloRunterList,
           RolloRaufList:SuedWandRolloRaufList,AziBegin:idSuedWandBeginAzi,AziEnd:idSuedWandEndAzi}
      ];
      
      function ScheduleOneSection(ThisSection) {
          let Azi=getState (idAzi).val;
          let Temp=getState (AussenTemp).val;
          let cloudp = getCloudPercent();
          let maxCloudp = getState (idMaxCloudp).val;
          let AussenTempMin = getState (idAussenTempMin).val;
          let AziBegin =getState(ThisSection.AziBegin).val;
          let AziEnd =getState(ThisSection.AziEnd).val;
          let Enabled = getState (ThisSection.Enabled).val;
          
          setState (idCloudp,cloudp);
          let Active=getState (ThisSection.Active).val;
          
          if (Enabled) {
              if ((Azi>=AziBegin) && (Azi<AziEnd)) 
              {
                  if (cloudp<maxCloudp) {
                      if ((Temp>=AussenTempMin) && (Active == false)) {
                          Active = true;
                          setState(ThisSection.Active,Active);
                          // Rollo runter
                          RolloAction(ThisSection.RolloRunterList);
                      }   
                  }
              }
              if (Active==true) {
                  if ((Azi>AziEnd) || (cloudp>maxCloudp)) {
                      // Rollo rauf
                      Active = false;
                      setState(ThisSection.Active,Active);
                      RolloAction(ThisSection.RolloRaufList);
                  }   
              }
          }
      
      }
      
      function ScheduleAllSections() {
          SectionList.forEach (function(item) {
              ScheduleOneSection(item);
          });
      }
      
      on({id: idAzi , change:'ne'}, function (obj) {
          ScheduleAllSections();
      });
      
      
      

      Hier kann ich die einzelnen Sektionen enablen/disablen

      fa2d1fb0-a734-4fe5-8ae9-29a9466d4382-grafik.png

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

      Support us

      ioBroker
      Community Adapters
      Donate

      880
      Online

      31.9k
      Users

      80.3k
      Topics

      1.3m
      Posts

      1
      1
      607
      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