MichaelGo
das ist simpel, das Script läuft nur wenn der Stecker über den Button eingeschaltet ist und "Last" anliegt, also geladen wird. Also Einstecken und dann den Button drücken.
Geht aber natürlich auch per App. Der Shelly Plug S ist dafür ideal, geht aber sicher auch mit anderen Shelly Relais, wo man ein Script laufen lassen kann.
Ich habe eben noch ein Mod gemacht, und zwar sollte nach jedem 20. Laden ein Balancing gemacht werden, also voll geladen werden und das Ladegerät nicht abgeschaltet werden. Macht natürlich nur sinn wenn man immer nur das gleiche Gerät pro Stecker hat,
Code
let SAMPLE_INTERVAL = 10; // Sekunden
let SAMPLE_COUNT = 30; // ~5 Min
let DROP_THRESHOLD = 0.20; // 20% Abfall
let DROP_DURATION = 60; // 60 Sekunden Abfall
let MIN_ACTIVE_POWER = 5; // W – Erkennung ob Akku angeschlossen
let BALANCING_COUNT = 20; // Nach wievielen Zyklen wird 100% geladen und nicht abgeschaltet?
let powerSamples = [];
let dropStartTime = null;
let chargeCount = 0;
let storageReady = false;
// Ladezähler beim Start laden
Shelly.call("Storage.Get", { key: "chargeCount" }, function (res) {
if (res && res.value) {
chargeCount = JSON.parse(res.value);
print("🔄 Ladezyklen bisher:", chargeCount);
} else {
chargeCount = 0;
}
storageReady = true;
});
Timer.set(SAMPLE_INTERVAL * 1000, true, function () {
if (!storageReady) return; // warte, bis Speicher geladen ist
let status = Shelly.getComponentStatus("switch:0");
let uptime = Shelly.getComponentStatus("sys").uptime;
if (!status.output || status.apower < MIN_ACTIVE_POWER) {
powerSamples = [];
dropStartTime = null;
print("🔌 Kein Akku angeschlossen oder kein Stromfluss – Script pausiert.");
return;
}
let power = status.apower;
let current = status.current;
powerSamples.push(power);
if (powerSamples.length > SAMPLE_COUNT) {
for (let i = 0; i < powerSamples.length - 1; i++) {
powerSamples[i] = powerSamples[i + 1];
}
powerSamples.length = powerSamples.length - 1;
}
let sum = 0;
for (let i = 0; i < powerSamples.length; i++) {
sum += powerSamples[i];
}
let avgPower = sum / powerSamples.length;
if (power < avgPower * (1 - DROP_THRESHOLD)) {
if (dropStartTime === null) {
dropStartTime = uptime;
} else if ((uptime - dropStartTime) >= DROP_DURATION) {
let isBalancingCycle = ((chargeCount + 1) % BALANCING_COUNT === 0);
if (isBalancingCycle) {
print("🧭 Balancing-Zyklus (Nr. " + (chargeCount + 1) + ") – Steckdose bleibt an.");
} else {
print("⚡ Ladeende erkannt – Steckdose wird ausgeschaltet.");
Shelly.call("Switch.Set", { id: 0, on: false });
}
// Ladezähler erhöhen und speichern
chargeCount++;
Shelly.call("Storage.Set", { key: "chargeCount", value: JSON.stringify(chargeCount) });
dropStartTime = null;
}
} else {
dropStartTime = null;
}
print("Leistung: " + power.toFixed(1) + " W | Strom: " + current.toFixed(2) + " A | Ø: " + avgPower.toFixed(1) + " W | Zyklus: " + (chargeCount + 1));
});
Alles anzeigen