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:
How can I do this in Ubuntu?
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.
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.
sudo apt install tlp
Check what package needed for battery:
sudo tlp-stat -b
Only if tlp-stat said that acpi_call is recommended:
sudo apt install acpi-call-dkms
Only if tlp-stat said that tp-smapi-dkms is recommended:
sudo apt install tp-smapi-dkms
/etc/tlp.conf for possible settings; we create a new file in tlp.d so we can upgrade without having to merge in changes):
sudo gedit /etc/tlp.d/01-my-charge-thresh.conf
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80
Note that some thinkpads have multiple batteries (tlp-stat -b will tell you)sudo systemctl restart tlp
sudo tlp-stat -b
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.
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.
I have a Asus laptop and the approach which I have found from internet is as follows. This approach may already be a part of some of the apps mentioned above but putting it here for information.
battery_charge_threshold.service like this.
[Unit]
Description=Set the battery charge threshold
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold'
[Install]
WantedBy=multi-user.target
/etc/systemd/systemsudo chmod 644 /etc/systemd/system/battery-charge-threshold.service
sudo systemctl daemon-reload
sudo systemctl enable battery-charge-threshold.service
After doing this, charge threshold of 80% (as per service file) will persist between reboots. It will also stop charging the battery if the current level is above 80%. Hope this helps. I have been using it for almost 1.5 years without any issue.
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
https://extensions.gnome.org/extension/5724/battery-health-charging/
Using Battery Health Charging extension, some laptop models are supported out of the box, while others model that are not supported by native linux kernel need to install dependencies, either 3rd party kernel module or packages.
The below link for readme of extension Github pages, contains a list of laptop make/model and dependencies, if required. It also contains command-line to change threshold which can be helpful for Ubunut other desktop environments such as Kubuntu, Ubuntu Cinamon etc. Please check it out for more information
https://maniacx.github.io/Battery-Health-Charging/device-compatibility
I have seem lots of users in different forums asking for a GUI way to change battery charging limit/threshold and in most case the post gets locked in 3-4 days without the correct solution and I am unable to answer them, so I am creating this post. Most of user are even unaware that enthusiast have devoleoped kernel modules and packages to change charging threshold.
Hope whoever needs this, finds this post.
List of supported laptop.
Compatible with Gnome 42 and above
Ubuntu 22.04
Ubuntu 22.10
Ubuntu 23.04
Additionally seeking assistance with translation contributions. Thank you.
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.
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.
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
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.
For LG Gram laptops, there's a specific kernel driver, which seems to be active out of the box, at least in EndeavourOS, for particular features of LG Gram, see https://www.kernel.org/doc/html/latest/admin-guide/laptops/lg-laptop.html
In particular, it also provides a "Battery care limit". Quoting from that page:
Writing 80/100 to /sys/devices/platform/lg-laptop/battery_care_limit sets the maximum capacity to charge the battery. Limiting the charge reduces battery capacity loss over time.
This value is reset to 100 when the kernel boots.
So, for example, you can manually set the limit to 80 with the following command:
echo '80' | sudo tee /sys/devices/platform/lg-laptop/battery_care_limit
I tested that on my LG Gram 16, and it seems to work perfectly: when plugging the AC with 85% charged, KDE states that it is charging, but the percentage stays at 85% (with "time to full" blocked at 1:41).
As stated in the quote above, this value will be reset when the kernel boots, so you may have to change the value again.
I guess that for a more automatic solution, tlp provides support for that as well, https://gist.github.com/linrunner/fee8feeb079efc03001d9f3671146298
If you just want to be alerted at a certain charging level, you can use this script: https://www.2daygeek.com/linux-low-full-charging-discharging-battery-notification
One more solution for IdeaPad:
First make sure the ideapad_laptop kernel module is loaded, with the lsmod command. If it is, run the following command as root to enable Battery Conservation Mode:
# echo 1 > /sys/bus/platform/drivers/ideapad_acpi/VPC2004:00/conservation_mode
It leads to max battery level is 60% of capacity.
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 :)
On my asus laptop
sudo -i eval "echo 60 > /sys/class/power_supply/BAT0/charge_control_end_threshold"
If /sys/class/power_supply/BAT0/charge_control_end_threshold isn't there, it is more likely your laptop doesn't support it.
This value get reset every time you reboot your laptop. You can configure a cron job or a systemd service to set it back. There is a great article about this here https://www.linuxuprising.com/2021/02/how-to-limit-battery-charging-set.html
System76 has their own 'charge-threshold' software inbuilt now: https://support.system76.com/articles/laptop-battery-thresholds/
I tried TLP on this System76 Oryx Pro 9, and it unfortunately isn't (yet) supported by TLP (TLP is super cool and promising, btw; hopefully more and more systems will be added and supported by it over time):
$ sudo tlp-stat -b
--- TLP 1.5.0 --------------------------------------------
+++ Battery Care
Plugin: generic
Supported features: none available
but thankfully, system76-power charge-thresholds seems to be working, following their instructions on the above-linked page, including using systemd to persist it. (Apparently a GUI and inbuilt persistence is planned, but not yet fully implemented.)
$ system76-power charge-thresholds
Profile: Maximum Lifespan (max_lifespan)
Start: 50
End: 60
(I'm using the preset "max_lifespan" profile; there are 2 or 3 others; but you can also set custom levels for 'start' and 'end')
(On Ubuntu 20.04)
As of Ubuntu 25.04 this functionality is available out of the box. From the GNOME 48 release notes:
Preserve Battery Health
GNOME 48 includes a new option which enhances the lifespan of the device’s battery. When enabled, battery charge is limited to 80% while the device is plugged in. Maintaining the battery charge level at this reduced level keeps the battery working better for longer.
This new battery health preservation behavior can be enabled in the Power settings, in the new Battery Charging option. It is only available on hardware which supports the feature.