ThinkPad E530 battery charge threshold on Linux
by Mostafa on Mar.04, 2013, under Hardware, Linux
Leaving a battery charged at 100% for extended periods of time can significantly reduce its service life. Unfortunately, this is quite often the case with laptops that spend a lot of time tethered to an AC power socket. On Windows systems, the Lenovo ThinkVantage power management tools offer a solution that can be used to stop charging before the battery charge level reaches 100%, and re-start charging after it drops below another predefined level. E.g., with the charge thresholds set at 40% and 80%, a laptop connected to the AC adapter will:
- Start charging when the battery is below 40%
- Stop charging when the level reaches 80%
- Do nothing while it is above 40% — even though the AC adapter is connected
According to ThinkWiki, similar functionality can be had on Linux using tp_smapi but unfortunately support for E-series laptops is currently missing.
Searching further finally led me to tpacpi-bat. It is a very young project (about 3 months old at the time of writing) but I am happy to say that it successfully sets both start and stop thresholds on my E530 ThinkPad. The tpacpi-bat Perl script did require one small change to get it working:
diff --git a/tpacpi-bat b/tpacpi-bat index d9ecf99..2dcdd9d 100755 --- a/tpacpi-bat +++ b/tpacpi-bat @@ -39,7 +39,8 @@ use warnings; use File::Basename; my $acpiCallDev = '/proc/acpi/call'; -my $aslBase = '\_SB.PCI0.LPC.EC.HKEY'; +my $aslBase = '\_SB.PCI0.LPCB.EC0.HKEY'; sub readPeakShiftState($); sub readInhibitCharge($);
… but I’ll chalk it up to the rather immature state of the project. The most important thing is that it works as expected. The $aslBase setting for other ThinkPad models can be found by following these steps taken from the project’s issue tracker:
$ sudo acpidump -b -t DSDT -o /tmp/dsdt.aml $ iasl -d /tmp/dsdt.aml $ cat /tmp/dsdt.dsl | grep \\\\_SB\.PCI.*HKEY -o | uniq
If the tpacpi.service file is utilised to automatically set the thresholds at system start, it should also be modified as appropriate (particularly ExecStart=).