124

I just learned that some Lenovo laptops include a utility that offers to limit battery charging capacity to within 0–80% in order to slow the attenuation of the battery lifespan:

screenshot

How can I do this in Ubuntu?

1
  • Can you confirm that aquaherd's answer works for you?
    – cfi
    Oct 27 '11 at 8:29

10 Answers 10

97
+50

The charging thresholds are, very unfortunately, firmware and vendor specific.

The Lenovo ThinkPad user is luckily provided with a solution outlined on ThinkWiki.

It basically says that you would have to install and load the tp_smapi kernel module:

sudo apt-get install tp-smapi-dkms
sudo modprobe tp_smapi

and write the desired charging thresholds to virtual files in /sys/devices/platform/smapi:

echo 40 | sudo tee /sys/devices/platform/smapi/BAT0/start_charge_thresh
echo 80 | sudo tee /sys/devices/platform/smapi/BAT0/stop_charge_thresh

Then it will stop charging once it reached 80% and only start charging when it drops below 40%.

Toshiba and others might have a similar kernel module that exposes firmware functionality to the /sys or /proc space, but it is very unlikely for patent issues. For the same reasons, an application that could handle this would be either Thinkpad- specific or only address a few select vendors.

22
  • 1
    Thanks for this info. It's a good start - hopefully at least for the original Q asker. Hardware vendors should offer more support for linux driver developers. It's a shame that so much time has to be wasted having to reverse engineer hardware protocols.
    – cfi
    Oct 27 '11 at 8:32
  • 1
    I did in Ubuntu sudo apt-get install tp-smapi-dkms. It installed. Then I'm doing echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh and it says bash: /sys/devices/platform/smapi/BAT0/start_charge_thresh: No such file or directory. Why?
    – Alex Malex
    Dec 18 '12 at 9:07
  • 4
    @ændrük, alex@ubuntu:~$ sudo modprobe tp_smapi FATAL: Error inserting tp_smapi (/lib/modules/3.5.0-17-generic/updates/dkms/tp_smapi.ko): No such device. Did I miss something? I'm going to open a new question if I don't get the anwer.
    – Alex Malex
    Dec 23 '12 at 7:12
  • 2
    @Mika It seems that T420 needs an additonal acpi-call-dkms package as per linrunner.de/en/tlp/docs/…
    – mystrdat
    Jun 15 '16 at 14:07
  • 2
    It needs a ThinkPad laptop to set these charging values with TLP. TLP supports other laptops too (e.g. Dell, HP) but does not support all features as written in FAQ on the page from linrunner. For configuration of the charging thresholds see: linrunner.de/en/tlp/docs/…
    – Luckyrings
    Jun 14 '17 at 10:54
33

There's a somewhat nicer application now available to Ubuntu (and other distributions):

TLP – Linux Advanced Power Management

TLP brings you the benefits of advanced power management for Linux without the need to understand every technical detail. TLP comes with a default configuration already optimized for battery life, so you may just install and forget it. Nevertheless TLP is highly customizable to fulfil your specific requirements.

One of the parameters it controls is maintaining battery charging limits. As pointed by @tanius in the comments (please upvote them!), while TLP used to only work on Thinkpads, the newest version has support for devices from multiple vendors, and given the nature of the project—if the appropriate drivers for other devices will become available, it is likely these will get integrated into this project too. So if you're reading this comment in few years, check the documentation, maybe your device is now supported.

Ubuntu packages are available in the official repository.

5
  • where is the list of supported devices? I am unable find a section on their doc. By any chance do you know whether tlp is supported for Thinkpad X1 carbon as well Apr 6 '18 at 6:57
  • 2
    @KasunSiyambalapitiya, as of now, tlp is only a frontend to the two tools it uses for this purpose, Tp smapi and tpacpi-bat. As long as your model is supported by at least one of them, it should work (or file a bug). Yours doesn't seem to be listed on either of their supported hardware pages, but a quick googling reveals that the latter might work.
    – liori
    Apr 6 '18 at 19:22
  • "Battery charge thresholds, discharge and recalibration are currently only supported for IBM/Lenovo ThinkPads. Any other Lenovo laptop models including IdeaPads and all other laptop brands are not supported. TLP 1.3.1 does not support the kernel’s natacpi implementations for Asus and Huawei laptops because of differing sysfiles" Source: linrunner.de/tlp/usage/tlp.html I would like to see an implementation for ASUS laptops. Mine does include a charge control utility by Asus too but for Windows only.
    – w-sky
    Jul 28 at 12:36
  • Found a guide to use charge control on Asus laptops here: linuxuprising.com/2021/02/…
    – w-sky
    Jul 28 at 12:48
  • 2
    Good news (esp. for @w-sky): TLP ≥1.4 also can set battery charge limits for Asus, Huawei, LG, other Lenovo, and Samsung notebooks (source).
    – tanius
    Sep 16 at 11:28
18

The accepted answer does not work on my new Lenovo T440s. Apparently the firmware changed. Following http://www.thinkwiki.org/wiki/Tpacpi-bat, I did

git clone https://github.com/teleshoes/tpacpi-bat.git
cd tpacpi-bat/
./install.pl
sudo ./tpacpi-bat -s ST 1 15 # load internal battery when below 15%
sudo ./tpacpi-bat -s SP 1 95 # stop charging at 95%
sudo ./tpacpi-bat -g ST 2 # when is external battery loaded?

For reference, I did this on debian testing but I'm sure it works in ubuntu just as well.

