thdoerr
Ich dachte noch einmal über das Skript nach und favorisiere folgende relativ einfache Implementation. Dabei setze ich voraus, dass die Durchführung auf den Gruppenmitgliedern gerne auch um jeweils bspw. 1s versetzt erfolgen darf.
Das Skript kann mit wenig Aufwand noch vielseitiger verwendbar gestaltet werden. Hier ist die Anzahl an Gruppenmitgliedern bereits nur durch die interne Speicherkapazität begrenzt. Das Ganze ohne Warteschlange, aber robust, weil die Aktionen zeitversetzt genutzt werden. Ungetestet, aber wegen Einfachheit vermutlich so lauffähig.
Wenn in einer Button 1 Action ein Namensfehler, bspw. statt "to_all" als Funktionsname "toall" eingetragen ist, wird das Skript leider gestoppt. Das liegt nicht am Skript sondern an der Firmware bzw. der verwendeten Methode "Script.Eval". Es ginge auch robuster ohne Skriptstop, im Fehlerfall nur mit Nichtausführung des Gewünschten, das macht aber das Skript etwas komplexer.
// ---------------- Auf eigene Umgebung anpassen! -----------------
let Members = [ // Liste/Datenfeld aus den IP Adressen aller Gruppenmitglieder.
"127.0.0.1", // für sich selbst
"172.16.7.1", // oder so
"172.16.7.2",
// weitere Mitglieder IP Adressen
];
let Period = 1000; // zeitlicher Abstandswert von Aktion zu Aktion in Millisekunden, damit darf experimentiert werden.
// -------------- Ab hier keine Änderungen vornehmen! --------------
let Th, What, Index;
function act() {
if(Index >= Members.length) Timer.clear(Th);
else {
Shelly.call("http.get", {url:"http://" + Members[Index] + "/rpc/" + What + "?id=0"});
++Index;
}
}
function to_all(doThis) {
Index = 0;
What = doThis;
Th = Timer.set(Period, true, act);
}
Alles anzeigen
Wenn mit dem Period Wert experimentiert werden will, dann nur soweit verkleinern, bis das Skript mit Fehlermeldung abbricht. Danach vorsichtshalber den letzten Period Wert verdoppeln - fertig.
Die im Button 1 zu jedem spezifischen Tastendruck einzutragende Actions:
(Hier mit vorausgesetzter Skript ID von 1, was mit dem ersten Skript immer der Fall ist.)
zum öffnen
http://<IP Adresse des Skript Shelly>/rpc/script.eval?id=1&code="to_all(cover.open)"
zum schließen
http://<IP Adresse des Skript Shelly>/rpc/script.eval?id=1&code="to_all(cover.close)"
zum anhalten
http://<IP Adresse des Skript Shelly>/rpc/script.eval?id=1&code="to_all(cover.stop)"
Zum fahren auf eine Position müsste das Skript ein wenig umgestaltet werden.
Falls du es einsetzt, viel Erfolg damit und Freude daran!