Nachdem ich nun alle Beiträge dieses Threads las, versuche ich mal den Entwurf von ostfriese etwas zu beleuchten bzw. geringfügig zu korrigieren.
let Config = {
//############# comfig ##########################################################
scripts : ["skript1","skript2","skript3"],
wait_seconds : 10
//###############################################################################
};
function get_script_id(){ // Ich halte start_scripts() für passender.
Shelly.call("Script.List","",
function(result, error_code, error_message){
let a = result["scripts"];
for (let i=0; i<a.length; i++) {
for (let j=0; j<Config.scripts.length; j++) {
let name = Config.scripts[j];
if (a[i]["name"] === name) {
let script_id = a[i]["id"];
console.log("Script " + name + " start...");
Shelly.call("script.start", {"id":script_id});
// Die folgende Zeile muss am Ende der callback Funktion stehen, weil hier das Skript sofort gestoppt wird.
// Shelly.call("script.stop", {"id":Shelly.getCurrentScriptId()});
}
}
}
Shelly.call("script.stop", {"id":Shelly.getCurrentScriptId()});
}
);
};
let t = Timer.set(Config.wait_seconds,false,get_script_id);
Alles anzeigen
Problem:
Da die Ausführungen der RPC bzw. Shelly.call() asynchron ablaufen, erscheint mir die Reihenfolge der Skriptstarts nicht wie in Config.scripts aufgeführt sichergestellt.
Hier könnte ein Objekt "Start" Abhilfe schaffen, dessen Methode Start.next() per Timer wiederholt aufgerufen wird, bis alle Skripts (oder Skripte ;-)) gestartet wurden.
Ich täte ein anderes Verfahren bevorzugen:
Die letzte Anweisung von Skript1 startet per Timer Skript2, dessen letzte Anweisung per Timer Skript3 startet. Dazu ist kein zusätzliches Skript erforderlich.
Oder:
Für jedes Skript einen Schedule Job anlegen, welcher ein Skript startet. Diese Jobs sind zeitlich zu verzahnen bspw. "10 * * * * * ", "20 * * * * *", "30 * * * * *".
Entweder man lässt diese Jobs aktiv, wodurch die Skripte periodisch gestartet werden, oder jedes gestartete Skript disabled seinen Schedule Job.
Edit: Für letztere Variante wäre ein zusätzliches Skript erforderlich, welches nach einem reboot die drei Jobs enabled. Hm ...
Ich stelle allerdings auch gelegentlich fest, dass Shellies fast periodisch rebooten oder ein Skript gestoppt wird, obwohl dieselben Funktionen darin zuvor viele male fehlerfrei abgearbeitet wurden.
Hier gibt es offenbar in der Firmware noch Verbesserungsbedarf. Ich habe Stack Overflow oder/und Buffer Overflow in Verdacht ...