Мы все знаем, что батарея не вечна. Это нормально — можно заменить изношенную батарею в сервисе и снова использовать устройство. Но очень полезно видеть текущее состояние батареи. В MacOS это стандартная функция, в Linux мы, конечно, можем сделать то же самое. Давайте разберёмся!

Сначала мы поймём, как найти нужное значение, а затем создадим красивый минималистичный модуль для waybar.

Находим значение деградации батареи

Сначала получим список всех устройств питания:

upower -e

Затем найдём батарею в этом списке:

upower -e | grep BAT

# For example:
# /org/freedesktop/UPower/devices/battery_BATT

Затем получим детальную информацию об этом устройстве:

upower -i $(upower -e | grep BAT)

Мы получим что-то вроде этого:

  native-path:          BATT
  vendor:               DESAY
  model:                BASE-BAT
  serial:               1
  power supply:         yes
  updated:              Fri Jul 11 11:37:00 2025 (7 seconds ago)
  has history:          yes
  has statistics:       yes
  battery
    present:             yes
    rechargeable:        yes
    state:               charging
    warning-level:       none
    energy:              25.514 Wh
    energy-empty:        0 Wh
    energy-full:         47.5052 Wh
    energy-full-design:  59.4247 Wh
    energy-rate:         11.1573 W
    voltage:             11.972 V
    charge-cycles:       650
    time to full:        2.0 hours
    percentage:          53%
    capacity:            79.9417%
    technology:          lithium-ion
    charge-start-threshold:        75%
    charge-end-threshold:          80%
    charge-threshold-supported:    yes
    icon-name:          'battery-good-charging-symbolic'
  History (charge):
    1752222927	53.000	charging
  History (rate):
    1752223020	11.157	charging
    1752222990	11.123	charging
    1752222987	11.192	charging
    1752222957	10.822	charging
    1752222927	10.857	charging

Здесь много интересной информации, например количество циклов зарядки, время до полной зарядки и т.д. Сейчас нас интересуют два параметра:

  • energy-full-design — изначальный полный объём батареи

  • energy-full — текущий объём батареи

Разница между этими параметрами и есть деградация батареи:

\text{Degradation} = \left(1 - \frac{E_{\text{full}}}{E_{\text{design}}}\right) \times 100\%

Теперь посчитаем этот показатель в процентах.

Сначала найдём эти параметры и разделим их:

upower -i $(upower -e | grep BAT) | awk '\
	/energy-full:/ {ef=$2}\
	/energy-full-design:/ {efd=$2}\
	END {print ef/efd}'

Затем посчитаем процентное значение:

echo "(1 - $(upower -i $(upower -e | grep BAT) | awk '\
        /energy-full:/ {ef=$2}\
        /energy-full-design:/ {efd=$2}\
        END {print ef/efd}')) * 100 + 0.5" \
	| bc

# Output example:
# 20.558200

На последнем шаге нам нужно округлить значение:

echo "(1 - $(upower -i $(upower -e | grep BAT) | awk '\
        /energy-full:/ {ef=$2}\
        /energy-full-design:/ {efd=$2}\
        END {print ef/efd}')) * 100 + 0.5" \
	| bc \
	| cut -d'.' -f1

# Output example:
# 20

Модуль для Waybar

В моём конфиге waybar ~/.config/waybar/config.json я добавил два модуля в правую секцию, но вы можете сделать как вам удобно. В итоге я получил это:

Если вам нравятся мои обои, вы можете найти их и другие классные штуки в моём репозитории dotfiles на GitHub. Не забывайте: я люблю ваши звёзды!

Посмотрим:

