Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. Sektionen Shutter Control je nach Sonnenwinkel (Azimuth)

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    883

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Sektionen Shutter Control je nach Sonnenwinkel (Azimuth)

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
1 Beiträge 1 Kommentatoren 672 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • GarganoG Offline
    GarganoG Offline
    Gargano
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    3
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen


    Support us

    ioBroker
    Community Adapters
    Donate

    758

    Online

    32.6k

    Benutzer

    82.1k

    Themen

    1.3m

    Beiträge
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
    ioBroker Community 2014-2025
    logo
    • Anmelden

    • Du hast noch kein Konto? Registrieren

    • Anmelden oder registrieren, um zu suchen
    • Erster Beitrag
      Letzter Beitrag
    0
    • Home
    • Aktuell
    • Tags
    • Ungelesen 0
    • Kategorien
    • Unreplied
    • Beliebt
    • GitHub
    • Docu
    • Hilfe