Ich nutze gerne kürzere, übersichtlichere Skripte, wenn möglich. Hier (ungetestet) sollte dies per zusätzlichem Parameter id gelingen. Vielleicht magst du diese Anregung gelegentlich nutzen. Es geht ausschließlich um die Einsparung der beiden Funktionen getSwitchStatus2() und updateSwitchStatus2().
JavaScript
const shelly2_ip = "192.168.120.161";
let switch_status = [false, false]; // Datenfeld mit Indexen 0 und 1
// Funktion, um den Status des Schalters abzurufen
function getSwitchStatus(id, callback) {
Shelly.call("HTTP.GET",{url: "http://" + shelly2_ip + "/rpc/Switch.GetStatus?id=" + id,},
function(result, errc, errm, id) { // errc, errm müssen eingefügt werden, damit die id importiert wird, s.u.
try {
let response = JSON.parse(result.body);
callback(id, response);
} catch (e) {
print("Fehler beim Parsen der Antwort:", e.message);
callback(id, null);
}
}, id // muss als user defined parameter übergeben werden
);
}
// Funktion zum Aktualisieren des Schalterstatus
function updateSwitchStatus(id) {
getSwitchStatus(id, function(id, status) {
if (status !== null) {
switch_status[id] = status.output;
print("Netzspannung" + (id+1) + ":", switch_status[id] ? "Eingeschaltet" : "Ausgeschaltet");
} else {
print("Fehler beim Abrufen des Schalterstatus Netzspannung" + (id+1) + ".");
}
});
}
// Funktion zur Steuerung des Relais
function setRelayState(state) {
Shelly.call("Switch.Set", { id: 0, on: state}, function(result, error_code, error_message) {
if (error_code !== 0) {
print("Fehler beim Schalten des Relais Starkstrom:", error_message);
} else {
print("Starkstrom:", state ? "Eingeschaltet" : "Ausgeschaltet");
}
});
}
// Funktion zur regelmäßigen Überprüfung der Intervallsteuerung
function startControl() {
// Setze eine Funktion zur regelmäßigen Überprüfung alle 10 Sekunden
Timer.set(10000, true, function() {
updateSwitchStatus(0); // Lese den Schalterstatus des Relais das den Solarkreislauf von Speicher auf Pool steuerert
updateSwitchStatus(1); // Lese den Schalterstatus des Relais das den Solarkreislauf von Speicher auf Pool steuerert
print("Das Netz wurde", switch_status[0] ? "auf Netzbetrieb" : "auf Akkubetrieb", "umgeschaltet");
setRelayState(switch_status[0] && switch_status[1]); // Aktualisiere den gewünschten Relaiszustand
});
}
// Starte Schleife
startControl();
Alles anzeigen
Da ich dies nicht getestet habe, hoffe ich auf Fehlerfreiheit.
Btw, das von dir verfasste Ausgangsskript erscheint mir im Ansatz durchaus gut gemacht, mit Ausnahme der UND Verknüpfung.
Im übrigen ist der Hinweis von towiat zur asynchronen Abarbeitung von Ereignis gesteuerten Shelly Skripten sehr bedeutsam. Diesen Hinweis solltest du verstehen und bedenken.
Hinweis: Ich habe das Skript in Zeile 24 korrigiert, am 2025-04-01 um 10:45 Uhr.