NEWS
Sektionen Shutter Control je nach Sonnenwinkel (Azimuth)
-
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