{
  ...
  "modules-left": [...],
  "modules-center": [...],
  "modules-right": [
    "battery",
    "custom/battery-degradation",
	...
  ],
  ...

Первый модуль — стандартный battery, у меня он отлично работает на hyprland. Здесь мы определяем уровни хорошего, предупреждающего и критического уровня заряда, задаём nerd-иконки для разных состояний батареи:

"battery": {
  "states": {
    "good": 90,
    "warning": 25,
    "critical": 10
  },
  "format": "{icon} {capacity}%",
  "format-charging": " {capacity}%",
  "format-plugged": " {capacity}%",
  "format-icons": ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"],
  "tooltip": "{time}",
  "style": "{capacity < 10 ? 'color: red;' : 'color: normal;'}"
}

Второй модуль — тема сегодняшнего разговора:

"custom/battery-degradation": {
  "format": " {}%",
  "interval": "once",
  "exec": "~/scripts/battery-degradation.sh",
  "tooltip": false
}

Я поместил нашу команду в скрипт — так удобнее. Вы можете сделать так же, не забудьте добавить shebang #!/bin/bash и:

chmod +x ~/scripts/battery-degradation.sh

В модуле мы определяем формат с nerd-иконкой и процентом, отключаем подсказку и устанавливаем однократный запуск при старте waybar.

И завершаем эти модули CSS-стилем:

#battery,
#custom-battery-degradation {
  background: #1e1e2e;
  opacity: 0.7;
  padding: 0px 10px;
  margin: 3px 0px;
  margin-top: 5px;
  border: 0px solid #181825;
}

#battery {
  padding-right: 10px;
  border-radius: 10px 0px 0px 10px;
  min-width: 50px;
}

#custom-battery-degradation {
  border-radius: 0px 10px 10px 0px;
  margin-right: 5px;
  min-width: 35px;
}

#battery.critical {
  color: red;
}

Готово! В результате:

Если вам понравилось, приходите на блог и подписывайтесь в Telegram!

