Деградация батареи в Linux (ru)

linux

Мы все знаем, что батарея не вечна. Это нормально — можно заменить изношенную батарею в сервисе и снова использовать устройство. Но очень полезно видеть текущее состояние батареи. В 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

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

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

$$ \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;
}

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

Thanks for reading!

I'd love to hear your comments on the email.