@ft-knorr
Hier ein Ausschnitt aus meinem Skript das etwas ähnliches tut. Der Code unten ist aus dem Skript kopiert das deutlich umfangreicher ist.
EDIT: Dachte ich wäre im Unterforum Javascript. :)
const DEBUG = false;
const maxCt = 500;
const minCt = 250;
const maxBri = 190;
const minBri = 80;
const endHourOfFade = 22;//1-24
const startHourOfFade = 20 ;
function main() {
var currentSunSet = getAstroDate("sunset");
if (timeIsBetween(new Date(),currentSunSet, endHourOfFade+':00') ) {
if (DEBUG) console.log('Fade 1. Abschnitt: Sonnenuntergang:'+currentSunSet+' aktuelle Zeit:'+new Date());
fadeLights(currentSunSet, new Date());
myInterval = setInterval(function(){
fadeLights(currentSunSet, new Date());
},5000);
// bleibe Nachts bei den zurückhaltenden Einstellungen, ab 4 Uhr ist die Automatik beendet
} else if (timeIsBetween(currentTime,endHourOfFade+':00','04:00')){
if (DEBUG) console.log('Fade 2. Abschnitt');
setState('deconz.0.lights.0017880103a0037c.action', '"on": true, "bri": '+minBri+', "ct": '+maxCt);
} else {
setState('deconz.0.lights.0017880103a0037c.on', true);
}
}
function fadeLights (currentSunSet,currentTime) {
var endTime = new Date(currentSunSet);
endTime.setHours(endHourOfFade, 0, 0);
endTime = currentSunSet < endTime ? endTime : new Date(new Date(currentSunSet).setMinutes(new Date(currentSunSet).getMinutes() + 15));
var startTime = new Date(new Date(currentSunSet).setHours(startHourOfFade,0,0));
startTime = currentSunSet < startTime ? startTime : new Date(currentSunSet);
var currentDiff = (endTime.getTime() - currentTime.getTime());
var currentMaxDiff = (endTime.getTime() - startTime.getTime());
if (currentDiff > currentMaxDiff) currentDiff = currentMaxDiff;
var ct = minCt + (maxCt - minCt) * (currentMaxDiff - currentDiff) / currentMaxDiff;
ct = Math.round(ct);
if (ct > maxCt) ct = maxCt;
//Passe die Helligkeit an
var bri = maxBri;
if (currentTime > startTime) {
bri = minBri + (maxBri - minBri) * currentDiff / currentMaxDiff;
bri = Math.round(bri);
}
setState('deconz.0.lights.0017880103a0037c.action', '"on": true, "bri": '+bri+', "ct": '+ct);
}
// Hilfsfunktion:
function timeIsBetween(fTime,start,ende) {//Dateobjekt,hh:mm,hh:mm
var eTime = new Date(), sTime = new Date();
if (typeof start == 'object') {
sTime = new Date(start);
} else {
start = start.split(':');
sTime.setHours(parseInt(start[0]), parseInt(start[1]), 0);
}
if (typeof ende === 'object') {
eTime = new Date(ende);
} else {
ende = ende.split(':');
eTime.setHours(parseInt(ende[0]), parseInt(ende[1]), 0);
}
if (sTime.getTime()>eTime.getTime()) {
if (fTime.getTime() < eTime.getTime()) sTime.setDate(eTime.getDate()-1);
if (fTime.getTime() > sTime.getTime()) eTime.setDate(sTime.getDate()+1);
}
if ( compareTime(sTime, eTime, 'between', fTime) ) return true;
return false;
}