Guten Abend,
ich habe schon seit mehreren Monaten dieses Problem und bekomme es nicht in den Griff. Hoffe hier kann mir wer helfen.
Ich betreibe im Haus einige Shelly Plug S, die ich per JavaScript in verschiedenen Intervallen Schalte. Leider passiert dies nicht zuverlässig (entsprechende Teil vom Script ist unten).
Als Beispiel für ein Shelly, dieser soll 30 Minuten eingeschaltet und 60 Minuten ausgeschaltet sein (Relais versteht sich). Ich überprüfe jede Minute, wann das Relais zuletzt den Zustand geändert hat, wenn größer, dann schalte. Das funktioniert auch, aber irgendwann nicht mehr. Im Log steht dann, dass der Shellie an ist, und die letzte State Änderung vor 70 Minuten war (manchmal auch > 1000). Ich erhalte vom Shelly jedoch weiterhin Daten über die aktuelle Leistung. Auch das eigene Web Panel vom Shelly ist erreichbar. Also sie sind im Netz. Eingebunden sind sie über den MQTT Adapter. Testweise habe ich auf einen Shelly Tasmota geflasht, leider mit dem gleichen Problem. Es ist auch nicht ein spezifischer Shelly, sondern kann bei allen passieren zu unterschiedlichen Zeitpunkten. Testweise hab ich dann probiert, per eigenen Shelly/Tasmota Web Oberfläche zu schalten, dass geht dann. Auch über die http API den Toggle Befehl senden geht auch. Der Shelly schaltet dann auch wieder einige Zeit "zuverlässig". Wenn ich in ioBroker in die Objekten gehe, und dort den Wert setze, scheint das auch manchmal zu funktionieren und manchmal nicht.
schedule("0 */1 * * * *",
function() {
for (const key in shellies) {
let timeCtlEnabled = getState(`${path_main}.${key}.timeCtlEnabled`).val;
let online = getState(`${path_main}.${key}.online`).val;
if (timeCtlEnabled && online) {
let onTime = getState(`${path_main}.${key}.onTime`).val;
let offTime = getState(`${path_main}.${key}.offTime`).val;
let relayState = getState(shellies[key].relayPath).val;
let lc = getState(shellies[key].relayPath).lc;
let lastStateChange = Math.round((Date.now() - lc)/1000/60);
log(`[${key}] Relay is ${relayState} and last state change was ${lastStateChange} min ago..`)
setState(`${path_main}.${key}.lastChange`, lastStateChange);
if (relayState == "on" && (lastStateChange > onTime)) {
setState(shellies[key].relayPath + ".command", "off");
} else if (relayState == "off" && (lastStateChange > offTime)) {
setState(shellies[key].relayPath + ".command", "on");
}
}
}
}
);