diff --git a/.local/bin/statusbar/battery b/.local/bin/statusbar/battery index d5a91370..5b4eb42a 100755 --- a/.local/bin/statusbar/battery +++ b/.local/bin/statusbar/battery @@ -1,32 +1,99 @@ #!/usr/bin/env sh # Give a battery name (e.g. BAT0) as an argument. -case $BLOCK_BUTTON in - 3) pgrep -x dunst >/dev/null && notify-send "🔋 Battery module" "🔋: discharging +# Arbitrary but unique appid +# Generated by mashing on my keyboard +appid=1859028 +# Max width of the dunst notifications. May be system dependent? +maxwidth=29 +# Help text +help_text=$(cat <<-EOF +🔋: discharging 🛑: not charging ♻: stagnant charge 🔌: charging ⚡: charged ❗: battery very low! -- Text color reflects charge left" ;; +- Text color reflects charge left +EOF +); + + +# For testing, take the second arg as button press +if ! [ -z $2 ]; then + BLOCK_BUTTON=$2 +fi + + +case $BLOCK_BUTTON in + 1) + # Get current power stats + sudo powertop -q --csv=/tmp/powertop.csv -t=5 >/dev/null 2>&1 + + # Cut out the 'Top 10 Power Consumers' + start_line=$(grep -n "Top 10 Power Consumers" /tmp/powertop.csv \ + | cut -d: -f1) + start_line=$(expr $start_line + 3) + end_line=$(expr $start_line + 9) + + # Parse it out + top_consumers=$(sed -n "$start_line,${end_line}p" /tmp/powertop.csv \ + | grep -v powertop \ + | cut -d';' -f5,4 \ + | sed -Ee \ + "s/Display backlight*/Display/;"` + `"s/Radio device: *//;"` + `"s/\[PID [0-9]*\] *//;"` + `"s,\[([a-z]+)/[0-9:]+\],\1,;"` + `"s/: *([A-Za-z0-9]* *[A-Za-z0-9]*) */:\1/;"` + `"s/[ \t]*$//;"` + `"s,.*/,,;"` + `"s/://g;"` + `"s/[ \t]*;[ \t]*/;/" \ + | tr ';' ':' \ + | column -c $maxwidth -s':' --table -T 1 -R 2) + + # Finally, send! + dunstify -u low -t 20000 -r $appid -i none "🔋 Top Consumers" "$top_consumers" + ;; + 3) + dunstify -u low -r $appid -i none " Battery module" "$help_text" + ;; esac -capacity=$(cat /sys/class/power_supply/"$1"/capacity) || exit -status=$(cat /sys/class/power_supply/"$1"/status) +capacity=$(cat /sys/class/power_supply/"${1:-BAT0}"/capacity) || exit +status=$(cat /sys/class/power_supply/"${1:-BAT0}"/status) + +# `upower` take an average over time which is nice to have for a status bar +# `acpi` is another decent method, but takes an instantaneous average +if [ -x /usr/bin/upower ]; then + time_remaining=" $(upower --show-info /org/freedesktop/UPower/devices/battery_${1-BAT0} | grep 'time to empty' | cut -d: -f2 | xargs)" +elif [ -x /usr/bin/acpi ]; then + time_remaining=$(acpi -b | cut -d, -f3 | cut -d: -f1,2) +fi if [ "$capacity" -ge 75 ]; then - color="#00ff00" + color="#ffffff" elif [ "$capacity" -ge 50 ]; then - color="#ffffff" + color="#ffffff" elif [ "$capacity" -ge 25 ]; then - color="#ffff00" + color="#ffff00" else - color="#ff0000" - warn="❗" + color="#ff0000" + warn="❗" +fi +if [[ $status != "Discharging" ]]; then + time_remaining="" fi [ -z $warn ] && warn=" " [ "$status" = "Charging" ] && color="#ffffff" -printf "%s%s%s\n" "$color" "$(echo "$status" | sed -e "s/,//;s/Discharging/🔋/;s/Not Charging/🛑/;s/Charging/🔌/;s/Unknown/♻️/;s/Full/⚡/;s/ 0*/ /g;s/ :/ /g")" "$warn" "$(echo "$capacity" | sed -e 's/$/%/')" +printf "%s%s%s%%%s\n" \ + "$color" \ + "$(echo "$status" | sed -e "s/,//;s/Discharging/🔋/;s/Not Charging/🛑/;s/Charging/🔌/;s/Unknown/♻️/;s/Full/⚡/;s/ 0*/ /g;s/ :/ /g")" \ + "$warn" \ + "$capacity" \ + "$time_remaining" +