Was haltet ihr davon? Gibt es einen eleganteren Weg?
2017-10-31
Lampen als Array
Neue Funktion CheckStatus(TimeToSunset,light) pro Lampe
Funktion fadeIN(transTime,level_min,level_max) erweitert. Parameter Level_min und Level_max definieren Start- und Endhelligkeit der Lampen.
// ==========Einstellungen Start==========
// Lampen
var lights = [
"hue.0.Philips_hue.Wohnzimmer",
"hue.0.Philips_hue.Teich",
];
// Start und Endhelligkeit
var level_min = 10;
var level_max = 80;
// ToDo
var color = 0;
// ==========Einstellungen Ende==========
// Timer jede Minute
schedule("* * * * *", function ()
{
log("==========Skript Start: Sunset_Light==========");
log("==========AstroDaten abfragen==========");
// var nightEnd = getAstroDate("nightEnd");
// log(" (0) nightEnd (Ende der Nacht)........................: " + nightEnd.toLocaleTimeString());
// var nauticalDawn = getAstroDate("nauticalDawn");
// log(" (1) nauticalDawn (naut. Dämmerung Morgens)...........: " + nauticalDawn.toLocaleTimeString());
// var dawn = getAstroDate("dawn");
// log(" (2) dawn (Dämmerung Morgens).........................: " + dawn.toLocaleTimeString());
// var sunrise = getAstroDate("sunrise");
// log(" (3) sunrise (Sonnenaufgang)..........................: " + sunrise.toLocaleTimeString());
// var sunriseEnd = getAstroDate("sunriseEnd");
// log(" (4) sunriseEnd (Ende des Sonnenaufgangs).............: " + sunriseEnd.toLocaleTimeString());
// var goldenHourEnd = getAstroDate("goldenHourEnd");
// log(" (5) goldenHourEnd (Ende der Golden Hour VM)..........: " + goldenHourEnd.toLocaleTimeString());
// var solarNoon = getAstroDate("solarNoon");
// log(" (6) solarNoon (Mittag)...............................: " + solarNoon.toLocaleTimeString());
// var goldenHour = getAstroDate("goldenHour");
// log(" (7) goldenHour (Start der Golden Hour NM)............: " + goldenHour.toLocaleTimeString());
var sunsetStart = getAstroDate("sunsetStart");
log(" (8) sunsetStart (Start des Sonnenuntergangs).........: " + sunsetStart.toLocaleTimeString());
var sunset = getAstroDate("sunset");
// log(" (9) sunset (Sonnenuntergang).........................: " + sunset.toLocaleTimeString());
var dusk = getAstroDate("dusk");
log("(10) dusk (Dämmerung Abends)..........................: " + dusk.toLocaleTimeString());
// var nauticalDusk = getAstroDate("nauticalDusk");
// log("(11) nauticalDusk (naut. Dämmerung Abends)...........: " + nauticalDusk.toLocaleTimeString());
// var night = getAstroDate("night");
// log("(12) night (astron. Dämmerung Abends).................: " + night.toLocaleTimeString());
// var nadir = getAstroDate("nadir");
// log("(13) nadir (Dunkelster Moment der Nacht)..............: " + nadir.toLocaleTimeString());
log("==========Funktionen ausführen==========");
// Zeit zwischen 2 Zeiten berechnen
// Übergabe: Zeit 1 und Zeit 2
var Time1_2 = TimeBetween(sunsetStart, dusk);
// Zeit bis Start Sonnenuntergang berechnen
// Übergabe: Start des Sonnenuntergangs. getAstroDate("sunsetStart");
var sunsetrest = TimeToSunset(sunsetStart);
// Prüfen pro Lampe ob bereits an und ob Sonnenuntergang begonnen hat.
// Wenn true, dann anschalten
lights.forEach(function(element) {
if (Boolean(CheckStatus(sunsetrest,element))){
FadeIN(Time1_2,level_min,level_max);
}
});
log("==========Skript Ende: Sunset_Light==========");
});
// Funktionen ***************************************************************************************************
// Licht mit level_min einschalten und auf level_max mit transTime blenden
// Übergebene Parameter: Zeit für das Einblenden in Minuten, start und end level
function FadeIN(transTime,level_min,level_max){
log("Funktion: fadeIN() mit transTime: " + transTime + " , level_min " + level_min + " , level_max " + level_max);
// transTime kommt mit Minuten, also transTime *60 / 0.1 = fadeTime
// da es zu schnell dunkel wird nur die halbe Zeit nehmen
var fadeTime = transTime * 60 / 0.1 / 2;
lights.forEach(function(element) {
// Command leeren
setState(element +".command","{}");
// Lampen anschalten ( command greift sonst nicht )
setState(element +".on",true);
// Initial level auf level_min setzen
setState(element+".level",level_min);
// 3 Sekunden warten, dann command ausfühen ( klappt nicht direkt nach einschalten )
setTimeout(function() {
var com = "{\"on\":true,\"level\":" + level_max + ",\"transitiontime\":" + fadeTime + "}";
setState(element+".command",com);
},3000);
});
}
// Berechnungen der restlichen Minnuten bis endTime basierend auf der aktuellen Uhrzeit
// Übergebene Parameter: Zeit auf die berechnet werden soll
// Return liefert Zeit in Minuten
function TimeToSunset(endTime){
log("Funktion: timeToSunset()");
var today = new Date();
var rest = 0;
rest = ((endTime.getTime() - today.getTime()) /1000 /60);
rest = Math.round(rest);
return rest;
}
// Berechnungen der Zeit zwischen 2 Zeiten
// Übergebene Parameter: Zeit1 und Zeit2 auf die berechnet werden soll
// Return liefert Zeit in Minuten
function TimeBetween(time1, time2){
log("Funktion: TimeBetween()");
var diff = 0;
diff = ((time2.getTime() - time1.getTime()) /1000 /60);
diff = Math.round(diff);
return diff;
}
// Status der Lampen prüfen und schauen ob Sonnenuntergang bald beginnt
// Übergebene Parameter: Zeit bis Sonnenuntergang in Minuten, Lampe
// Return liefert true oder false
function CheckStatus(TimeToSunset,light){
log("Funktion: CheckStatus() mit TimeToSunset: " + TimeToSunset + " und Lampe " + light);
// Wenn Lampe aus
if (getState(light+".on").val === false ){
// Wenn restl. Zeit bis Sonneuntergang ( zwischen 2 und 0 Minuten )
if(TimeToSunset <= 2 && TimeToSunset >=0){
return true;
// sonst tue nichts.
} else {
return false;
}
}
// sonst tue nichts.
else {
return false;
}
}