Logo

dev-resources.site

for different kinds of informations.

Code. Battery notifier.

Published at
12/12/2024
Categories
bash
polybar
notifications
unixporn
Author
Kir Axanov
Code. Battery notifier.

Out of frustration from some-battery-monitor-util sometimes missing the moment to notify me about low charge, this simple script was put together.

It checks the current status and level of the BAT0 device and does one of the following:

  • notify about low battery level (15%)
  • notify about critical battery level (5%)
  • notify about near-zero battery level (3%), wait a couple of seconds and hibernate if battery status haven't changed to Charging

Requisites:

  • some notification daemon (I like dunst)
  • systemd for hibernation
  • something, that calls that script periodically (I call it with polybar every 60 seconds)

The script itself (battery-notifier.sh):

#!/usr/bin/env bash

LOW_LEVEL=15
CRITICAL_LEVEL=5
HIBERNATE_LEVEL=3

LEVEL=$(cat /sys/class/power_supply/BAT0/capacity)
STATUS=$(cat /sys/class/power_supply/BAT0/status)

hibernate() {
  notify-send -a "Battery" "Hibernating!" -u critical

  # Give some time to plug the power in
  sleep 5

  # Hibernate if still discharging
  STATUS=$(cat /sys/class/power_supply/BAT0/status)
  if [[ "$STATUS" = "Discharging" ]]; then
    systemctl hibernate
  else
    notify-send -a "Battery" "Power was plugged in. Hibernation is cancelled!"
  fi
}

notify_critical() {
  notify-send -a "Battery" "Battery is critically low!" -u critical
}

notify_low() {
  notify-send -a "Battery" "Battery is low!"
}


if [[ "$STATUS" = "Discharging" ]]; then
  if [[ "$LEVEL" -le "$HIBERNATE_LEVEL" ]]; then
    hibernate
  elif [[ "$LEVEL" -le "$CRITICAL_LEVEL" ]]; then
    notify_critical
  elif [[ "$LEVEL" -le "$LOW_LEVEL" ]]; then
    notify_low
  fi
fi

The polybar module config:

[module/battery_notifier]
type = custom/script
exec = ~/.config/polybar/battery-notifier.sh
interval = 60

* Notice, that script is put to ~/.config/polybar/.

Featured ones: