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 capacity. My
collector 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 parallel.
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 my laptop
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.
Update 2015-09-24: I got a tip to install the packages
acpi-call-dkms and tlp (unfortunately missing in Debian stable)
packages instead of the tp-smapi-dkms package I had tried to use
initially, and use 'tlp setcharge 40 80' to change when charging start
and stop. I've done so now, but expect my existing battery is toast
and need to be replaced. The proposal is unfortunately Thinkpad
specific.