How can I get notification when my laptop battery gets fully charged?
I have written a small script that will do that:
Script:
#!/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
Installation:
Run:
sudo apt-get install acpi
git clone https://github.com/hg8/battery-full-notification.git
cd battery-full-notification/
chmod +x batteryfull.sh
Copy the script to ~/bin
folder (why the ~/bin folder?) :
cp batteryfull.* ~/bin
Or copy it to /usr/local/bin
if you want it to be available for all users on your computer:
cp batteryfull.* /usr/local/bin
Then add batteryfull.sh
script as a startup application by:
- Open Dash
- Search for Startup Applications
- Double-click the icon
Click Add and fill in as follows:
Install the acpi
package. Now put this in return0whencharging.sh
and make it executable:
#!/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
If echo -e "\a"
makes a sound, start this when you want to watch the battery status:
watch --beep return0whencharging.sh
If it doesn't make any sound or you want a notification and a better alarm than whatever watch can provide, install libnotify-bin
and mpv
and use this instead:
while return0whencharging.sh; do sleep 1; done; notify-send "Finished charging" && mpv -loop /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
Explanation:
If you look at the man page for grep you can see that -v
reverses the matching, and therefore the return/status code. -E
means it's a regular expression. the [\t ]
in the regex (regular expression) means "tab or space". The following star makes it mean "tab or space 0 or more times". The trailing "$" means that it should match the end of the line. The final grep
means that lines NOT ending in a ":", any number of tabs or spaces and then "charging" and the end of the line should make grep
exit with status code 0. This means that grep
will return 1 as long as the computer is charging. The if
will execute it's first branch when the status code is 0, which means we are effectively negating the result of grep
, since we exit 1
when grep exits 0 and exit 0
when grep exists non-zero.