My laptop battery sucks, and lasts up to 5minutes without charging. Sometimes the charger falls out without me knowing, making the computer shut off unexpectedly.

Is there a way to get a notification the moment my charger falls out? not when battery needs to be charged like Ubuntu is used to do(Because that doesn't work for my laptop, and I've given up that idea)

  • check this answer by @JacobVlijm. this answer alert you if battery charge is below 40%. You can change the source to 10% or below. Oct 4 '14 at 15:31
  • Thanks, but not exactly what I'm looking for, there's something wrong with my battery I think, and the percentage showing is incorrect, and it's empty with 95% or something. I'm looking to get a notification for not charging my laptop
    – Jeggy
    Oct 4 '14 at 15:56
  • Just to note that in KDE you could have set it all from GUI only as a standard behavior. Oct 4 '14 at 19:05

Simple linear command:

[[ $(acpi -b | grep -o "Discharging") ]] && notify-send "Alert" "Battery is not charging.\n Please plug your AC adapter!"

From man acpi we have:

       acpi - Shows battery status and other ACPI information    
       acpi [options]    
       acpi Shows information from the /proc or the /sys filesystem, such as battery status or thermal information.    
       -b | --battery
                 show battery information

If you run acpi -b and you battery is charging mode, you will get this result of that:

Battery 0: Charging, 88%, 00:38:17 until charged

And if your battery isn't charging then the result would be like this:

Battery 0: Discharging, 87%, 03:46:06 remaining

Then We are looking "Discharging" in the result with this command:

acpi -b | grep -o "Discharging"

If battery was not in charging the result will "Discharging".

And finally we send an alert to notification if we got "Discharging" from above command:

[[ $(acpi -b | grep -o "Discharging") ]] && notify-send "Alert" "Battery is not charging.\n Please plug your AC adapter!"

Note: [[ Something ]] always true and [[ ! Something ]] always false.

Now it's easiest way that we run it in the background, inside a while loop. Then I put the command into a while loop and I check the battery status between X interval of time. Like this:

while true
    # Our command
    sleep [number of seconds] # check the status every [number of seconds] seconds

And if you want to run the script on startup and every 5 minutes, so the construction would be:

  • Save the script(I named it ChkCharge.sh in my home directory)
  • Add a line in /etc/rc.local to call your script (your ChkCharge.sh) + "&" to make it exit. like bash /home/USERNAME/ChkCharge.sh &.

Final Script

while true
    [[ $(acpi -b | grep -o "Discharging") ]] && notify-send "Alert" "Battery is not charging.\n Please plug your AC adapter!"
    sleep 300 # 300 seconds or 5 minutes

Finish. Reboot and see the magic ;)

  • It's so great to see different ways to achieve the same goal :)
    – Eliezer
    Oct 4 '14 at 17:08
  • The script works great, but the startup thingy doesn't work for me :/ khp.randompoop.net/uploads/… does that look right?
    – Jeggy
    Oct 4 '14 at 18:48
  • 1
    /home/jeggy/.startup/ChkCharge.sh: 4: /home/jeggy/.startup/ChkCharge.sh: [[: not found
    – Jeggy
    Oct 4 '14 at 20:46
  • 1
    @Jeggy use bash instead of sh at the begging and run again Oct 4 '14 at 20:56
  • 1
    alright, thanks. That did work, so I'll just open a new question. I have accepted your answer :)
    – Jeggy
    Oct 4 '14 at 22:07

This looks pretty simple, I'm not a bash script expert, but maybe could be useful for you

# sh script.sh

The script.sh content:

#! /bin/bash

power=$(cat /sys/class/power_supply/BAT1/status)

while true; do
  actual=$(cat /sys/class/power_supply/BAT1/status)

  if [ $actual != $power ]; then
     notify-send $actual

Basically, I'm reading a file at sysfs that has information about your battery, there are more information in there that could be interesting. The file status contains a flag indicating if your device is actually Charging or Discharging. Hope that helps you.

  • You don't need to store last status power=$(cat /sys/class/power_supply/BAT1/status). just compare $temp !="Charging". You are good ;) Oct 4 '14 at 17:08
  • But this way I can get notifications when power supply is connected and when it's disconnected.
    – Eliezer
    Oct 4 '14 at 17:10
  • 1
    This line actual=$(cat /sys/class/power_supply/BAT1/status) checks if power supply is connected("Charging") or dis(Discharging), and the goal is "if battery not charging", then you need only check the actual=$(cat /sys/class/power_supply/BAT1/status) and compare it with "Charging", if they are not equal then we will know that, the battery is not charging. both ways are correct. and one more thing, replace $temp to $actual Oct 4 '14 at 17:28
  • Also it could be a problem to hardcode it to look at BAT1... On my system for example the battery is located at BAT0. So I think the other answer using the acpi command might be more elegant/universal
    – Daniel W.
    Oct 4 '14 at 18:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.