I have been using Kubuntu-22.04 on my ASUS Vivobook S15 510un for a while now. While the UX has been good enough till now, there is one problem that I have lazily accepted for a while, i.e, the battery charging threshold.

I generally set the battery charging threshold to 80% but this value is not preserved across reboot. Every time the machine is rebooted, the value is set back to 100% This was something I accepted as a quirk, and every time the system was rebooted, I would manually set the value back to 80% from the default 100%

Setting the battery charging threshold after reboot

As you should have guessed till now, this is an irritating issue, and sooner or later, I would have tried to resolve this in some way or another. And, that’s what I have done.

After searching for a couple of hours, modifying my query term to the issue at hand, I finally found the correct article on the Arch Wiki.

Checking some Power Supply parameters

Kernel 5.4 brought the ability to set the battery charge threshold for some Asus laptops, by modifying the charge_control_end_threshold variable exposed under /sys/class/power_supply/BAT0/

By default this value is set to 100 and reset on every power cycle.

$ cat /sys/class/power_supply/BAT0/status
$ cat /sys/class/power_supply/BAT0/capacity
$ cat /sys/class/power_supply/BAT0/charge_control_end_threshold

Checking some Power Supply Parameters

Automatically set the threshold on boot

In order to automatically change the threshold on boot, let’s create a systemd service.

sudo touch /etc/systemd/system/battery-charge-threshold.service


Description=Set the battery charge threshold

ExecStart=/bin/bash -c 'echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold'


Then, enable the service:

systemctl enable battery-charge-threshold.service

Creating a systemd service to set threshold on boot

Creating a udev rule

Since the charge_control_end_threshold class does not exist initially, lets create a udev rule for asus-nb-wmi kernel module to set the battery’s charge threshold:

sudo vim /etc/udev/rules.d/asus-battery-charge-threshold.rules


ACTION=="add", KERNEL=="asus-nb-wmi", RUN+="/bin/bash -c 'echo 80 > /sys/class/power_supply/BAT?/charge_control_end_threshold'"

Creating a udev rule for charge control end threshold

Persist after hibernation

By default, the threshold settings persist across hibernation, so there is not need of any additional configuration here.

This was a nifty and fun way to spend a Sunday morning, and the result is very satisfactory.