Данная статья является вольным пересказом всего того объёма информации, что мне удалось перечитать на данную, интересующую меня, тему. Статья может быть полезна владельцам ноутбуков Asus, Lenovo/Thinkpad, Huawei, LG, Samsung, Sony, Toshiba.

Используя в своей повседневной работе ноутбук Asus, мне хотелось продлить срок жизни его батареи на как можно более долгий срок. В Windows для этого есть фирменная утилита Asus Battery Health Charging, которая позволяет ограничивать уровень заряда батареи до 60% и 80%. Когда ноутбук постоянно подключен к сети электропитания, лучше всего ограничивать заряд до 60%.
В данном руководстве я покажу один из способов, как эту задачу можно решить в GNU/Linux дистрибутивах с системой инициализации systemd.
Первое, с чего нужно начать, это узнать тип вашей батареи с помощью команды в терминале:
ls /sys/class/power_supply

В ответ должно прийти одно из обозначений:
BAT0, BATT, BAT1, BATС. (В моём случае это BAT0)
Поддержка функции ограничения заряда батареи стала доступна начиная с ядра Linux 5.4 - но только для батарей типа BAT0. Поэтому, на всякий случай, проверьте соответствие типа вашей батареи и ядра:
BAT0 - ядро не ниже 5.4
BATT - ядро не ниже 5.7
BAT1 - ядро не ниже 5.8
BATС - ядро не ниже 5.9
Теперь, зная тип батареи, можем проверить, поддерживает ли ваш ноутбук ограничение заряда батареи. Для этого в терминале вводим команду:
ls /sys/class/power_supply/BAT*/charge_control_end_threshold
Где вместо BAT* подставьте тип вашей батареи.

Если эта команда возвращает путь /sys/class/power_supply/BAT*/charge_control_end_threshold , то ваш ноутбук поддерживает ограничение заряда батареи - можно переходить ко второму пункту.
Если же команда выдаёт ошибку, или сообщает, что «нет указанного файла или директории» («there's no such file or directory») - то ваш ноутбук не поддерживает данную опцию.
Второе - создаём файл сервиса systemd. Для этого вводим в терминале:
sudo nano /etc/systemd/system/battery-charge-threshold.service
В появившемся поле вставляем следующий текст:
[Unit]
Description=Set the battery charge thresholdAfter=multi-user.target
StartLimitBurst=0
[Service]
Type=oneshotRestart=on-failure
ExecStart=/bin/bash -c 'echo CHARGE_STOP_THRESHOLD > /sys/class/power_supply/BATTERY_NAME/charge_control_end_threshold'
[Install]
WantedBy=multi-user.target
Где вместо BATTERY_NAME - вставляем тип вашей батареи (BAT0, BATT, BAT1 или BATС)
А вместо CHARGE_STOP_THRESHOLD - необходимый уровень заряда 60 или 80.
То есть строчка должна иметь вид (в моём случае для уровня 60% и типа батареи BAT0):
ExecStart=/bin/bash -c 'echo 60 > /sys/class/power_supply/BAT0/charge_control_end_threshold'
Другие числа на Asus могут работать некорректно, или не работать вообще, т.к. в утилите для Windows нет других опций. Поэтому лучше придерживаться этих двух уровней.
После этого сохраняем документ, нажав Ctrl+O, Enter, затем выходим Ctrl+X.
Теперь включим и запустим созданный нами сервис:
sudo systemctl enable battery-charge-threshold.service
sudo systemctl start battery-charge-threshold.service
Чтобы убедиться, что наш сервис работает, выполним команду:
cat /sys/class/power_supply/BATTERY_NAME/status
Если уровень заряда батареи достиг указанной нами величины, ответ команды должен быть таким:
Not Charging

Данный способ был успешно опробован на ноутбуке Asus VivoBook 15 X542UF в дистрибутивах Linux Mint 21-21.2 Cinnamon, elementary OS 6.1, Manjaro 22-23 KDE и Gnome (версии DE соответствуют версиям дистрибутивов на момент их выпуска). Больше всего мне понравилось, как в KDE отображается подробная информация о том, что уровень заряда батареи лимитирован. Ни в каком другом рабочем окружении такой информации не было.

В Gnome было указано просто, что батарея не заряжается.

в Cinnamon было указано оставшееся время работы от батареи, хотя зарядка так же остановилась.

Ещё в настройках KDE отображалась опция «останавливать зарядку на уровне», я пробовал её использовать без вышеуказанных действий, но она действовала только до перезагрузки. Относительно нашей задачи в плане удобства и информативности KDE даёт фору остальным своим собратьям.

Надеюсь, данная статья будет полезна! Всем хорошего времени суток!
Комментарии
10:30
11:06
11:21
По личному опыту, да, в последнее время всё чаще новая техника (и не только техника, но и, например, обувь) выходит из строя сразу по окончании гарантии (в лучшем случае). Хотя иногда чудеса случаются.
15:45
11:12
В ASUS меняю АКБ раз в два-четыре года, зависит от АКБ, родная работала года четыре, другие — меньше, впрочем время службы соответствует заявленному. В таком случае вопрос: на много ли увеличивает (и увеличивает ли?) срок службы АКБ описанный метод?
ACER: нет такого файла\каталога.
12:08
12:13
03:19
12:57
Подобный принцип мне показывал кто-то на скриншоте от смарта. Там в ГуглПлэй есть такое приложение, которое ограничивает уровень заряда максимального.
13:01
Смарт = смартфон? Не пользуюсь, ибо без надобности.
14:39
11:12
15:19
09:41
03:17
08:55
https://ibb.co/HgQnW2X
Ноутбук '18го года, батарея не менялась. А у второго точно такого же батарея под замену ушла через пару лет с потерей ёмкости до около 60-65%...
10:46
https://ibb.co/KrfTJMp
05:52
13:41
На моем Asus L2402 ограничение батареи заработало с помощью asusctl.
14:36
/sys/class/power_supply/BAT'ваш_символ'/charge_control_end_threshold
вот и вся утилита) если файл существует, то работает и на asus и на всех прочих.
Автоматизировать через юнит (как у автора) или через rc, если non-systemd.
16:45
AniMe Matrix display
RGB keyboard LEDs
fn+key combos and media controls
G-Sync enable on capable laptops
Re-enable the dGPU after setting "iGPU On" in Windows
and more All of the above is either enabled in asusctl already, or is enabled via patches to the kernel (and we provide pre-built kernels with the patches applied) which are steadily upstreamed.
Extra features we currently support are:
Control graphics modes via supergfxctl without reboots for switching between iGPU, dGPU, on-demand, and vfio (for VM pass-through)
Set battery charge limit
(custom) fan curve control
Поэтому, я посчитал важным оставить ссылку на этот проект. Не рекламы ради, а пользы для.
А касательно ограничения батареи, да, вы правы, это может быть реализовано без дополнительного ПО.
17:08
17:18
[Unit]
Description=Set the battery charge thresholdAfter=multi-user.target
StartLimitBurst=0
[Service]
Type=oneshotRestart=on-failure
ExecStart=/bin/bash -c 'echo CHARGE_STOP_THRESHOLD > /sys/class/power_supply/BATTERY_NAME/charge_control_end_threshold'
[Install]
WantedBy=multi-user.target
После [Unit], [Service] и [Install] команды должны начинаться с новой строчки. Отправил исправления на модерацию.