Как ограничить зарядку аккумулятора (установить порог заряда) для ноутбуков ASUS на Linux
Новые ноутбуки ASUS поддерживают ограничение уровня заряда батареи, что помогает продлить срок службы батареи. В этой статье объясняется, как установить порог заряда батареи для ноутбуков ASUS в Linux.
Срок службы батареи зависит от возраста, высоких температур, количества циклов зарядки и времени полной зарядки. Порог заряда батареи сокращает время полной зарядки (100%) и, таким образом, улучшает работоспособность/срок службы батареи.
Ноутбуки ASUS поддерживают установку порога заряда, начиная с Linux 5.4 . Метод ядра WMI для установки порогового значения заряда не позволяет указать батарею, предполагая, что это первая батарея ( BAT0). Однако для некоторых более новых ноутбуков ASUS основная батарея называется не BAT0, а BATT(например, Zenbook UM431DA) и BAT1(например, ASUS TUF Gaming FX706II). [Править] А еще есть BATC.
Таким образом, хотя ноутбуки ASUS поддерживают ограничение зарядки аккумулятора, начиная с Linux 5.4, это возможно только для ноутбуков с BAT0. Для ноутбуков ASUS, использующих BATTв качестве основного имени батареи, вам потребуется ядро 5.7 , а для BAT1вас потребуется ядро 5.8 (в инструкциях ниже вы увидите, как именно проверить имя батареи). [Изменить] Для ноутбуков ASUS, использующих имя батареи BATC, вам необходимо использовать Linux 5.9 или новее.
Кроме того, не все ноутбуки ASUS поддерживают настройку порога заряда батареи, поэтому в зависимости от модели вашего ноутбука ASUS это может работать или не работать для вас; нет списка поддерживаемых устройств, которые я мог бы найти.
Важно отметить, что метод ядра WMI для установки порога заряда батареи для ноутбуков ASUS может установить только значение остановки ( charge_control_end_threshold) (он также не может установить порог запуска). Кроме того, при подключении переменного тока, если уровень заряда батареи выше порога остановки зарядки, она не будет разряжаться до порога остановки.
И еще одно замечание. С моим ASUS ZenBook 14 UX433FAC под управлением Ubuntu 20.04 с оболочкой GNOME, при ограничении зарядки аккумулятора, когда уровень заряда равен или превышает порог заряда, а затем подключить ноутбук к сети переменного тока, индикатор батареи на верхней панели меняется с оставшегося времени пока батарея не разрядится до времени, оставшегося до зарядки батареи. Это происходит, даже если аккумулятор не заряжается. Через некоторое время (так что это не происходит мгновенно, когда вы подключаете ноутбук к сети переменного тока), индикатор батареи меняется на «Не заряжается», как и должно быть.
Помимо ASUS, некоторые ноутбуки Lenovo и Huawei (последний получил поддержку Linux 5.5 ) также имеют поддержку ограничения зарядки аккумулятора. Но поскольку у меня есть только ноутбук ASUS и я не могу протестировать его на других устройствах, это руководство предназначено только для ASUS. Lenovo поддерживает это уже довольно давно, а TLP поддерживает встроенную настройку (только для IBM/Lenovo ThinkPad). В качестве примечания, вот графический интерфейс для TLP , чтобы легко настроить его, если вы еще не используете его.
1. Узнайте название аккумулятора вашего ноутбука ASUS.
Давайте начнем с выяснения названия батареи для вашего ноутбука ASUS. Это можно сделать с помощью следующей команды:
Эта команда должна вывести что-то вроде этого:
В этом примере (из моего ноутбука ASUS) имя батареи — BAT0, но, как я упоминал выше, для вас это также может быть BAT1 или BATT, это единственные имена батарей, поддерживаемые ядром для ноутбуков ASUS.
2. Создайте службу systemd для установки порога остановки заряда батареи при загрузке.
Перед созданием службы systemd проверьте, есть ли на вашем ноутбуке charge_control_end_threshold( /sys/class/power_supply/BAT*без нее это не сработает):
Если эта команда возвращает путь к charge_control_end_threshold, ваш ноутбук ASUS поддерживает ограничение зарядки аккумулятора. Если команда возвращает ошибку о том, что такого файла или каталога нет, значит, ваш ноутбук не поддерживает установку порога заряда.
Если на вашем ноутбуке ASUS есть этот файл, мы можем продолжить. Создайте файл, который мы будем называть battery-charge-threshold.service./etc/systemd/system
Вы можете открыть этот файл в текстовом редакторе консоли по умолчанию, используя:
sudo gedit /etc/systemd/system/battery-charge-threshold.service
или любой другой графический редактор, который вы хотите использовать (например, чтобы Gedit открывал этот файл как root :)gedit admin:///etc/systemd/system/battery-charge-threshold.service
В этот файл вам нужно будет вставить следующее:
Description=Set the battery charge threshold
ExecStart=/bin/bash -c ‘echo CHARGE_STOP_THRESHOLD > /sys/class/power_supply/BATTERY_NAME/charge_control_end_threshold'[Install]
Здесь измените BATTERY_NAME на название батареи ( BAT0, BAT1 или BATT) и CHARGE_STOP_THRESHOLD на порог остановки заряда батареи, который вы хотите использовать (в диапазоне от 1 до 100). Обратите внимание, что один пользователь не мог установить порог заряда на любое значение, а только на 60, 80 и 100.
Из того, что я читал, для наилучшего срока службы батареи, когда ноутбук большую часть времени подключен к сети переменного тока, установите порог остановки заряда батареи на уровне 50 или 60. Если батарея используется довольно часто, установите порог остановки зарядки батареи на уровне 50 или 60. около 90.
3. Включите и запустите службу systemd battery-charge-threshold.
Теперь давайте включим и запустим только что созданный сервис systemd battery-charge-threshold:
sudo systemctl enable battery-charge-threshold.service
sudo systemctl start battery-charge-threshold.service
С помощью systemd 220 можно включить и запустить службу напрямую с помощью systemctl enable —now, но я предпочитаю использовать 2 команды на случай, если некоторые читатели используют более старую версию systemd.
Если вы хотите изменить пороговый уровень остановки заряда батареи, вам нужно отредактировать /etc/systemd/system/battery-charge-threshold.serviceфайл и изменить число в ExecStart строке (после echo) на новое значение, которое вы хотите использовать, а затем перезагрузить systemd (поскольку содержимое файла изменилось ) и перезапустите службу systemd с помощью следующих команд:
sudo systemctl daemon-reload
sudo systemctl restart battery-charge-threshold.service
4. Убедитесь, что порог остановки заряда аккумулятора работает.
Если ваш ноутбук ASUS поддерживает это, предел зарядки аккумулятора теперь должен быть установлен на значение, которое вы использовали на шаге 2.
Вы можете проверить это, зарядив свой ноутбук до порога, установленного в battery-charge-threshold.service, а затем использовать эту команду:
Замените BATTERY_NAME на название батареи, как описано в шаге 1.
Если порог остановки заряда батареи работает, команда должна показать следующий вывод:
Если он говорит «Discharging», убедитесь, что ваш ноутбук ASUS действительно работает от сети переменного тока, а не от батареи. Однако, если он говорит «Charging», ну. тогда ваш ноутбук заряжается выше порога остановки зарядки, так что это не работает для вас, либо потому, что ваш ноутбук ASUS не поддерживает это (что странно, если у вас есть charge_control_end_threshold как упоминается в шаге 2), либо вы используете версию Linux, которая слишком старая для ограничения зарядки аккумулятора на вашем ноутбуке ASUS, ну или из-за человеческой ошибки .
Дополнительно: если вы не используете systemd, вы также можете сделать это с помощью cron, запустив
и вставив следующую строку, хотя это не во всех случаях надежно из того, что я читал (я не уверен, почему):
@reboot echo CHARGE_STOP_THRESHOLD > /sys/class/power_supply/BATTERY_NAME/charge_control_end_threshold
Замените CHARGE_STOP_THRESHOLD на пороговое значение остановки заряда батареи, которое вы хотите использовать, и BATTERY_NAME на имя батареи, как показано на шаге 1.
Зачем использовать службу systemd или задание cron? Согласно пользователю u/esrevartb, от которого я адаптировал эти инструкции, « кажется, что правило udev не работает либо потому, что путь sysfs батареи еще не инициализирован, когда правило применяется, либо потому, что этот конкретный атрибут charge_control_end_threshold не может быть модифицировал таким образом ».
Добавлено. Чтобы легко установить порог заряда для ноутбуков ASUS (автоматическая настройка службы systemd и возможность изменить порог заряда с помощью команды), а также проверить текущий порог заряда, см . bat .
В TLP 1.4.0 также добавлена поддержка ограничения зарядки аккумулятора на ноутбуках ASUS.
У меня на ASUS tuf A15 в ОС Fedora 36 workstation команда:
однако, процесс заряда не превышает установленных мною 60%
How can I limit battery charging to 80% capacity?
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?
15 Answers 15
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.
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.
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?
@æ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.
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/…
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.