Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ Checking (for) the files referenced in the script (and other files in the contai

## Credits
Inspired by [Oliver Machacik's batdistrack](https://github.com/oliver-machacik/batdistrack).
Asahi Linux Verion by: Erik Quaeghebeur
Asahi Linux fixed by: Anes Lihovac
103 changes: 67 additions & 36 deletions batenergy.sh
Original file line number Diff line number Diff line change
@@ -1,64 +1,95 @@
#!/usr/bin/env bash

FILE=/tmp/batenergy.dat
ADP=(/sys/class/power_supply/A*)
BAT=(/sys/class/power_supply/BAT*)

[[ -e $BAT ]] || exit
# Dynamically detect battery and adapter devices
BAT_PATH=""
ADP_PATH=""
for dev in /sys/class/power_supply/*; do
if grep -q "Battery" "$dev/type" 2>/dev/null; then
BAT_PATH="$dev"
elif grep -q "Mains" "$dev/type" 2>/dev/null; then
ADP_PATH="$dev"
fi
done

if [[ -z $BAT_PATH ]]; then
echo "No battery device found. Exiting."
exit 1
fi

state=$1
sleep_type=$2

now=`date +'%s'`
if [[ -z "$state" || ( "$state" != "pre" && "$state" != "post" ) ]]; then
echo "Usage: $0 [pre|post] [sleep_type]"
exit 2
fi

now=$(date +'%s')

# Read an energy in mWh from /sys/class/power_supply.
# Some firmware only reports charge (in µAh), in which case we convert using voltage.
read_energy() {
local when=$1
local -n var=energy_$when
if [[ -e $BAT/energy_$when ]]; then
(( var = $(< "$BAT"/energy_$when) / 1000 )) # mWh
if [[ -e $BAT_PATH/energy_$when ]]; then
(( var = $(< "$BAT_PATH/energy_$when") / 1000 )) # mWh
elif [[ -e $BAT_PATH/charge_$when && -e $BAT_PATH/voltage_now ]]; then
(( voltage_now = $(< "$BAT_PATH/voltage_now") )) # µV
(( var = $(< "$BAT_PATH/charge_$when") * voltage_now / 1000000000 )) # mWh
else
if (( ! voltage_now )); then
(( voltage_now = $(< "$BAT"/voltage_now) )) # µV
fi
(( var = $(< "$BAT"/charge_$when) * voltage_now / 1000000000 )) # mWh
var=0
fi
}

read_energy now
read_energy full

if [[ -f $ADP/online ]]; then
read online < "$ADP"/online

if [[ -n $ADP_PATH && -f $ADP_PATH/online ]]; then
read online < "$ADP_PATH/online"
if (( online )); then
echo "Currently on mains."
else
echo "Currently on battery."
fi
else
echo "Adapter status unknown."
fi

case $state in
"pre")
echo "Saving time and battery energy before sleeping ($sleep_type)."
echo $now > $FILE
echo $energy_now >> $FILE
;;
"post")
exec 3<>$FILE
read prev <&3
read energy_prev <&3
rm $FILE
time_diff=$(($now - $prev)) # seconds
days=$(($time_diff / (3600*24)))
hours=$(($time_diff % (3600*24) / 3600))
minutes=$(($time_diff % 3600 / 60))
echo "Duration of $days days $hours hours $minutes minutes sleeping ($sleep_type)."
(( energy_diff = energy_now - energy_prev )) # mWh
(( avg_rate = energy_diff * 3600 / time_diff )) # mW
energy_diff_pct=$(bc <<< "scale=1;$energy_diff * 100 / $energy_full") # %
avg_rate_pct=$(bc <<< "scale=2;$avg_rate * 100 / $energy_full") # %/h
echo "Battery energy change of $energy_diff_pct % ($energy_diff mWh) at an average rate of $avg_rate_pct %/h ($avg_rate mW)."
;;
esac
case "$state" in
pre)
echo "Saving time and battery energy before sleeping ($sleep_type)."
echo $now > $FILE
echo $energy_now >> $FILE
;;
post)
if [[ ! -f $FILE ]]; then
echo "No previous data file found."
exit 1
fi
exec 3<>$FILE
read prev <&3
read energy_prev <&3
rm $FILE
time_diff=$((now - prev)) # seconds
days=$((time_diff / (3600*24)))
hours=$((time_diff % (3600*24) / 3600))
minutes=$((time_diff % 3600 / 60))
echo "Duration of $days days $hours hours $minutes minutes sleeping ($sleep_type)."
(( energy_diff = energy_now - energy_prev )) # mWh
if (( time_diff > 0 )); then
avg_rate=$((energy_diff * 3600 / time_diff)) # mW
else
avg_rate=0
fi
if (( energy_full > 0 )); then
energy_diff_pct=$(echo "scale=1; $energy_diff * 100 / $energy_full" | bc)
echo "Battery used: $energy_diff mWh ($energy_diff_pct% of full)"
echo "Average rate: $avg_rate mW"
else
echo "Battery used: $energy_diff mWh"
echo "Average rate: $avg_rate mW"
fi
;;
esac