-
Autor
Hallo zusammen,
ich will hier mein Script für eine Treppenhauslichtsteuerung veröffentlichen, um anderen Usern zu helfen.
Wenn jemand vielleicht eine Verbesserung hat oder eine andere Möglichkeit die Anforderung besser oder anders zu lösen, gerne her damit.
Bestand:
2 Lichtkreise (Treppenhaus und Hoflicht) die jeweils mit mehreren Tastern angesteuert werden von 2 mechanischen ELTACO.
Was noch eine Besonderheit ist, ein Lichtkreis ist per Nulleiter geschaltet, der 2. Lichtkreis per Phase. Fragt mich nicht warum, ist halt so.
Meine Anforderung war:
- Es soll jeder Lichtkreis individuell einstellbar sein und von den Tastern aus steuerbar.
- 1x Treppenhaus-Tastendruck -> Treppenhauslicht geht an für 60 Sekunden
- Ein weiterer Tastendruck verlängert die Zeit jeweils um 60 Sekunden, aber nur bis maximal 5 Minuten
- Tastendruck länger als 2 Sekunden -> Licht geht aus
- 1x Hoflicht-Tastendruck -> Hoflicht geht an für 30 Sekunden
- Weiterer Tastendruck -> Hoflicht geht aus
Das Hoflicht war sehr einfach zu lösen über den Automation Timer.
Das Treppenhauslicht breitete mir da mehr Kopfzerbrechen, hab es dann über ein Script lösen können:
/* // Hier kann der Debug-Modus für Fehlersuche aktiviert werden
print("🔍 Skript gestartet");
Shelly.addEventHandler(function (event) {
if (event.component === "input:" + inputId) {
print("🆕 Event erkannt:", JSON.stringify(event));
}
});
*/
print("🔍 Skript gestartet");
let duration = 0;
let timer = null;
let channel = 0; // Relay 0
let inputId = 0; // Input 0
let maxDuration = 300; // Maximale Zeit für das Licht
let pressStart = 0;
let defaultTime = 60; // Standarddauer für das erste Einschalten
// Funktion: Licht ausschalten
function cancelLight() {
if (timer !== null) {
Timer.clear(timer);
timer = null;
}
duration = 0;
Shelly.call("Switch.Set", { id: channel, on: false });
print("❌ Licht manuell ausgeschaltet");
}
// Funktion: Licht einschalten (erste Aktivierung)
function startLight() {
print("🚀 Erstes Einschalten des Lichts für", defaultTime, "Sekunden");
duration = defaultTime;
Shelly.call("Switch.Set", { id: channel, on: true });
if (timer !== null) {
Timer.clear(timer);
}
timer = Timer.set(defaultTime * 1000, false, function () {
Shelly.call("Switch.Set", { id: channel, on: false });
duration = 0;
timer = null;
print("⏱️ Erstes Einschalten beendet – Licht aus");
});
}
// Funktion: Lichtzeit verlängern
function extendTime() {
duration = Math.min(duration + defaultTime, maxDuration);
// Falls das Licht bereits an ist, nur Dauer anpassen
if (timer !== null) {
Timer.clear(timer);
}
Shelly.call("Switch.Set", { id: channel, on: true });
timer = Timer.set(duration * 1000, false, function () {
Shelly.call("Switch.Set", { id: channel, on: false });
duration = 0;
timer = null;
print("⏱️ Timer abgelaufen – Licht aus");
});
print("✅ Verlängert auf", duration, "Sekunden");
}
// Eingangsereignisse überwachen
Shelly.addEventHandler(function (event) {
if (event.component === "input:" + inputId) {
print("🆕 Event erkannt:", JSON.stringify(event));
if (event.info.event === "btn_down") {
pressStart = Shelly.getComponentStatus("sys").uptime || 0;
print("🔘 Taste gedrückt (Startzeit:", pressStart, ")");
}
if (event.info.event === "btn_up") {
let pressEnd = Shelly.getComponentStatus("sys").uptime || 0;
let pressDuration = pressEnd - pressStart;
print("🔁 Taste losgelassen (Dauer:", pressDuration, "Sekunden)");
if (pressDuration >= 2) {
cancelLight();
} else {
if (duration === 0) {
startLight();
} else {
extendTime();
}
}
}
}
});
Alles anzeigen
Das Script kann frei verwendet und angepasst werden. Es ist hier nur Für das Relais 0 aktiv, kann aber jederzeit erweitert werden um z.B. das Hoflich analog zum Treppenhauslicht zu steuern.
Verbesserungsvorschläge oder auch abgewandelte Funktionen können hier gerne diskutiert werden.