Ich habe mir dein Skript angeschaut:
setRelay() wird in einem Timer Callback aufgerufen. Innerhalb dieser Callback-Funktion nutzt du Variablen, die vorher/außerhalb gesetzt wurden. Diese werden nicht beim Aufruf "eingefroren", sprich sie haben wenn der Timer feuert den aktuellen Wert und nicht den Wert beim Erzeugen des Timers.
Daher ist i innerhalb der Callback-Funktion immer 4 - das ist der Wert am Ende des Schleifendurchlaufs. Damit ist die ip immer undefined.
Um das Problem zu lösen benötigt man den Parameter userdata, der Teil von Timer.set ist:
function applyRelayState(count) {
for (let i = 0; i < relay_ips.length; i++) {
let shouldBeOn = i < count;
Timer.set(i * relay_delay_step, false, function (userdata) {
setRelay(userdata.ip, userdata.shouldBeOn);
}, {"ip": relay_ips[i], "shouldBeOn": shouldBeOn});
}
last_confirmed_count = count;
pending_count = -1;
print(">> Number of active relays updated to: " + count);
}
Alles anzeigen
Bei Shelly.call gibt es auch noch eine Kleinigkeit, der Key id muss in Anführungszeichen:
Shelly.call("EM.GetStatus", { "id": 0 }, function (res)
Ich habe die Logik deines Skriptes nicht weiter analysiert, hoffe aber, das es entweder jetzt läuft oder du zumindest weiterkommst.