当我的笔记本电脑电池充满时,我如何收到通知?

有时候我的充电器即使充电完成后也会一直插在笔记本电脑上。
有没有办法在电池充满时弹出一个消息或通知,或者有没有可以提供这种功能的软件/套件?

根据我注意到的情况,如果你总是将笔记本插上电源,只在真正需要时拔掉,电池的使用寿命会更长。 - danilo
4个回答

我写了一个小脚本可以做到这一点:

screenshot


脚本:

#!/usr/bin/env bash
while true
do
    export DISPLAY=:0.0
    battery_percent=$(acpi -b | grep -P -o '[0-9]+(?=%)')
    if on_ac_power; then
        if [ "$battery_percent" -gt 95 ]; then
            notify-send -i "$PWD/batteryfull.png" "Battery full." "Level: ${battery_percent}% "
        fi
    fi
    sleep 300 # (5 minutes)
done

安装:

运行:

sudo apt-get install acpi
git clone https://github.com/hg8/battery-full-notification.git
cd battery-full-notification/
chmod +x batteryfull.sh

将脚本复制到~/bin文件夹中(为什么是~/bin文件夹?):
cp batteryfull.* ~/bin

或者将其复制到/usr/local/bin,如果您希望它对计算机上的所有用户都可用:
cp batteryfull.* /usr/local/bin

然后将batteryfull.sh脚本添加为启动应用程序,方法如下:
  • 打开Dash
  • 搜索启动应用程序
  • 双击图标
  • 点击添加并按照以下填写:

    startup application batteryfull


安装acpi软件包。现在将以下内容放入return0whencharging.sh文件中,并使其可执行:
#!/bin/sh
acpi -V
if cat /proc/acpi/battery/BAT1/state | grep "charging state" | grep -vE ":[\t ]*charging$"; then
    exit 1
else
    exit 0
fi

如果echo -e "\a"发出声音,那么当你想要查看电池状态时,请开始执行此命令。
watch --beep return0whencharging.sh

如果它没有发出任何声音,或者你想要一个通知和比手表提供的更好的闹钟,那么请安装libnotify-binmpv,并使用以下方法代替:
while return0whencharging.sh; do sleep 1; done; notify-send "Finished charging" && mpv -loop /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
解释
如果你查看grep的man页面,你会发现-v可以反转匹配,因此也反转了返回/状态码。-E表示它是一个正则表达式。正则表达式中的[\t ]表示"制表符或空格"。后面的星号表示"制表符或空格出现0次或多次"。尾部的"$"表示应该匹配行尾。最后的grep表示不以":"结尾、任意数量的制表符或空格,然后是"charging"和行尾的行应该使grep以状态码0退出。这意味着只要计算机正在充电,grep就会返回1。当状态码为0时,if将执行其第一个分支,这意味着我们实际上是否定了grep的结果,因为当grep退出0时,我们使用exit 1,而当grep退出非零时,我们使用exit 0

如果你想要解释这些命令,只需向我提问。 - Janus Troelsen
我不确定这个 grep -vE ":[\t ]*charging$" 会做什么。你能解释一下这些命令吗?谢谢。 - Ankit
添加了解释 - Janus Troelsen
这个 return0whencharging.sh 文件在哪里?如果我创建它,有没有特定的位置我必须保存它? - Parto
@AvatarParto:无论在哪里都不重要。名字也不重要,只要你在所有地方都改掉就行。 - Janus Troelsen

这是我使用的Crontab。
  1. 如果电池充满(等于100%),则通知:
    */1 * * * * if [ $(cat /sys/class/power_supply/BAT0/capacity) -eq 100 ]; then XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "电池已充满"; fi
    
  2. 如果电池电量低(小于或等于10%),则通知:
    */1 * * * * if [ $(cat /sys/class/power_supply/BAT0/capacity) -le 10 ]; then XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "电池电量低"; fi
    
示例通知图像:

Example Notification Image


我也在寻找同样的东西,发现了this扩展程序,它的效果很好。