E laserattack

programming for fun

Система

Проблема

системный мониторинг батареи всегда показывает 100%, независимо от реального уровня заряда

Симптомы

Диагностика

ACPI запрос _BST (Battery Status)

echo '\_SB_.BAT0._BST' | sudo tee /proc/acpi/call
sudo cat /proc/acpi/call

вывод: [0x0, 0xffffffff, 0xdd60, 0x4173]

расшифровка:

ACPI запрос _BIF (Battery Information)

echo '\_SB_.BAT0._BIF' | sudo tee /proc/acpi/call
sudo cat /proc/acpi/call

вывод [0x1, 0xdd60, 0xdd60, 0x1, 0x3c28, 0x1a96, 0xf83, 0x1fe, 0x8d, "Primary", " ", "LION", "Hewlett-Packard"]

Причина

контроллер батареи (EC) не может измерить ток (скорость разряда/заряда), из-за чего:

  1. Не обновляется счётчик энергии (energy_now)
  2. Система не может вычислить реальный процент заряда
  3. power_now недоступен

при этом напряжение измеряется напрямую и работает корректно

Решение

использовать напряжение батареи для оценки процента заряда вместо неработающего счётчика энергии

скрипт который пишет текущий вольтаж в системный лог (socklog)

#!/usr/bin/env bash

VOLTAGE=$(cat /sys/class/power_supply/BAT0/voltage_now)
VOLTAGE_MV=$((VOLTAGE / 1000))

logger -t "current battery voltage" "${VOLTAGE_MV}"

поставил его на крон раз в минуту, чтобы всегда можно было посмотреть

таким образом можно будет спустя какое то время на зарядке узнать максимальное значение, и его использовать типо как 100% заряда батареи, а потом разрядить ноут и посмотреть минимальное и использовать его как 0% заряда. и текущий процент считать относительно их

конечно измерение заряда на основе напряжения дает погрешность в точности, но это хотя бы что то

вообще нашел статью

там написано

Lithium-ion cells are susceptible to stress by voltage ranges outside of safe ones between 2.5 and 3.65/4.1/4.2 or 4.35 V (depending on the components of the cell)

т.е. минимум 2.5 V на элемент, на 4 элемента как у меня в батарее это значит 10 V а максимум зависит от конкретной батареи, нейросеть говорит что для моей 4.2 V, т.е. на 4 элемента это 16.8 V

по моим логам максимум где то 16.76

~
[serr@lap]-> sucklog user | grep battery
2026-09-05T12:31:01.15228 user.notice: Sep  5 15:31:01 current battery voltage: 16765
2026-09-05T12:32:01.15999 user.notice: Sep  5 15:32:01 current battery voltage: 16765
2026-09-05T12:33:01.16847 user.notice: Sep  5 15:33:01 current battery voltage: 16764
2026-09-05T12:34:01.17606 user.notice: Sep  5 15:34:01 current battery voltage: 16764
2026-09-05T12:35:01.18485 user.notice: Sep  5 15:35:01 current battery voltage: 16764
2026-09-05T12:36:01.19382 user.notice: Sep  5 15:36:01 current battery voltage: 16764
2026-09-05T12:37:01.20235 user.notice: Sep  5 15:37:01 current battery voltage: 16764
2026-09-05T12:38:01.20998 user.notice: Sep  5 15:38:01 current battery voltage: 16764
2026-09-05T12:39:01.21902 user.notice: Sep  5 15:39:01 current battery voltage: 16764
2026-09-05T12:40:01.22840 user.notice: Sep  5 15:40:01 current battery voltage: 16764
2026-09-05T12:41:01.23742 user.notice: Sep  5 15:41:01 current battery voltage: 16765

а 10 V это конечно абсолютный минимум до которого не опустится

тут например сказано

Typically, Li-ion cells operate with a discharge cutoff around 3.0V

т.е. это 12 V на 4 элемента, такое и возьму за минимум пока что, потом мб подкорректирую по логам

т.е. пока что вот так считаю зарядку

#!/usr/bin/env bash

MAX_VOLTAGE=16800
MIN_VOLTAGE=12000

VOLTAGE=$(cat /sys/class/power_supply/BAT0/voltage_now)
VOLTAGE_MV=$((VOLTAGE / 1000))

PERCENT=$(echo "scale=0; ($VOLTAGE_MV - $MIN_VOLTAGE) * 100 / ($MAX_VOLTAGE - $MIN_VOLTAGE)" | bc)

[ $PERCENT -gt 100 ] && PERCENT=100
[ $PERCENT -lt 0 ] && PERCENT=0

echo "BAT ${PERCENT}% (${VOLTAGE_MV}mV)"

Posted on 5th September 2026