Das ist ein interessanter Ansatz, an den ich so noch nicht gedacht habe. Dabei würde nur 1 Gerät von einem Schalter oder Fernbedienung eingeschalten und schaltet dann das nächste dieses wieder das nächst usw.
Meine bisherigen Versuche waren von Gemini und ChatGPT, welcher aber nicht funktioniert:
Code
let timer = null; // Variable, um den Timer zu speichern
// Funktion, die das Relais einschaltet
function turnOn() {
// Überprüfen, ob das Relais bereits AN ist, um unnötige Befehle zu vermeiden
if (Shelly.get<ctrl62>
// Die Hauptfunktion, die auf einen eingehenden Status-Update-Befehl reagiert.
// Der Shelly verarbeitet Befehle als "Configured On" oder "Configured Off".
// Der Befehl kommt hier an, bevor das Relais tatsächlich geschaltet wird.
Shelly.addStatusHandler(function (status) {
// Stellen Sie sicher, dass wir auf das Hauptrelais des Plugs reagieren (Comp: "switch:0")
if (status.component === "switch:0") {
// **Bedingung für die Verzögerung:**
// Wir verzögern nur, wenn der *neue* Zustand "true" (AN) sein soll.
if (status.delta && status.delta.output === true) {
// Wenn bereits ein Timer läuft, diesen zuerst löschen, um
// eine Überlappung oder doppelte Auslösung zu verhindern.
if (timer) {
Timer.clear(timer);
print("Vorheriger Timer gelöscht.");
}
// Verhindert, dass der Shelly sofort einschaltet.
// Dies ist entscheidend, um die Steuerung zu übernehmen.
// **HINWEIS:** Der Shelly sollte so konfiguriert sein, dass
// er durch Scripteingriffe ausgeschaltet wird, wenn ein ON-Befehl kommt.
// In der Regel ist die Standard-Aktion des Shelly, den Befehl auszuführen.
// Wir *verzögern* das Einschalten, indem wir das Relais direkt über die
// Script-API steuern.
print("Einschaltbefehl empfangen. Verzögere um 1000ms.");
// Setzt einen Timer für die Verzögerung (1000 ms = 1 Sekunde)
timer = Timer.set(1000, false, turnOn);
// **Wichtig:** Da das Skript den Befehl verzögern soll, muss die **Standardaktion**
// des Shelly (sofortiges Einschalten) **überschrieben** werden.
// Der Shelly führt den Befehl nicht sofort aus, wenn ein Script registriert ist.
}
// Optional: Wenn ein Ausschaltbefehl kommt, sollte er sofort ausgeführt werden
else if (status.delta && status.delta.output === false) {
if (timer) {
Timer.clear(timer);
timer = null;
print("Ausschaltbefehl empfangen. Verzögerung abgebrochen.");
}
// Das Ausschalten sollte standardmäßig sofort passieren.
}
}
});
Alles anzeigen