// ====================================================== // Shelly Plug M Gen3 // Ladeüberwachung mit automatischer Abschaltung // // Funktionen: // - startet automatisch nach Shelly-Start // - erkennt Einschalten des Ausgangs // - misst verbrauchte Wh // - misst aktuelle Leistung und Strom // - schaltet AUS bei: // -> 500 Wh erreicht // -> Leistung länger als 10 s unter 5 W // - umfangreiche Debug-Ausgaben // ====================================================== let LIMIT_WH = 500; let MIN_POWER_W = 5; let CHECK_INTERVAL_MS = 5000; let LOW_POWER_CONFIRM_SEC = 30; let monitoring = false; let startEnergyWh = null; let lowPowerSince = null; let lastOutputState = null; console.log("================================================"); console.log("SCRIPT START"); console.log("Ladeüberwachung aktiv"); console.log("Limit: " + LIMIT_WH + " Wh"); console.log("Minimale Leistung: " + MIN_POWER_W + " W"); console.log("Check Intervall: " + CHECK_INTERVAL_MS + " ms"); console.log("================================================"); // ====================================================== // Start einer neuen Ladeüberwachung // ====================================================== function startMonitoring(status) { startEnergyWh = status.aenergy.total; lowPowerSince = null; monitoring = true; console.log("----------------------------------------"); console.log("NEUE LADUNG ERKANNT"); console.log("Start Energiezähler: " + startEnergyWh + " Wh"); console.log("Start Leistung: " + status.apower + " W"); console.log("Start Strom: " + status.current + " A"); console.log("----------------------------------------"); } // ====================================================== // Überwachung stoppen // ====================================================== function stopMonitoring(reason) { monitoring = false; lowPowerSince = null; console.log("----------------------------------------"); console.log("ÜBERWACHUNG GESTOPPT"); console.log("Grund: " + reason); console.log("----------------------------------------"); } // ====================================================== // Shelly ausschalten // ====================================================== function switchOff(reason) { console.log("########################################"); console.log("ABSCHALTUNG AUSGELÖST"); console.log("Grund: " + reason); console.log("########################################"); Shelly.call( "Switch.Set", { id: 0, on: false }, function (result, error_code, error_message) { if (error_code !== 0) { console.log("FEHLER beim Ausschalten:"); console.log(error_message); return; } console.log("Shelly erfolgreich ausgeschaltet"); stopMonitoring(reason); } ); } // ====================================================== // Hauptprüfung // ====================================================== function checkStatus() { console.log(""); console.log("=== Statusprüfung ==="); Shelly.call( "Switch.GetStatus", { id: 0 }, function (status, error_code, error_message) { // ------------------------------------ // Fehlerbehandlung // ------------------------------------ if (error_code !== 0) { console.log("FEHLER bei Switch.GetStatus:"); console.log(error_message); return; } // ------------------------------------ // Werte auslesen // ------------------------------------ let output = status.output; let power = status.apower; let current = status.current; let voltage = status.voltage; let totalEnergyWh = status.aenergy.total; // ------------------------------------ // Rohdaten ausgeben // ------------------------------------ console.log("Output: " + output); console.log("Leistung: " + power + " W"); console.log("Strom: " + current + " A"); console.log("Spannung: " + voltage + " V"); console.log("Gesamtenergie: " + totalEnergyWh + " Wh"); // ------------------------------------ // Zustandsänderung erkennen // ------------------------------------ if (lastOutputState !== output) { console.log("Schaltzustand geändert:"); console.log("ALT: " + lastOutputState); console.log("NEU: " + output); lastOutputState = output; } // ------------------------------------ // Ausgang eingeschaltet // -> neue Überwachung starten // ------------------------------------ if (output === true && monitoring === false) { console.log("Ausgang wurde eingeschaltet"); startMonitoring(status); } // ------------------------------------ // Ausgang ausgeschaltet // ------------------------------------ if (output === false) { console.log("Ausgang ist AUS"); if (monitoring === true) { stopMonitoring("Manuell ausgeschaltet"); } return; } // ------------------------------------ // Noch keine aktive Überwachung // ------------------------------------ if (monitoring === false) { console.log("Noch keine aktive Überwachung"); return; } // ------------------------------------ // Verbrauch berechnen // ------------------------------------ let usedWh = totalEnergyWh - startEnergyWh; console.log("----------------------------------------"); console.log("VERBRAUCH SEIT START:"); console.log(usedWh.toFixed(2) + " Wh"); console.log("----------------------------------------"); // ------------------------------------ // Abschalten bei 500 Wh // ------------------------------------ if (usedWh >= LIMIT_WH) { console.log("Wh LIMIT ERREICHT"); switchOff( "500 Wh erreicht (" + usedWh.toFixed(2) + " Wh)" ); return; } // ------------------------------------ // Abschalten bei geringer Leistung // ------------------------------------ if (power < MIN_POWER_W) { console.log( "Leistung unter " + MIN_POWER_W + " W erkannt" ); if (lowPowerSince === null) { lowPowerSince = Date.now(); console.log( "Low-Power-Timer gestartet" ); } let lowPowerDuration = (Date.now() - lowPowerSince) / 1000; console.log( "Unter Schwelle seit: " + lowPowerDuration.toFixed(1) + " s" ); if (lowPowerDuration >= LOW_POWER_CONFIRM_SEC) { console.log( "Low-Power-Abschaltung wird ausgelöst" ); switchOff( "Leistung unter " + MIN_POWER_W + " W für " + LOW_POWER_CONFIRM_SEC + " Sekunden" ); return; } } else { // -------------------------------- // Leistung wieder normal // -------------------------------- if (lowPowerSince !== null) { console.log( "Leistung wieder über Schwelle" ); console.log( "Low-Power-Timer zurückgesetzt" ); } lowPowerSince = null; } } ); } // ====================================================== // Zyklische Prüfung starten // ====================================================== console.log("Timer wird gestartet"); Timer.set( CHECK_INTERVAL_MS, true, checkStatus ); console.log("SCRIPT INITIALISIERT"); console.log("Warte auf Einschalten des Ausgangs");