Linux & Hardware

Eine Laptop-Batterie richtig parken

Mein Laptop steht permanent am Netz. Ladeschwellen reichten mir nicht, also habe ich einen kleinen Daemon geschrieben, der einen Kernel-Mechanismus nutzt, den die meisten Tools ignorieren.

Ramazan Yavuz
Ramazan Yavuz ·

Mein Laptop ist neun von zehn Tagen ein Desktop-Ersatz. Er steht den ganzen Tag auf einem Ständer am Netz, und ich nehme ihn nur mit, wenn ich reise oder mich umsetze. Wie die meisten modernen Geräte hat er eine Ladeschwellen-Steuerung im BIOS – meine ist auf "stoppen bei 80, weiterladen ab 75" eingestellt. Das ist eine Verbesserung gegenüber der Default-Einstellung, aber es ist nicht das, was ich tatsächlich will.

Was ich will: dass die Batterie an einer Ziel-Spannung sitzt und niemals zyklisiert. Eine Schwelle von 75–80 ist immer noch ein Mikro-Zyklus von ein paar Prozent in der Stunde, wenn das System leichten Strom zieht. Über Monate sind das hunderte unnötiger Mini-Zyklen. Was ich brauchte, war ein Mechanismus, der dem Charger sagen kann: ignorier das Netz, lass die Batterie stehen.


Das Linux-Subsystem für Power-Supply hat seit einer Weile genau diesen Mechanismus: charge_behaviour mit dem Wert inhibit-charge. Wenn der Treiber für deine Batterie das Attribut exportiert (und auf vielen ThinkPads, Frameworks und Dell Latitudes tut er das), bedeutet es genau das, wonach es aussieht. Der Charger ist da, das Netz ist verbunden, das System läuft an Wandstrom, und die Batterie wird komplett ignoriert. Kein Strom rein, kein Strom raus, kein Mikro-Zyklus.

Die Schwellen-Steuerung im BIOS und im Userspace ist überall. inhibit-charge als Attribut ist es nicht, und ich habe keine GUI-Tools gefunden, die es exponieren. Also habe ich das geschrieben, was ich wollte: ein Daemon, der das Attribut anhand einer einfachen Policy umschaltet.


Der Daemon ist klein. Er kennt zwei Sollwerte: einen Ziel-Ladestand und eine Hysterese-Untergrenze. Default sind 60 als Ziel und 54 als Untergrenze, aber das ist konfigurierbar. Bei AC fragt er den Akkustand. Liegt er über dem Ziel, schreibt er inhibit-charge: ignorier das Netz. Liegt er zwischen Untergrenze und Ziel, ebenfalls inhibit-charge: halte die Ladung. Ist er unter der Untergrenze, schaltet er auto ein, lädt zurück bis zum Ziel und schaltet dann wieder auf inhibit-charge.

Auf Akku tut der Daemon nichts. Die Batterie entlädt sich normal, der Kernel macht seine eigene Arbeit, niemand stört. Beim erneuten Anstecken springt die Logik wieder ein.

Das Hysterese-Band zwischen 54 und 60 ist da, damit der Charger nicht klappert. Ohne Hysterese würde der Daemon ständig zwischen "lädt" und "lädt nicht" hin und her schalten, sobald der Stand am Ziel hängt – das ist das Verhalten, das ich gerade vermeiden wollte. Sechs Prozentpunkte Band reichen, damit eine Sitzung ohne Aktion durchläuft.


Es gibt zwei Modi und das war Absicht. park ist das, was ich beschrieben habe: am Ziel-Stand sitzen, mit Hysterese, ohne Zyklus. off ist – nichts tun, lass den Kernel walten. Ich habe absichtlich keinen dritten Modus für "lade voll für die Reise" eingebaut, weil das immer ad hoc nötig ist und besser per direktem CLI-Aufruf passiert (inhibit-charge full setzt einmalig den Mode für die nächste Stunde) als als persistente Konfiguration. Drei Modi wären drei Wege, die Konfiguration falsch zu setzen. Zwei sind genug.


Das Attribut charge_behaviour ist nicht universell. Auf Maschinen, deren Charger-Chip oder ACPI-Tabellen den Mechanismus nicht exponieren, ist die Datei einfach nicht da, oder das Schreiben mit inhibit-charge wird mit EOPNOTSUPP abgelehnt. Der Daemon erkennt das beim Start und beendet sich mit einer klaren Meldung statt still zu scheitern. Auf der Lenovo-, Framework- und Dell-Hardware, die ich getestet habe, funktioniert es. Auf einigen ASUS- und HP-Maschinen funktioniert es nicht, und in dem Fall sind die BIOS-Ladeschwellen das Beste, was es gibt.

Wenn dir charge_behaviour zur Verfügung steht, ist es das saubere Ding. Es ist eine Kernel-Schnittstelle, kein Userspace-Hack, keine herausgepatchte ACPI-Methode, kein im EC-Firmware geschachtelter Workaround.


Der Akku ist nicht mehr warm. Er sitzt um die 60 % über Wochen hinweg. Wenn ich für ein Meeting absteckse, entlädt er sich normal. Wenn ich wieder anstecke, entscheidet der Daemon anhand des aktuellen Stands, was zu tun ist: über 60 % ignoriert er das Netz und lässt den Akku stehen; zwischen 54 % und 60 % ebenfalls, er hält die Ladung; nur wenn der Stand unter 54 % gefallen ist, erlaubt er einen kurzen Top-up zurück auf 60 % und stoppt dann wieder. Das Hysterese-Band sorgt dafür, dass der Charger nicht ständig an- und ausspringt. Das Resultat ist das langweiligste Akku-Verhalten, das ich je beobachtet habe – genau das, was ich von einer Batterie will.

Den Langzeit-Effekt werde ich erst in ein paar Jahren wissen. Calendar Aging bei einem geparkten State of Charge ist in der Literatur gut dokumentiert, aber nicht null. Die ehrliche Frage ist, ob Parken besser ist als ein enges Cycling-Band, und das hängt von der Batterie-Chemie, der Umgebungstemperatur und davon ab, wie oft du tatsächlich abstecks. Für einen Schreibtisch-gebundenen Laptop mit seltenen Trennungen ist Parken die richtige Strategie. Wer jeden Tag absteckse, bei dem mag die Rechnung andersherum laufen.