1 mal Drücken = kurze Ausschalt Zeit.
schnell 2 mal Drücken = lange Ausschalt Zeit.
Cloud/App(virtuell) Drücken = cloud Ausschalt Zeit.
Das Skript ermöglicht einem auch mit einem Schalter mehrere Timer zu nutzen. Es zählt die Schaltvorgänge, von schnellen Schaltungen und ermöglicht anhand der Schaltvorgang verschieden Timer zu schalten.
Ist der Zeitrum zwischen 2 Schaltvorgängen zu groß, wird das Relay einfach nur ausgeschaltet, man erhält also 2 Automatische-Ausschalt-Timer sowie die Möglichkeit das Licht trotzdem vorher auszuschalten.
Unter erfassungZeit kann man in Sekunden einstellen wie lange weitere Schaltvorgänge ausgewertet werden.
2 schnelle Schaltvorgänge, setzt den langen Timer, nur 1 Anschaltvorgang setzt den kurzen Timer und ab 3 schnellen Schaltvorgang wird das Licht einfach ausgemacht, auch mit weniger Vorgänge wird das Licht ausgeschaltet wenn zuviel Zeit (erfassungsZeit überschritten) zwischen den Schaltvorgängen war.
Es gibt auch eine cloudZeit, hier kann man einen Ausschalt Timer einstellen der nur für Cloud/App Schaltvorgänge gültig ist. Eventuell erstelle ich später noch eine 2. Version des Skripts, welche über schnelle Cloud/App Schaltvorgänge ebenfalls 2 Timer ermöglicht, doch bei der Auswertung der Cloud/App Schaltvorgänge werde ich ein flackern des Lichts nicht verhindern können. Deswegen habe ich mich vorerst für den separaten Cloud Timer entschieden.
(Ähnlich einem Cycle Switch nur das es sich auf zwei Ausschalt Timer beschränkt und nicht die Taster Inputs sondern die Umschaltvorgänge am Schalter Zählt.).
let kurzeZeit = 30; //Verzögerung in Sekunden
let langeZeit = 60; //Verzögerung in Sekunden
let cloudZeit = 60; //Verzögerung in Sekunden
let erfassungZeit = 1; //Zeit in Sekunde die das Skript auf Schaltvorgänge wartet
let cID = 0; //Shelly Channel ID/Relay/Input
let cMode = "detached"; //Shelly Channel/Relay Modus "detached"/"flip"/"momentary"/"follow"
let cType = "switch"; //Shelly Channel/Input Typ, "button"/"switch"
let status = Shelly.getComponentStatus("switch:" + JSON.stringify(cID)).output, t1 = null, tsAkt = 0, tsOld = 0, tsDiff = 0, schaltVorgang = 0;
//Prüfen der Input/Output Einstellung
if (Shelly.getComponentConfig("switch:" + JSON.stringify(cID)).initial_state === "match_input") { Shelly.call("Switch.SetConfig", { id: cID, config: { initial_state: "restore_last" } }); print("Invalid inital_state!, changed switch:id", cID, " inital_state to restore_last"); }
if (Shelly.getComponentConfig("switch:" + JSON.stringify(cID)).in_mode !== cMode) { Shelly.call("Switch.SetConfig", { id: cID, config: { in_mode: cMode } }); print("Invalid Output Mode!, changed switch:id", cID, " in_mode to ", cMode); }
if (Shelly.getComponentConfig("input:" + JSON.stringify(cID)).type !== cType) { Shelly.call("Input.SetConfig", { id: cID, config: { type: cType } }); print("Invalid input type!, changed input:id", cID, " type to", cType); }
//Skript Timer Logik
function Timer1() { Shelly.call("Switch.Set", { id: cID, on: false }); }
//Skript Main Logik
function Check(event) {
if ((event.delta.output === true && event.delta.id === cID && event.component === "switch:" + JSON.stringify(cID)) || (event.delta.output === false && event.delta.id === cID && event.component === "switch:" + JSON.stringify(cID))) {
status = event.delta.output;
if (event.delta.source === "SHC" || event.delta.source === "WS_in" || event.delta.source === "HTTP"){
Timer.clear(t1);
tsOld = 0;
schaltVorgang = 0;
if (status === true) { t1 = Timer.set(1000 * cloudZeit, false, Timer1);print("Starte Timer cloud");}
}
}
if ((event.delta.state === true && event.delta.id === cID && event.component === "input:" + JSON.stringify(cID)) || (event.delta.state === false && event.delta.id === cID && event.component === "input:" + JSON.stringify(cID))) {
tsAkt = Shelly.getComponentStatus("sys").uptime;
tsDiff = tsAkt - tsOld;
if (tsDiff > erfassungZeit) {
schaltVorgang = 0;
}
if (schaltVorgang === 0 && status === false) {
Shelly.call("Switch.Set", { id: cID, on: true });
Timer.clear(t1);
schaltVorgang++;
t1 = Timer.set(1000 * kurzeZeit, false, Timer1);
print("Starte Timer kurz");
}
if ((tsDiff >= 0) && (tsDiff < (erfassungZeit + 1)) && (schaltVorgang >= 1)) {
schaltVorgang++;
}
if (schaltVorgang > 1) {
Timer.clear(t1);
t1 = Timer.set(1000 * langeZeit, false, Timer1);
print("Starte Timer long");
}
tsOld = tsAkt;
if (status === true && schaltVorgang === 0 || status === true && schaltVorgang > 2) {
Shelly.call("Switch.Set", { id: cID, on: false });
Timer.clear(t1);
tsOld = 0;
schaltVorgang = 0;
print("Triggerd off");
}
}
return true;
}
//Skript Trigger
Shelly.addStatusHandler(Check);
Alles anzeigen
Das Skript steht unter der "mir völlig egal, was ihr damit macht" Lizenz auch bekannt als MIT-Lizenz, habt Spaß damit!