When I get a new laptop, the battery life time at the start is OK. +But this do not last. The last few laptops gave me a feeling that +within a year, the life time is just a fraction of what it used to be, +and it slowly become painful to use the laptop without power connected +all the time. Because of this, when I got a new Thinkpad X230 laptop +about two years ago, I decided to monitor its battery state to have +more hard facts when the battery started to fail.
+ +
First I tried to find a sensible Debian package to record the +battery status, assuming that this must be a problem already handled +by someone else. I found +battery-stats, +which collects statistics from the battery, but it was completely +broken. I sent a few suggestions to the maintainer, but decided to +write my own collector as a shell script while I waited for feedback +from him. Via +a +blog post about the battery development on a MacBook Air I also +discovered +batlog, not +available in Debian.
+ +I started my collector 2013-07-15, and it has been collecting +battery stats ever since. Now my +/var/log/hjemmenett-battery-status.log file contain around 115,000 +measurements, from the time the battery was working great until now, +when it is unable to charge above 7% of original capasity. My +colletor shell script is quite simple and look like this:
+ ++#!/bin/sh +# Inspired by +# http://www.ifweassume.com/2013/08/the-de-evolution-of-my-laptop-battery.html +# See also +# http://blog.sleeplessbeastie.eu/2013/01/02/debian-how-to-monitor-battery-capacity/ +logfile=/var/log/hjemmenett-battery-status.log + +files="manufacturer model_name technology serial_number \ + energy_full energy_full_design energy_now cycle_count status" + +if [ ! -e "$logfile" ] ; then + ( + printf "timestamp," + for f in $files; do + printf "%s," $f + done + echo + ) > "$logfile" +fi + +log_battery() { + # Print complete message in one echo call, to avoid race condition + # when several log processes run in parallell. + msg=$(printf "%s," $(date +%s); \ + for f in $files; do \ + printf "%s," $(cat $f); \ + done) + echo "$msg" +} + +cd /sys/class/power_supply + +for bat in BAT*; do + (cd $bat && log_battery >> "$logfile") +done ++ +
The script is called when the power management system detect a +change in the power status (power plug in or out), and when going into +and out of hibernation and suspend. In addition, it collect a value +every 10 minutes. This make it possible for me know when the battery +is discharging, charging and how the maximum charge change over time. +The code for the Debian package +is now +available on github.
+ +The collected log file look like this:
+ ++timestamp,manufacturer,model_name,technology,serial_number,energy_full,energy_full_design,energy_now,cycle_count,status, +1376591133,LGC,45N1025,Li-ion,974,62800000,62160000,39050000,0,Discharging, +[...] +1443090528,LGC,45N1025,Li-ion,974,4900000,62160000,4900000,0,Full, +1443090601,LGC,45N1025,Li-ion,974,4900000,62160000,4900000,0,Full, ++ +
I wrote a small script to create a graph of the charge development +over time. This graph depicted above show the slow death of mylaptop +battery.
+ +But why is this happening? Why are my laptop batteries always +dying in a year or two, while the batteries of space probes and +satellites keep working year after year. If we are to believe +Battery +University, the cause is me charging the battery whenever I have a +chance, and the fix is to not charge the Lithium-ion batteries to 100% +all the time, but to stay below 90% of full charge most of the time. +I've been told that the Tesla electric cars +limit +the charge of their batteries to 80%, with the option to charge to +100% when preparing for a longer trip (not that I would want a car +like Tesla where rights to privacy is abandoned, but that is another +story), which I guess is the option we should have for laptops on +Linux too.
+ +Is there a good and generic way with Linux to tell the battery to +stop charging at 80%, unless requested to charge to 100% once in +preparation for a longer trip? I found +one +recipe on askubuntu for Ubuntu to limit charging on Thinkpad to +80%, but could not get it to work (kernel module refused to +load).
+ +I wonder why the battery capacity was reported to be more than 100% +at the start. I also wonder why the "full capacity" increases some +times, and if it is possible to repeat the process to get the battery +back to design capacity. And I wonder if the discharge and charge +speed change over time, or if this stay the same. I did not yet try +to write a tool to calculate the derivative values of the battery +level, but suspect some interesting insights might be learned from +those.
+