i3 / i3status

Generates status bar to use with i3bar, dzen2 or xmobar
BSD 3-Clause "New" or "Revised" License
600 stars 252 forks source link

insane battery percentage #324

Open AloisMahdal opened 5 years ago

AloisMahdal commented 5 years ago

Hi,

one of my battery has really crazy percentage:

[...]
{
  "name": "battery",
  "instance": "/sys/class/power_supply/BAT0/uevent",
  "markup": "none",
  "full_text": "73%"
},
{
  "name": "battery",
  "instance": "/sys/class/power_supply/BAT1/uevent",
  "markup": "none",
  "full_text": "-1496999936%"
},
[...]

i3status strace.log upower-d.txt

$ i3status --version
i3status 2.12-71-ga84ad18 (2018-11-17)...
AloisMahdal commented 5 years ago

Also this might help:

$ head /sys/class/power_supply/BAT*/*
==> /sys/class/power_supply/BAT0/alarm <==
1605000

==> /sys/class/power_supply/BAT0/capacity <==
99

==> /sys/class/power_supply/BAT0/capacity_level <==
Normal

==> /sys/class/power_supply/BAT0/cycle_count <==
0

==> /sys/class/power_supply/BAT0/device <==

==> /sys/class/power_supply/BAT0/energy_full <==
32110000

==> /sys/class/power_supply/BAT0/energy_full_design <==
44000000

==> /sys/class/power_supply/BAT0/energy_now <==
32050000

==> /sys/class/power_supply/BAT0/manufacturer <==
SANYO

==> /sys/class/power_supply/BAT0/model_name <==
45N1037

==> /sys/class/power_supply/BAT0/power <==

==> /sys/class/power_supply/BAT0/power_now <==
0

==> /sys/class/power_supply/BAT0/present <==
1

==> /sys/class/power_supply/BAT0/serial_number <==
 4496

==> /sys/class/power_supply/BAT0/status <==
Unknown

==> /sys/class/power_supply/BAT0/subsystem <==

==> /sys/class/power_supply/BAT0/technology <==
Li-ion

==> /sys/class/power_supply/BAT0/type <==
Battery

==> /sys/class/power_supply/BAT0/uevent <==
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Unknown
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11100000
POWER_SUPPLY_VOLTAGE_NOW=12428000
POWER_SUPPLY_POWER_NOW=0
POWER_SUPPLY_ENERGY_FULL_DESIGN=44000000
POWER_SUPPLY_ENERGY_FULL=32110000

==> /sys/class/power_supply/BAT0/voltage_min_design <==
11100000

==> /sys/class/power_supply/BAT0/voltage_now <==
12428000

==> /sys/class/power_supply/BAT1/alarm <==
0

==> /sys/class/power_supply/BAT1/capacity <==
-1497000

==> /sys/class/power_supply/BAT1/capacity_level <==
Normal

==> /sys/class/power_supply/BAT1/cycle_count <==
0

==> /sys/class/power_supply/BAT1/device <==

==> /sys/class/power_supply/BAT1/energy_full <==

==> /sys/class/power_supply/BAT1/energy_full_design <==

==> /sys/class/power_supply/BAT1/energy_now <==
14970000

==> /sys/class/power_supply/BAT1/manufacturer <==

==> /sys/class/power_supply/BAT1/model_name <==

==> /sys/class/power_supply/BAT1/power <==

==> /sys/class/power_supply/BAT1/power_now <==
0

==> /sys/class/power_supply/BAT1/present <==
1

==> /sys/class/power_supply/BAT1/serial_number <==

==> /sys/class/power_supply/BAT1/status <==
Unknown

==> /sys/class/power_supply/BAT1/subsystem <==

==> /sys/class/power_supply/BAT1/technology <==
Unknown

==> /sys/class/power_supply/BAT1/type <==
Battery

==> /sys/class/power_supply/BAT1/uevent <==
POWER_SUPPLY_NAME=BAT1
POWER_SUPPLY_STATUS=Unknown
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Unknown
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000
POWER_SUPPLY_VOLTAGE_NOW=11970000
POWER_SUPPLY_POWER_NOW=0
POWER_SUPPLY_ENERGY_NOW=14970000
POWER_SUPPLY_CAPACITY=-1497000

==> /sys/class/power_supply/BAT1/voltage_min_design <==
10800000

==> /sys/class/power_supply/BAT1/voltage_now <==
11970000
$
eplanet commented 5 years ago

Thanks for the very detailed report! Just for information, battery state is only read from /sys/class/power_supply/BAT%d/uevent files.

So for /sys/class/power_supply/BAT1/uevent that is the culprit here, one preliminary question, has that battery reported a correct value in the past? You can see that POWER_SUPPLY_CAPACITY has negative value that is almost exactly the percentage value displayed. It's very likely that the value is invalid and that shouldn't be taken into account. I didn't make sure POWER_SUPPLY_CAPACITY > 0 when capacity support was introduced in #216, so maybe we should do that here.

That being said, I can only have that output when using your values: UNK inf%. But reproducing output for battery, that is accumulating values and comparing it through time is very tricky.

AloisMahdal commented 5 years ago

[...] has that battery reported a correct value in the past?

At least from i3status POV, it has always been normal. And after a day or so, I noticed that it's back to normal.

[...] You can see that POWER_SUPPLY_CAPACITY has negative value that is almost exactly the percentage value displayed. It's very likely that the value is invalid and that shouldn't be taken into account. I didn't make sure POWER_SUPPLY_CAPACITY > 0 when capacity support was introduced in #216, so maybe we should do that here.

One thing that I did not mention, and definitely should have: I got this result after turning on the laptop after it was sitting in a wardrobe, powered off for relatively long time (1-2 weeks).

I don't know a lot about batteries, but from what I've heard, kernel is supposed to regularly refresh some meta-data related to battery degradation. Since that could not have happened for long time, maybe this might make sense: some part of this data has changed more than usual, and now either there's bug in kernel module, or there's bug in battery firmware, or this is a strange way of kernel to say "we don't know".

Stunkymonkey commented 4 years ago

i think this should have been prevented by print_battery_info.c#L618.

snprajwal commented 3 years ago

This is not an i3status since it only reads from the sys/class/power_supply/BAT%d/ files and writes them to STDOUT. Looks like the kernel was reporting the battery stats incorrectly.