Hallo!
Ich benutze einen Shelly Dimmer Gen3, um eine Hauseinfahrt zu beleuchten. Ich möchte, dass diese morgens leuchtet, wenn man das Haus verlässt, aber auch nur, wenn es dann noch dunkel ist. Da man bei den Schedules/Zeitplänen keine Bedingungen angeben kann, habe ich ein wenig rumgeskriptet und getestet.
Das Problem: Der Shelly kennt zwar die Sonnenaufgangszeit für jeden Tag. Diese Info ist aber in den Skripten nicht verfügbar. Man könnte sie über einen Webservice abfragen; dann hat man aber das Problem, dass dieser vielleicht manchmal nicht erreichbar ist. Da der Sonnenaufgang nicht jeden Tag zufällig festgelegt wird und es bei dem Skript nicht auf jede Minute ankommt, habe ich mich dazu entschlossen, die ungefähre Sonnenaufgangszeiten für meinen Standort für jeden Monat zu ermitteln. Und mit dieser Info habe ich für jeden Monat einen eigenen Schaltplan gemacht.
Mit ein bisschen KI ist dann das dabei herausgekommen. Vielleicht ist das auch für andere interessant. Ich teste das jetzt und werden dann in 1-2 JAhren berichtet, ob das skript gut funktioniert und die Zeiten so passen ![]()
// Shelly Dimmer Gen3 - Monatsbasierte Ein-/Ausschalt-Zeiten mit Logausgabe
// Nur aktiv, wenn der Sonnenaufgang nach 06:30 Uhr liegt
function scheduleDimmer(onTimeStr, offTimeStr) {
var now = new Date();
// Alternative zu toDateString(): manuelle Datumsausgabe
var dateStr = now.getFullYear() + "-" +
("0" + (now.getMonth() + 1)).slice(-2) + "-" +
("0" + now.getDate()).slice(-2) + " " +
("0" + now.getHours()).slice(-2) + ":" +
("0" + now.getMinutes()).slice(-2);
function timeToMs(timeStr) {
var parts = timeStr.split(":");
var hours = parseInt(parts[0], 10);
var minutes = parseInt(parts[1], 10);
var target = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, 0, 0);
return target.getTime() - now.getTime();
}
var msToOn = timeToMs(onTimeStr);
var msToOff = timeToMs(offTimeStr);
print("📅 Heute ist: " + dateStr);
print("🕕 Geplante Einschaltzeit: " + onTimeStr);
print("🌅 Geplante Ausschaltzeit: " + offTimeStr);
if (msToOn > 0) {
Timer.set(msToOn, false, function() {
Shelly.call("Light.Set", { id: 0, on: true });
print("💡 Lampe eingeschaltet um " + onTimeStr);
});
} else {
print("ℹ️ Einschaltzeit " + onTimeStr + " ist bereits vorbei, wird heute nicht mehr ausgeführt.");
}
if (msToOff > 0) {
Timer.set(msToOff, false, function() {
Shelly.call("Light.Set", { id: 0, on: false });
print("🌑 Lampe ausgeschaltet um " + offTimeStr);
});
} else {
print("ℹ️ Ausschaltzeit " + offTimeStr + " ist bereits vorbei, wird heute nicht mehr ausgeführt.");
}
}
function scheduleByMonth() {
var month = new Date().getMonth() + 1; // 1=Jan, 12=Dez
print("🔄 Aktueller Monat: " + month);
switch(month) {
case 1:
// Januar: Sonnenaufgang ca. 08:04 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "08:19");
break;
case 2:
// Februar: Sonnenaufgang ca. 07:50 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "08:05");
break;
case 3:
// März: Sonnenaufgang ca. 06:43 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "06:58");
break;
case 4:
// April: Sonnenaufgang ca. 06:00 Uhr → VOR 6:30 → deaktiviert
print("☀️ April: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 5:
// Mai: Sonnenaufgang ca. 05:37 Uhr → VOR 6:30 → deaktiviert
print("☀️ Mai: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 6:
// Juni: Sonnenaufgang ca. 05:13 Uhr → VOR 6:30 → deaktiviert
print("☀️ Juni: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 7:
// Juli: Sonnenaufgang ca. 05:02 Uhr → VOR 6:30 → deaktiviert
print("☀️ Juli: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 8:
// August: Sonnenaufgang ca. 05:31 Uhr → VOR 6:30 → deaktiviert
print("☀️ August: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 9:
// September: Sonnenaufgang ca. 06:00 Uhr → VOR 6:30 → deaktiviert
print("☀️ September: Sonnenaufgang vor 6:30 → keine Schaltung erforderlich.");
break;
case 10:
// Oktober: Sonnenaufgang ca. 07:16 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "07:31");
break;
case 11:
// November: Sonnenaufgang ca. 08:00 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "08:15");
break;
case 12:
// Dezember: Sonnenaufgang ca. 08:36 Uhr → NACH 6:30 → aktiv
scheduleDimmer("06:30", "08:51");
break;
default:
print("❌ Ungültiger Monat: " + month);
}
}
// 🕛 Nächste Mitternacht berechnen
function scheduleMidnightReplan() {
let now = new Date();
let tomorrow = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 5, 0, 0); // 00:05 Uhr
let msToMidnight = tomorrow.getTime() - now.getTime();
print("⏰ Neuer Plan wird in " + Math.round(msToMidnight / 60000) + " Minuten ausgeführt (00:05 Uhr).");
Timer.set(msToMidnight, false, function() {
print("🔁 Neuer Tag erkannt – plane Schaltzeiten neu …");
scheduleByMonth(); // Schaltzeiten für neuen Tag setzen
scheduleMidnightReplan(); // Wieder für nächste Nacht planen
});
}
// Skript starten
scheduleByMonth();
scheduleMidnightReplan();
Alles anzeigen