X-Git-Url: http://pere.pagekite.me/gitweb/homepage.git/blobdiff_plain/d4d8529eebb91cf5da5c7f93cee3e2a5b70a60a5..3f8051a7da60ef98586d6d56df6771a3f557f6d7:/blog/archive/2015/09/index.html diff --git a/blog/archive/2015/09/index.html b/blog/archive/2015/09/index.html index 0d6f348a86..303c5fcef9 100644 --- a/blog/archive/2015/09/index.html +++ b/blog/archive/2015/09/index.html @@ -21,6 +21,157 @@

Entries from September 2015.

+
+
+ The life and death of a laptop battery +
+
+ 24th September 2015 +
+
+

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.

+ +
+
+ + + Tags: debian, english. + + +
+
+
+
Book cover for the Free Culture book finally done @@ -92,6 +243,35 @@ proof readers a chance to complete their work.

Archive