Комментарии (29)


  1. vdudouyt
    19.08.2025 18:55

    В KDE по дефолту есть, кстати говоря. Если нажать на значок батареи.


    1. eri
      19.08.2025 18:55

      в гноме в настройках


    1. Grigo52
      19.08.2025 18:55

      В KDE удобно, но точных цифр не выдаёт, поэтому такие скрипты до сих пор актуальны


  1. Grigo52
    19.08.2025 18:55

    Мониторинг мониторингом, а деградацию не остановишь


    1. batChar
      19.08.2025 18:55

      Устройство использует только зарядку
      Устройство использует только зарядку


      1. Galy4a
        19.08.2025 18:55

        Мак из коробки это делает без дополнительного софта, просто останавливает зарядку на 80 процентах и питается только от провода, если ноутбук давно не снимался с зарядки.


        1. batChar
          19.08.2025 18:55

          Не совсем так. Встроенная функция MacOS ограничивает зарядку заданным уровнем, но батарея при этом все равно задействуется - она то подзаряжается, то слегка разряжается.


          1. Galy4a
            19.08.2025 18:55

            У меня за три года использования этой функции набежало меньше 50 циклов (ноутбук не все 100% времени был на проводе) и показывает полный ресурс батареи. Субъективное мнение, но мне это кажется достаточным.


          1. edo1h
            19.08.2025 18:55

            Интересно, как приложение может на это повлиять


        1. Mur81
          19.08.2025 18:55

          Когда-то давно такое можно было увидеть в рандомном ширпотребном ноутбуке (настраивалось в биосе). Потом "почему-то" (вечная батарея не нужна производителю) это или пропало вовсе, или переехало в программу (котрую мало кто ставит если сносит заводскую винду). На аппаратном уровне осталась во всяких "профессиональных" линейках. Например такое есть в HP ProBook. Так что не Маком единым.


      1. grrom
        19.08.2025 18:55

        в kde такие ограничения так же можно задать. настроено 6 лет уже. Начало зарядки при меньше 60%, предел зарядки до 80, если от провода, то проценты стоят на месте и заряд не тратится, ресурс батареи за это время упал на 11%


        1. batChar
          19.08.2025 18:55

          Прикольно, тоже самое что AlDente - только бесплатно


      1. ogost
        19.08.2025 18:55

        Под Linux или Windows я подобного решения не встречал.

        На некоторых ThinkPad лет 10 назад это уже было. Под виндой настраивается фирменной утилитой, под линем есть tlp.

        Кроме ThinkPad встречал только на ещё двух ноутах других производителей. То есть фича не то, чтобы отсутствующая на PC, но вроде как относительно редкая.

        У самого до сих пор Т480 с такой функцией, покупал новым в 2018, сейчас ёмкость 81.3% от изначальной. То есть деградация на 19% за 7 лет. Что очень даже неплохо, я считаю. Обычно уже через 5 лет ноуты не держат и полчаса.


      1. gaussssss
        19.08.2025 18:55

        Это вопрос не операционки а железной реализации. Если байпасса нет - ось не поможет. И да, в ноутах не от эппл это бывает в наличии.


      1. salieff
        19.08.2025 18:55

        А разве не все нормальные контроллеры заряда в 21 веке должны так работать? Типа, ноут должен быть запитан только от сети, при ее доступности. Батарея должна заряжаться по гистерезису - входить в новый цикл заряда только после разряда до (условно) 95%. В батарее должна быть учтена емкостная динамика, типа, заряд до 97.5% от максимально возможной емкости позволит избежать процессов деградации при эксплуатации до 5°C.

        И этот, вроде бы, тривиальный набор алгоритмов полностью нивелирует ситуацию "батарея медленно умирает, потому что ноут постоянно воткнут в розетку"?

        Или я слишком наивен?


    1. riky
      19.08.2025 18:55

      Почему нет.в Андроиде например есть опция не заряжать более 90 %
      Если в ноуте есть апи для управления зарядкой я бы поставил чтобы зарядка выключалась более 70 80 процентов и включалась когда менее 40 50.
      У большинства наверное нет, но можно сделать внешнее реле с ардуинкой, или умную розетку приспособить, даже тупо настроить чтобы в рабочее время час вкл, час выкл. Если умного дома нет, если есть то в можно прокидывать зарядку в home assistant и из него управлять розеткой.


  1. usrsse2
    19.08.2025 18:55

    Заголовок кликбейтный, кажется, что статья про то, как использование Linux приводит к деградации батареи. Лучше было бы назвать, например, "Степень исправности аккумулятора в Linux" (как в macOS в информации о системе) или "Отображение деградации батареи в Linux".

    Кстати, а в какой macOS это штатная функция? Sonoma 14.7 на Intel умеет отображать только "Рекомендуется обслуживание", если полная ёмкость существенно снизилась, и количество циклов, а собственно степень исправности отображает iStat Menus.


  1. Nexoic
    19.08.2025 18:55

    Я думал будет что, чтоб ограничить максимальный заряд если целый день от розетки чтоб не так убивало ее


    1. MxMaks
      19.08.2025 18:55

      Во многих моделях в bios настраивается


  1. Ktulhy
    19.08.2025 18:55

    Тема временем поле capacity: я что для тебя, какая то шутка??


    1. Alchemmist Автор
      19.08.2025 18:55

      Да, абсолютно верно! Многие уже указали на эту ошибку. В ближайшее время упрощу в статье этот момент. Спасибо!


  1. kt97679
    19.08.2025 18:55

    Зачем использовать bc, если все вычисления можно сделать в awk?


  1. baldr
    19.08.2025 18:55

    В принципе, статья хороша как пример кастомизации Linux - можно вывести любой другой индикатор.

    Показывать в трее имеет смысл какие-то более динамичные параметры - температуру, загрузку, память. Деградация батареи - меняться будет на доли процента в месяц, не стоит она того, чтобы место на экране занимать.


    1. Alchemmist Автор
      19.08.2025 18:55

      Спасибо!
      По поводу более динамических параметров, у меня на скриншоте можно увидеть, что они есть, но для них уже в большинстве случаев есть встроенный waybar модуль, в котором все реализовано.


  1. zababurin
    19.08.2025 18:55

    65 процентов... Это печально. А статья прекрасна


    1. Alchemmist Автор
      19.08.2025 18:55

      Спасибо!


  1. foxb
    19.08.2025 18:55

    capacity: 79.9417%

    Это здоровье аккумулятора


    1. uuger
      19.08.2025 18:55

      Оно ещё и точнее посчитано, судя по всему


    1. Alchemmist Автор
      19.08.2025 18:55

      Да, абсолютно верно! Многие уже указали на эту ошибку. В ближайшее время упрощу в статье этот момент. Спасибо!