Gefunden auf E-Bike-Akku: Warum er altert und wie du die Lebensdauer verdoppelst › 🥇 Tests + Erfahrungen im Fahrrad Blog
Shelly Script, um E-Bike Akku-Ladung gezielt zu begrenzen und den Akku nicht unnötig bei vollem Ladestand altern zu lassen. Es schaltet die Steckdose automatisch ab, sobald der Akku einen Ladestand von etwa 80 bis 90 Prozent erreicht hat – und zwar unabhängig davon, wie voll er beim Anstecken war....... Wichtig: etwa alle 15 Ladungen einmal voll laden
Mehr Infos im obigen Link. E-Bike-Akku: Warum er altert und wie du die Lebensdauer verdoppelst.
Haftungsausschluss
Die Nutzung dieses Scripts erfolgt auf eigene Gefahr. Ich teile es, weil ich es selbst verwende, übernehme aber keinerlei Haftung für Schäden an Akku, Ladegerät, Steckdose oder sonstigem Eigentum, die aus der Nutzung entstehen könnten. Lade einen Akku grundsätzlich nur auf nicht brennbarem Untergrund, möglichst beaufsichtigt, und beachte immer die Vorgaben des Herstellers von Akku und Ladegerät. Im Zweifel oder bei einem äußerlich auffälligen Akku (geschwollen, beschädigt, ungewöhnlicher Geruch) gehört das Gerät in fachkundige Hände und nicht an die Steckdose.
// ================================================================
// Shelly Plug M Gen3 – Intelligente Akku-Ladebegrenzung (v2)
// ================================================================
// Schaltet ab, wenn der Ladestrom in der CV-Phase auf einen
// Bruchteil seines Spitzenwerts gefallen ist. Trifft dadurch
// jedes Mal etwa denselben Ladestand (~80–90%), egal wie voll
// der Akku gestartet ist.
// Zusaetzlich: Wh-Sicherheitslimit als Fallback.
// ================================================================
// ---------- EINSTELLUNGEN ----------
// Abschalten, wenn die Leistung auf diesen Anteil des Spitzenwerts faellt.
// 0.5 = bei 50% des Peaks. HOEHER = frueher aus = niedrigerer SoC.
// NIEDRIGER = spaeter aus = hoeherer SoC. Einmal kalibrieren (s. Anleitung).
let DROP_THRESHOLD = 0.5;
// Sicherheitslimit: spaetestens nach so vielen Wh aus der Steckdose
// wird abgeschaltet, falls die Stromabfall-Logik nie ausloest.
let SAFETY_MAX_WH = 500;
// Ab dieser Leistung (W) gilt der Ladevorgang als gestartet.
let MIN_CHARGE_W = 15;
// Erst nach so vielen geladenen Wh wird die Stromabfall-Logik scharf.
// Verhindert Fehlausloesung beim Einschwingen / fast vollem Start.
let ARM_AFTER_WH = 20;
// So viele Messungen in Folge muessen unter der Schwelle liegen,
// bevor abgeschaltet wird (Entprellung gegen kurze Schwankungen).
let CONSECUTIVE = 3;
// Pruefintervall in Millisekunden (10000 = alle 10 Sekunden).
let POLL_MS = 10000;
let LOG = true;
// ---------- AB HIER NICHTS AENDERN ----------
let charging = false;
let startEnergy = 0;
let peakPower = 0;
let belowCount = 0;
function reset() {
charging = false;
startEnergy = 0;
peakPower = 0;
belowCount = 0;
}
function shutdown(grund) {
Shelly.call("Switch.Set", { id: 0, on: false });
if (LOG) { print("Abschaltung:", grund); }
reset();
}
function check() {
let st = Shelly.getComponentStatus("switch:0");
if (st === undefined || st === null) { return; }
let on = st.output;
let power = st.apower;
let total = st.aenergy.total;
if (LOG) { print("Power = ", power); }
// Steckdose aus -> zuruecksetzen
if (on !== true) { reset(); return; }
// Laden noch nicht gestartet
if (charging === false) {
if (power >= MIN_CHARGE_W) {
charging = true;
startEnergy = total;
peakPower = power;
belowCount = 0;
if (LOG) { print("Ladebeginn erkannt."); }
if (LOG) { print("PeakPower = ", peakPower); }
}
return;
}
let geladen = total - startEnergy;
// Spitzenwert (CC-CV-Knie) laufend nachfuehren
if (power > peakPower) { peakPower = power; }
// Sicherheitslimit zuerst
if (geladen >= SAFETY_MAX_WH) {
shutdown("Wh-Sicherheitslimit erreicht (" + JSON.stringify(geladen) + " Wh).");
return;
}
// Stromabfall-Logik erst nach Mindestladung scharf schalten
if (geladen < ARM_AFTER_WH) { return; }
// Ist die Leistung weit genug unter den Spitzenwert gefallen?
if (power <= peakPower * DROP_THRESHOLD) {
belowCount = belowCount + 1;
if (belowCount >= CONSECUTIVE) {
shutdown("CV-Phase: Leistung auf " + JSON.stringify(DROP_THRESHOLD * 100) + "% des Peaks gefallen. Akku ~80-90%.");
}
} else {
belowCount = 0;
}
}
// Beim Start pruefen, ob bereits geladen wird
let initSt = Shelly.getComponentStatus("switch:0");
if (initSt !== undefined && initSt !== null && initSt.output === true && initSt.apower >= MIN_CHARGE_W) {
charging = true;
startEnergy = initSt.aenergy.total;
peakPower = initSt.apower;
if (LOG) { print("Script gestartet, Ladevorgang laeuft bereits."); }
}
Timer.set(POLL_MS, true, check);
if (LOG) { print("Intelligente Ladebegrenzung aktiv. Schwelle:", DROP_THRESHOLD, "Sicherheitslimit:", SAFETY_MAX_WH, "Wh"); }
