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; } }