-
Autor
Hallo zusammen,
letztens habe ich mir ein neues E-bike gekauft und ich hab mich gefragt, warum die Ladegeräte immer auf maximale Kapazität laden. Also auf 42V bei 10S Li-Ion Akkus. Wäre die Endabschaltung bei 41.5 oder 41V, dann wäre die Lebensdauer der Akkus viel länger und die Degradation geringer und die Kapazität nur um ein paar Prozent kleiner. Hat mir keine Ruhe gelassen und ich habe für meinen Shelly Plug S Stecker ein kleines Script entwickelt, das ich mit Euch teilen möchte:
Das Script prüft alle 10 Sekunden die Leistung des angeschlossenen Ladegerätes und berechnet einen Durchschnitt über die vergangenen 5 Minuten. Schaltet das Ladegerät von der CC in die CV Phase - dies geschieht bei etwa 80-90% der Kapa - dann reduziert ein normales Li-Ion Ladegerät schlagartig die Ladeleistung. Das Script schaltet dann das Ladegerät komplett ab, sobald die Ladeleistung innerhalb von 60 Sekunden um mehr als 20% fällt.
Das sorgt auch dafür, dass das Ladegerät auch vollständig vom Netz getrennt wird und nichts dummes passieren kann.
Habs mit einem Ebike 48V Akku und einem 36V Akku eines E-Scooters getestet. Müsste aber auch für Laptop, Akkuschrauber etc funktionieren.
Klar, Balancing wird dann nicht mehr gemacht, ggf. sollte man den Akku von Zeit zu Zeit dann einfach auf 100% laden ohne den Stecker. Wobei es fraglich ist, ob diese einfachen BMSe überhaupt ein Balancing machen.
Das Script einfach als neues Script im Script-Bereich des Shelly Plug S anlegen und Auto-Start aktivieren und ggf die Debug-Ausgabe beobachten.
let SAMPLE_INTERVAL = 10; // Sekunden
let SAMPLE_COUNT = 30; // ~5 Min
let DROP_THRESHOLD = 0.20; // 20% Abfall
let DROP_DURATION = 60; // Sekunden
let MIN_ACTIVE_POWER = 5; // W – Erkennung ob Akku angeschlossen
let powerSamples = [];
let dropStartTime = null;
Timer.set(SAMPLE_INTERVAL * 1000, true, function () {
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;
// Ladeende, wenn Leistung stark gesunken
if (power < avgPower * (1 - DROP_THRESHOLD)) {
if (dropStartTime === null) {
dropStartTime = uptime;
} else if ((uptime - dropStartTime) >= DROP_DURATION) {
print("⚡ Ladeende erkannt – Steckdose wird ausgeschaltet.");
Shelly.call("Switch.Set", { id: 0, on: false });
dropStartTime = null;
}
} else {
dropStartTime = null;
}
print("Leistung: " + power.toFixed(1) + " W | Strom: " + current.toFixed(2) + " A | Ø: " + avgPower.toFixed(1) + " W");
});
Alles anzeigen