- <title>The life and death of a laptop battery</title>
- <link>http://people.skolelinux.org/pere/blog/The_life_and_death_of_a_laptop_battery.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/The_life_and_death_of_a_laptop_battery.html</guid>
- <pubDate>Thu, 24 Sep 2015 16:00:00 +0200</pubDate>
- <description><p>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.</p>
-
-<img src="http://people.skolelinux.org/pere/blog/images/2015-09-24-laptop-battery-graph.png"/>
-
-<p>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
-<a href="https://tracker.debian.org/pkg/battery-stats">battery-stats</a>,
-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 href="http://www.ifweassume.com/2013/08/the-de-evolution-of-my-laptop-battery.html">a
-blog post about the battery development on a MacBook Air</a> I also
-discovered
-<a href="https://github.com/jradavenport/batlog.git">batlog</a>, not
-available in Debian.</p>
-
-<p>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:</p>
-
-<pre>
-#!/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
-</pre>
-
-<p>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
-<a href="https://github.com/petterreinholdtsen/battery-status">is now
-available on github</a>.</p>
-
-<p>The collected log file look like this:</p>
-
-<pre>
-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,
-</pre>
-
-<p>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.</p>
-
-<p>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
-<a href="http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries">Battery
-University</a>, 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
-<a href="http://my.teslamotors.com/de_CH/forum/forums/battery-charge-limit">limit
-the charge of their batteries to 80%</a>, 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.</p>
-
-<p>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
-<a href="http://askubuntu.com/questions/34452/how-can-i-limit-battery-charging-to-80-capacity">one
-recipe on askubuntu for Ubuntu to limit charging on Thinkpad to
-80%</a>, but could not get it to work (kernel module refused to
-load).</p>
-
-<p>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.</p>
-
-<p>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.</p>
+ <title>Using appstream with isenkram to install hardware related packages in Debian</title>
+ <link>http://people.skolelinux.org/pere/blog/Using_appstream_with_isenkram_to_install_hardware_related_packages_in_Debian.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Using_appstream_with_isenkram_to_install_hardware_related_packages_in_Debian.html</guid>
+ <pubDate>Sun, 20 Dec 2015 12:20:00 +0100</pubDate>
+ <description><p>Around three years ago, I created
+<a href="http://packages.qa.debian.org/isenkram">the isenkram
+system</a> to get a more practical solution in Debian for handing
+hardware related packages. A GUI system in the isenkram package will
+present a pop-up dialog when some hardware dongle supported by
+relevant packages in Debian is inserted into the machine. The same
+lookup mechanism to detect packages is available as command line
+tools in the isenkram-cli package. In addition to mapping hardware,
+it will also map kernel firmware files to packages and make it easy to
+install needed firmware packages automatically. The key for this
+system to work is a good way to map hardware to packages, in other
+words, allow packages to announce what hardware they will work
+with.</p>
+
+<p>I started by providing data files in the isenkram source, and
+adding code to download the latest version of these data files at run
+time, to ensure every user had the most up to date mapping available.
+I also added support for storing the mapping in the Packages file in
+the apt repositories, but did not push this approach because while I
+was trying to figure out how to best store hardware/package mappings,
+<a href="http://www.freedesktop.org/software/appstream/docs/">the
+appstream system</a> was announced. I got in touch and suggested to
+add the hardware mapping into that data set to be able to use
+appstream as a data source, and this was accepted at least for the
+Debian version of appstream.</p>
+
+<p>A few days ago using appstream in Debian for this became possible,
+and today I uploaded a new version 0.20 of isenkram adding support for
+appstream as a data source for mapping hardware to packages. The only
+package so far using appstream to announce its hardware support is my
+pymissile package. I got help from Matthias Klumpp with figuring out
+how do add the required
+<a href="https://appstream.debian.org/html/sid/main/metainfo/pymissile.html">metadata
+in pymissile</a>. I added a file debian/pymissile.metainfo.xml with
+this content:</p>
+
+<blockquote><pre>
+&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;component&gt;
+ &lt;id&gt;pymissile&lt;/id&gt;
+ &lt;metadata_license&gt;MIT&lt;/metadata_license&gt;
+ &lt;name&gt;pymissile&lt;/name&gt;
+ &lt;summary&gt;Control original Striker USB Missile Launcher&lt;/summary&gt;
+ &lt;description&gt;
+ &lt;p&gt;
+ Pymissile provides a curses interface to control an original
+ Marks and Spencer / Striker USB Missile Launcher, as well as a
+ motion control script to allow a webcamera to control the
+ launcher.
+ &lt;/p&gt;
+ &lt;/description&gt;
+ &lt;provides&gt;
+ &lt;modalias&gt;usb:v1130p0202d*&lt;/modalias&gt;
+ &lt;/provides&gt;
+&lt;/component&gt;
+</pre></blockquote>
+
+<p>The key for isenkram is the component/provides/modalias value,
+which is a glob style match rule for hardware specific strings
+(modalias strings) provided by the Linux kernel. In this case, it
+will map to all USB devices with vendor code 1130 and product code
+0202.</p>
+
+<p>Note, it is important that the license of all the metadata files
+are compatible to have permissions to aggregate them into archive wide
+appstream files. Matthias suggested to use MIT or BSD licenses for
+these files. A challenge is figuring out a good id for the data, as
+it is supposed to be globally unique and shared across distributions
+(in other words, best to coordinate with upstream what to use). But
+it can be changed later or, so we went with the package name as
+upstream for this project is dormant.</p>
+
+<p>To get the metadata file installed in the correct location for the
+mirror update scripts to pick it up and include its content the
+appstream data source, the file must be installed in the binary
+package under /usr/share/appdata/. I did this by adding the following
+line to debian/pymissile.install:</p>
+
+<blockquote><pre>
+debian/pymissile.metainfo.xml usr/share/appdata
+</pre></blockquote>
+
+<p>With that in place, the command line tool isenkram-lookup will list
+all packages useful on the current computer automatically, and the GUI
+pop-up handler will propose to install the package not already
+installed if a hardware dongle is inserted into the machine in
+question.</p>
+
+<p>Details of the modalias field in appstream is available from the
+<a href="https://wiki.debian.org/DEP-11">DEP-11</a> proposal.</p>
+
+<p>To locate the modalias values of all hardware present in a machine,
+try running this command on the command line:</p>
+
+<blockquote><pre>
+cat $(find /sys/devices/|grep modalias)
+</pre></blockquote>
+
+<p>To learn more about the isenkram system, please check out
+<a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">my
+blog posts tagged isenkram</a>.</p>