- /lib/systemd/system-sleep/batenergy.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/usr/bin/env bash FILE=/tmp/batenergy.dat ADP=(/sys/class/power_supply/A*) BAT=(/sys/class/power_supply/BAT*) [[ -e $BAT ]] || exit state=$1 sleep_type=$2 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 else if (( ! voltage_now )); then (( voltage_now = $(< "$BAT"/voltage_now) )) # µV fi (( var = $(< "$BAT"/charge_$when) * voltage_now / 1000000000 )) # mWh fi } read_energy now read_energy full if [[ -f $ADP/online ]]; then read online < "$ADP"/online if (( online )); then echo "Currently on mains." else echo "Currently on battery." fi 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 hours=$(($time_diff / 3600)) minutes=$(($time_diff % 3600 / 60)) echo "Duration of $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)." printf "Sleep %02dh:%02dm, %.2f%% (%d mWh), %.2f%%/h (%d mW)" $hours $minutes $energy_diff_pct $energy_diff $avg_rate_pct $avg_rate > /tmp/batenergy.txt printf "[$(date +"%Y%m%d %H:%M")] Sleep %02dh:%02dm, %.2f%% (%d mWh), %.2f%%/h (%d mW)\n" $hours $minutes $energy_diff_pct $energy_diff $avg_rate_pct $avg_rate >> /var/log/batenergy.txt ;; esac |
- notify_bat_usage.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash # 检查是否存在记录文件 FILE="/tmp/batenergy.txt" # 监听 D-Bus 锁屏状态变化 dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \ while read line; do # 当检测到解锁(boolean false 表示未锁屏) if echo "$line" | grep -q "boolean false"; then if [ -f "$FILE" ]; then # 等待 2 秒确保桌面环境已完全就绪 sleep 1 STATS=$(cat "$FILE") # 发送通知 notify-send "Suspend Power Report" "$STATS" --icon=battery-good sudo rm $FILE fi fi done |
- .config/autostart/notify_bat_usage.desktop
|
1 2 3 4 5 6 |
[Desktop Entry] Name=Bat_Usage_Notify Exec=/path/to/notify_bat_usage.sh Terminal=false Type=Application X-GNOME-Autostart-enabled=true |