doch, das ist einfacht:
function turnoff()
{
Shelly.call("switch.set",{ id: 0, on: false},function (result, code, msg, ud) {},null);
Timer.clear(mytimer);
}
mytimer = Timer.set(15*60*1000, true, function () {
turnoff();
});
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
doch, das ist einfacht:
function turnoff()
{
Shelly.call("switch.set",{ id: 0, on: false},function (result, code, msg, ud) {},null);
Timer.clear(mytimer);
}
mytimer = Timer.set(15*60*1000, true, function () {
turnoff();
});
Servus zusammen - ich seh vermutlich vor lauter Wald die Bäume nicht...
Shelly Plus2pm
Ziel
- start mit "ON after power on"
- warten für 10 minuten - abschalten (wenn an)
- fertig
und das alles unabhängig ob zwischenzeitlich der Status geändert wurde, und auch nicht den Timer neu starten, wenn power on gesetzt wird.
Wirklich nur nach reboot. (damit scheiden schedules leider aus)
Das riecht nach drei Zeilen und ich denk mir gerade einen Knoten.
Hat jemand einen Tipp bitte?
Vielen Dank
Lieber Devil,
erst mal vielen Dank für Deine Antwort.
Fühltest Du Dich "angeschrien", entschuldige, dies war nicht meine Absicht.
Gerne würde ich zur ursprünglichen Frage zurückkehren: Welche Fehler werden durch die Umstellung von 6 auf 12stellige ID behoben?
Nutzt du die Cloud?
klares NEIN
Servus,
Hier im Forum lese ich oft den Rat, die alten Shellies mit 6 stelliger ID auf 12 Stellen umzustellen.
Ich hab einen Satz dieser Teile im Einsatz, die laufen wie erwartet, und ich scheue den Aufwand der NEU-Konfiguration...
Was für Probleme beruhen (oder können eben beruhen) auf besagter 6 stelligen ID?
Oder "so lange keine Probleme besteht kein Grund zur Änderung..." ![]()
Vielen Dank
Servus Shellisten und Shelly-Süchtige
Bei mir geht der Shelly-Counter gerade durch die 20 und ich beginne Admin-Fragen rund um die Verwaltung zu stellen.
Ich suche nach einer Lösung für:
- zentrales Konfigurations Backup (automatisiert?), Versionierung, Rollout
- Push von Settings auf alle shellies (e.g. neuer SNTP server, neue SSID und PWD, etc)
- Push von Konfig eines Shellies auf einen neuen (weil der alte abgeraucht ist)
- Zentrale Anzeige von Firmwarestand und ob neue FW verfügbar
- script repo incl Versionierung der eingesetzten Scripte
- ...
Ich denke es wird klar, ich suche die Eierlegendewollmilchsau, die mir hilft, den Zoo zu bändigen.
Einzelne Tools bieten bereits lösungen für einzelnes (e.g. ShellyScan).
Hier im Forum lese ich von Usern die hunderte von Shellies am laufen haben - bitte wie macht Ihr das?
Erfahrungen? Ratschläge? Tipps? ![]()
Herzlichen Dank ![]()
hier mal mein aktueller Stand - ANFÄNGER level - freu mich über feedback, das geht sicher auch einfacher...
let state=0;
// 0 - starup, waiting for normal input
// 1 - light on - waiting for auto off
// 2 - flashing for auto off
// 3 - flashing for permanent on
// 4 - permanent on
let CONFIG = {
defaultTickerDelay : 0.500, // secs for checking state
defaultTimeout : 30, // seconds for auto off
defaultFlashCounter : 3, // how often to flash
defaultFlashTime : 4.500, // secs between flashes
defaultFlashOffTime : 0.500, // secs in off during flashing
defaultLongPressTime : 1.500, // secs to keep button pressed for permanent on
};
let tickerHandle = 0;
let buttonHandle = 0;
let btn_down_ts = 0; // time of last btn_down
let switch_on_ts = 0; // ts for last light on
let switchState = false;
let next_on_ts = 0;
let next_off_ts = 0;
let debug = false; // TRUE for print to console, false by default
function RelaySet(state)
{
Shelly.call("switch.set",{ id: 0, on: state},function (result, code, msg, ud) {},null);
switchState = state;
}
function Check(event){
let info = event.info;
if (debug) { print(JSON.stringify(info));}
if (info.component === "switch:0" && info.state !== undefined)
{
switchState = info.state;
}
if (info.component === "input:0")
{
if (info.event === "btn_down")
{
btn_down_ts = info.ts;
buttonHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,checkButton,info.ts + CONFIG.defaultTickerDelay);
if (debug) { print ("button down now: ", info.ts); }
}
else if (info.event === "btn_up")
{
Timer.clear(buttonHandle); // stop buttonChecker
let btn_down_duration = info.ts - btn_down_ts;
if (debug) { print ("button down duration ", btn_down_duration , " ( ", info.ts, " - ", btn_down_ts, " )");}
if (state === 0)
{ // turn light on and activate auto off
state = 1;
if (debug) { print ("State set to 1");}
RelaySet(true);
switch_on_ts = info.ts;
tickerHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,tick,info.ts +CONFIG.defaultTickerDelay );
}
else if (state === 1)
{ // light is normal on - normal off
state = 0;
if (debug) { print ("State set to 0"); }
RelaySet(false);
Timer.clear(tickerHandle); // stop ticker
}
else if (state === 2)
{ // was blinking - back to normal on
Timer.clear(tickerHandle); // stop ticker
state = 1;
if (debug) { print ("State set from 2 back to 1"); }
switch_on_ts = info.ts;
RelaySet(true);
tickerHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,tick,info.ts + CONFIG.defaultTickerDelay);
}
else if (state === 3)
{ // on the way to perm on - ignore
if (debug) { print ("late release 1"); }
}
else if (state === 4)
{ // was perm on - back to off
if (btn_down_duration > CONFIG.defaultLongPressTime)
{ // still during switching on - ignore
if (debug) { print ("late release 2"); }
} else {
Timer.clear(tickerHandle); // stop ticker
state = 0;
if (debug) { print ("State set from 4 back to 0"); }
RelaySet(false);
}
}
}
}
}
function checkButton (ts)
{
if (debug) { print("checkButton ", ts); }
let btn_down_duration = ts - btn_down_ts;
if (debug) { print ("Button down for ", btn_down_duration , " ( ", ts, " - ", btn_down_ts, " )"); }
if (btn_down_duration > CONFIG.defaultLongPressTime)
{
if (debug) { print ("Long press detected"); }
state = 3;
if (debug) { print ("State set to 3"); }
RelaySet(true);
next_off_ts = ts + CONFIG.defaultFlashOffTime;
tickerHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,tick,ts + CONFIG.defaultTickerDelay); // ticker will handle rest
} else
{
buttonHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,checkButton,ts + CONFIG.defaultTickerDelay); // restart timer on new ts
}
}
function tick(ts)
{
if (debug) { print("tick ", ts); }
tickerHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,tick,ts + CONFIG.defaultTickerDelay); // restart timer on new ts
let switch_on_duration = (ts - switch_on_ts);
if (state === 1 ) // waiting for timed off
{
if (debug) { print ("switch_on_duration ",switch_on_duration); }
if (switch_on_duration > CONFIG.defaultTimeout - CONFIG.defaultFlashCounter * (CONFIG.defaultFlashTime + CONFIG.defaultFlashOffTime) )
{
state=2; // start flashing
if (debug) { print ("State set to 2"); }
RelaySet(false);
next_on_ts = ts + CONFIG.defaultFlashOffTime;
}
} else if (state === 2) // blinking
{
if (switch_on_duration > CONFIG.defaultTimeout) // enough - off now
{
state=0;
if (debug) { print ("State set to 0"); }
RelaySet(false);
Timer.clear(tickerHandle);
} else if ((switchState === false) && (next_on_ts < ts))
{
RelaySet(true);
next_off_ts = ts + CONFIG.defaultFlashTime;
} else if (switchState === true && next_off_ts < ts)
{
RelaySet(false);
next_on_ts = ts + CONFIG.defaultFlashOffTime;
}
if (debug) { print ("next on ", next_on_ts, " next off ", next_off_ts); }
} else if (state === 3) // blinking for perm on
{
if (switchState === true && next_off_ts < ts)
{
RelaySet(false);
next_on_ts = ts + CONFIG.defaultFlashOffTime;
} else if ((switchState === false) && (next_on_ts < ts))
{
RelaySet(true);
state=4;
if (debug) { print ("State set to 4"); }
Timer.clear(tickerHandle); // ticker job done
}
}
}
Shelly.addEventHandler(Check);
Alles anzeigen
Hab mir ein Script zum Reboot vom Shelly gebaut, was nach 20sec Button down arbeitet.
Anfänger Scripting - bin für jedes Feedback offen, geht sicher einfacher... ![]()
Vielleicht hilfts noch wem...
let CONFIG = {
defaultTickerDelay : 0.500, // secs for checking state
defaultLongPressTime : 20.000 // secs before reboot
};
let debug = true; // TRUE for print to console, false by default
let btn_down_ts = 0;
let buttonHandle = 0;
function checkButton (ts)
{
if (debug) { print("checkButton ", ts); }
let btn_down_duration = ts - btn_down_ts;
if (debug) { print ("Button down for ", btn_down_duration , " ( ", ts, " - ", btn_down_ts, " )"); }
if (btn_down_duration > CONFIG.defaultLongPressTime)
{
if (debug) { print ("Long press detected - REBOOT"); }
Shelly.call("Shelly.Reboot", null, null);
} else
{
buttonHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,checkButton,ts + CONFIG.defaultTickerDelay); // restart timer on new ts
}
}
function Check(event){
let info = event.info;
if (debug) { print(JSON.stringify(info));}
if (info.component === "input:0")
{
if (info.event === "btn_up")
{
if (buttonHandle !== 0) {Timer.clear(buttonHandle);}
}
else if (info.event === "btn_down")
{
btn_down_ts = info.ts;
buttonHandle = Timer.set(CONFIG.defaultTickerDelay*1000,false,checkButton,info.ts + CONFIG.defaultTickerDelay);
if (debug) { print ("button down now: ", info.ts); }
}
}
}
Shelly.addEventHandler(Check);
Alles anzeigen
oh - sorry, das board hatte mir für Deinen Update leider kein email geschickt und ich habe erst jetzt nachgesehen.
Dein Script läuft und ist super easy im coding - danke dafür.
Mal sehen, ob ich die beiden verheiratet bekomme
Herzlichen Dank für den hilfreichen Hinweis - genau auf diesem Script baue ich meine Änderungen auf...
Und wie im Subject zu lesen suchte ich kein Treppenhaus Script sondern hatte die Frage nach einem Sleep oder ob alles asynchron gemacht werden muss, ich versuche die Methodik zu verstehen.
dann geh ich mal wieder eine Runde in den Denkteich und lerne ... VIELEN DANK für Nachhilfe!
Letzte Frage: kann ich per script einen Shelly.Reboot auslösen?
nein, nicht ganz; Ich versuche mir eine eltako Funktionalität nachzubasteln, vieles davon habe ich (mit Nachhilfe aus dem Forum - danke dafür) schon hinbekommen...
Ziel-Setup:
ShortPush: AN und nach Timer Ablauf AUS
Bevor der Timer ausmacht blinken - dann AUS
Short push bei AN -> AUS
Short push bei Blinken -> Restart des Timers
=> Das kann die Treppenhaussteuerrung auf die ich hingewiesen wurde perfekt!
Long Push: An-Aus-DauerAN, AutoAus-Timer deaktiviert
Long Push oder Short Push bei DauerAn: AUS und generelles AutoAus wieder einschalten
Generell kann ich das schon - allerdings scheitere ich gerade an der Signalisierung für erkannten LongPush und resultierendes DauerAn.
Und daher die Frage ![]()
oh Freude - das klingt einfach - bin schon am testen und weiter lernen...
Mein Ziel ist noch nicht ganz erreichbar - jetzt muss ich ausholen:
Shelly schaltet Lampe, Stromstoß EIN, auto AUS nach Zeit - das ist einfach und klappt.
In LongPush soll DAUER AN schalten - und das mit An-Aus-DauerAn signalisieren.
Geht das auch "so einfach"?
Servus Shellisten,
bin noch neu auf der Scripting Ecke und kämpfe mich so langsam druch die Möglichkeiten...
Aktuelles Ziel: auf einen LongPush eine ConfigÄnderung (das bekomme ich hin
) und asls Quittung Lampe 1sec anschalten.
Und da hakt es. Ich darchte freisprachlich an "switch(on); sleep(60); switch(off);" - aber ich finde kein "sleep"
...
MUSS ich alles über timer und callbacks machen? Was ist best practice in so einem Falle und warum?
Vielen Dank für Nachhilfe
ja verstehe - dann muss ich (mal wieder) eine Dose tiefer legen, da hab ich notorisch Platzmangel und bringe keinen Shelly hinter die Schalter...
Danke für Aufklärung
ja perfekt - warum hab ich das nicht gefunden???
Herzlichen Dank für Hilfe
Bulb mit Adapter wird leider zu lang, GU10 strahlt leider in die falsche Richtung....
grmbl...
Ich "spiele" ungern an 230v... und wollte daher einen Schalterschluss / Tastendruck simulieren.
OK, dann richtiger Testaufbau...
(Spielen: offene Kabelenden und Tasten per Kabelende an Kontakt halten - neinneinnein aber halt einfach...
Testaufbau: Vorgegebene Kabel, Schalter, alles fein an der Schalttafel, eigene Sicherung, am besten eigener FI ... SICHER aber halt Arbeit...)
Auch wenn ich den Zusammenhang nicht verstehe, der Raum hat 5qm, eine Türe und wird 4 mal täglich betreten.
Mein Ziel ist NICHT, die vorzeitige Abschaltung zu erstetzen (sagte ich das?).
Mein Ziel ist NICHT, den Eltako zu lassen.
=> ich suche nach einer Möglichkeit, die derzeitige Eltako-Funktionalität mittels Shelly nachzubilden