Recently battery in my notebook started to behave erratically. It will charge only to 70-80% of its maximum capacity. I suspect that it is probably slowly dying, so I will have to replace it soon, but at first, I will look at several utilities to monitor battery capacity.
sysfs
You can quickly get battery status using sysfs filesystem without any additional utilities.
$ ls /sys/class/power_supply/BAT0/
alarm current_now model_name status uevent
charge_full cycle_count power subsystem voltage_min_design
charge_full_design device present technology voltage_now
charge_now manufacturer serial_number type
$ cat /sys/class/power_supply/BAT0/charge_full_design
5856000
$ cat /sys/class/power_supply/BAT0/charge_full
4785000
$ cat /sys/class/power_supply/BAT0/charge_now
2206000
$ cat /sys/class/power_supply/BAT0/status
Charging
ACPI utilities
ACPI utilities will provide information in a more user-friendly form.
$ acpi -bi
Battery 0: Charging, 50%, 01:44:12 until charged
Battery 0: design capacity 5856 mAh, last full capacity 4785 mAh = 81%
$ acpitool -B
Battery #1 : present
Remaining capacity : unknown, 50.14%, 01:44:20
Design capacity : 5856 mA
Last full capacity : 4785 mA, 81.71% of design capacity
Capacity loss : 18.29%
Present rate : 1372 mA
Charging state : Charging
Battery type : Li-ion
Model number : Dell
Serial number : 2372
IBAM
Intelligent Battery Monitor uses statistical and adaptive linear methods to provide accurate estimations of the time needed until full recharge.
Install ibam package.
$ sudo apt-get install ibam
To view graphs, you need to install gnuplot-qt (KDE) or gnuplot-x11 package.
$ sudo apt-get install gnuplot-qt
Edit /etc/rc.local file as root and add the following commands.
#!/bin/sh -e
# IBAM for milosz desktop user
watch -n 60 su milosz -c ibam > /dev/null &
exit 0
After the system reboot, statistics will be collected every minute as a milosz user, so replace milosz with your username.
Monitor battery capacity.
$ ibam -ra
Bios percentage: 58 %
Battery percentage: 66 %
Soft low percentage limit: 5 %
Charge percentage: 58 %
Bios time left: 1:28:32
Battery time left: 1:55:47
Adapted battery time left: 1:32:53
Charge time left: 1:24:51
Adapted charge time left: 1:45:46
Total battery time: 2:55:36
Adapted total battery time: 2:20:53
Total charge time: 3:23:28
Adapted total charge time: 4:13:37
Profile logging enabled.
Current file: /home/milosz/.ibam/profile-001-charge
View the battery graph.
$ ibam -r --plot
Charge time left: 2:25:06
Adapted charge time left: 2:23:04
battery-stats
It didn’t work for me because of init_acpi_acadapt() returned NOT_SUPPORTED bug.
RRDtool
You can graph battery capacity (or even all available data) using rrdtool, although it requires a little bit more research.
Install rrdtool package.
$ sudo apt-get install rrdtool
I will use ~milosz/.battery directory to store rrd file and shell scripts.
$ mkdir ~/.battery
Read and take note of the maximum capacity value as it will be used in the next step.
$ cat /sys/class/power_supply/BAT0/charge_full_design
5856000
Create rrd file to store battery statistics. The maximum battery charge value is 5856 mAh, so I will use <0,6000> mAh as an acceptable range of values.
Stored values:
- one per minute for the first day
- one per three minutes for the first week
- one per five minutes for the first month.
$ rdtool create ~/.battery/battery_capacity.rrd -s 60 DS:capacity:GAUGE:120:0:6000 \
RRA:MAX:0.5:1:1440 \
RRA:MAX:0.5:3:5040 \
RRA:MAX:0.5:5:8928
Create ~/.battery/update_battery_charge.sh script as it will be used to read and store battery charge value. Modify rrd_file for the same reason as earlier.
#!/bin/sh
# Update battery charge level
rrd_file="/home/milosz/.battery/battery_capacity.rrd"
charge_now=`cat /sys/class/power_supply/BAT0/charge_now`
charge_now=`expr ${charge_now} / 1000`
rrdtool update ${rrd_file} N:${charge_now}
Set executable bit.
$ chmod +x ~/.battery/battery_update_charge.sh
Edit /etc/rc.local file as root and replace milosz with your username. Statistics will be collected every minute as milosz user. Execute command directly or reboot the system.
#!/bin/sh -e
# Update battery charge level rrd file for milosz desktop user
watch -n 60 su milosz /home/milosz/.battery/update_battery_charge.sh
exit 0
To create create nice looking graphs create ~/.battery/graph_battery_charge.sh script and modify rrd_file and destination variables.
#!/bin/sh
# Create "battery charge level" graphs for 1 day, 1 week and 1 month
rrd_file="/home/milosz/.battery/battery_capacity.rrd"
destination="/home/milosz/.battery/"
for period in "1d" "1w" "1m"
do
/usr/bin/rrdtool graph - \
--imgformat=PNG -N \
--start=-${period} \
--end=-60 \
--title="Battery capacity - ${period}" \
--rigid \
--base=1000 \
--full-size-mode \
--height=210 \
--width=590 \
--upper-limit=6000 \
--lower-limit=0 \
--vertical-label="mAh" \
--slope-mode \
--border 0 \
--color BACK#FFFFFF \
--color GRID#FFFFFF \
--color MGRID#FFFFFF \
DEF:a=${rrd_file}:capacity:MAX \
HRULE:5856#FF0000:"Maximum battery capacity" \
CDEF:b=a,UN,PREV,a,IF \
LINE:b#dddddd \
LINE:a#000FF0FF:"Battery capacity" > ${destination}battery_charge_level_${period}.png
done
Set executable bit.
$ chmod +x ~/.battery/graph_battery_charge.sh
Execute it periodically to regenerate battery graphs (use cron to automate task) and view at the graphs located in ~/.battery directory.