1
  • The instructions above are still valid after 6 years on my new Thinkpad E495 but meanwhile if secureboot is enabled, I can't just add a kernel module and the ./install.pl step fails with modprobe: ERROR: could not insert 'acpi_call': Operation not permitted. A workaround is to disable secure boot or to sign the modules manually; cf. e.g. askubuntu.com/questions/1114867 Nov 17 '20 at 9:12
11

On my Toshiba R830 running Windows 8.1, I installed the Toshiba Power Saver application in order to limit the battery charge to 80%

When I boot on Linux (Ubuntu, Mint, etc), the maximum charge is still limited to 80%.

Therefore, the Toshiba Power Saver seems to store its configuration into the bios.

The only drawback is that if I want to travel with a fully charged battery, I have to reboot on Windows and change the Power Saver configuration.

4
  • 1
    welcome to askubuntu! Your results with Mint don't appear to be Ubuntu related. Can you rephrase your answer in terms that are relevant to this site? Thank you!
    – Elder Geek
    Jun 21 '14 at 13:49
  • 14
    Hello Elder Geek, this is bios related therefore will work with any operating system in a dual boot configuration. This Toshiba bios configuration is not accessible by bios menu but only with the Power Saver Application that runs on Windows only.
    – eosphere
    Sep 16 '14 at 21:03
  • 2
    Same for me on linovo yoga 3 11inch. Aug 22 '15 at 18:19
  • 4
    Results with Mint are obviously Ubuntu-related. May 16 '18 at 10:45
5
sudo add-apt-repository ppa:linrunner/tlp
sudo apt update
sudo apt install tlp
################ check what package needed for battery:
sudo tlp-stat -b
################ if acpi_call is recommended
sudo apt install acpi-call-dkms
################ if smapi is recommended
sudo apt install tp-smapi-dkms
sudo gedit /etc/tlp.conf
  • Find the lines regarding battery settings, remove the leading # for comment and maybe insert the value you want
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80
  • Restart tlp
sudo tlp start
  • Check the config status
sudo tlp-stat -b
2
  • On my thinkpad, the config file is in /etc/default/tlp
    – xuancong84
    Dec 24 '20 at 2:43
  • My settings is START_CHARGE_THRESH_BAT0=60 STOP_CHARGE_THRESH_BAT0=81 When I plug in the charger, the level reaches 80% and stops. Everything is as expected. But how does the lower range work? With the charger on, the level is always constant at 80%.
    – Jekson
    Sep 27 at 10:52
4

Did you check to see whether there is a BIOS setting on your laptop for this? My laptop had a Windows Application as well as a "Battery Life Extender" setting in the BIOS for this exact feature.

1
  • 3
    There is no such setting in the BIOS setup screen.
    – ændrük
    Jun 2 '11 at 15:55
2

There is a hardware hack I just discovered for Dell laptops:

Dell chargers use 3 pins, one for (+), one for (-) and one for Dell Charger Identification Communication (a 1-Wire protocol). This communication line is usually the one in the center of connector, the needle like pin.

If you cut this communication line, laptop will continue running from AC but the battery won't be charged anymore.

Locate the communication line, cut it, place a switch in between. Charge your laptop's battery as much as you want and then turn off that switch. Your laptop will use AC but your battery will stay put at the charge you left it.

See this answer for recommended charge levels for various scenarios: https://superuser.com/a/664583/187576

Edit

Apperently a disadvantage of this approach is that the laptop degrades its performance if no identified charger found.

This might not be an issue for normal usage, however, if you need your CPU power for like 3D design, the performance is degraded noticeably.

2

I wrote a command line application that does this.

The easiest way to get started is download the app from the releases page and run

$ ./bat --help

from the terminal in the directory where it is located which should show the help documentation.

If there's an error, it might have to do with permissions. The following command might solve the problem.

chmod +x ./bat

Basically, running

$ ./bat --threshold

will print out the current threshold.

To set a new threshold, say 60%, run

./bat --threshold 60

To persist the current threshold between restarts, run

sudo ./bat --persist

Note: Persisting uses systemd under the hood but this is bundled with most Linux distributions including Ubuntu.

Tip: Putting the app in a directory like /usr/local/bin/ that is in the $PATH will enable you to run it from anywhere and not just in the directory the app is in. Then the above commands become,

bat --help
bat --threshold 60
bat --persist

respectively.

1

Very often (almost always) this is an option in the BIOS that Windows can change remotely. It's very difficult to remote change this in Linux. My suggestion? When starting up your computer, smash the function keys, specifically F1, F2, F3, F6, F8, F10, and F12. One of these (maybe another) will put you into the bios menu. It says which key on startup, but it doesn't usually stay up long enough.

Look for power settings (only arrow keys here, no mouse). Find batter saver or batter optimizer or something along those lines. Change that to enabled, and then save and restart. This should do it.

Linux tends to freak out when the battery doesn't charge past 80%, but it will just ruin your expected charge times. Nothing to worry about here.

Still need help? Comment your question! Did I help? +1 me :)

1

On my Dell XPS, I installed the smbios-utils package using sudo apt install smbios-utils. This package provides a command called smbios-battery-ctl. It looks like battery level based charge control has been available since Ubuntu 20.04. Full details are in the manpage, but for a basic 80% setting, I think this will work:

sudo smbios-battery-ctl --set-custom-charge-interval 75 80
sudo smbios-battery-ctl --set-charging-mode=custom

This will start charging when the battery falls below 75%, and stop charging when it reaches 80%.

To change the setting back:

sudo smbios-battery-ctl --set-charging-mode=adaptive
1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.