#!/bin/bash # battmon, the battery monitor 🦇 BAT_LEVEL_WARN=${BAT_LEVEL_WARN:=20} BAT_LEVEL_CRITICAL=${BAT_LEVEL_CRITICAL:=10} function _acpib() { acpi -b | grep -Fv ' 0%' } function isDischarging() { [[ "$(_acpib)" == *"Discharging"* ]] && echo true || echo false } function getLevel() { _acpib | sed -ne 's/.* [0-9].* \([0-9]*\)%.*/\1/p' } function getLevelMessage() { echo "The battery level is $(getLevel)%" } function levelIsWarn() { [[ $(getLevel) -le $BAT_LEVEL_WARN ]] && echo true || echo false } function levelIsCritical() { [[ $(getLevel) -le $BAT_LEVEL_CRITICAL ]] && echo true || echo false } if ! [[ $(_acpib | wc -l) -gt 0 ]]; then echo "No batteries installed." exit 0 fi while true; do echo "$(date --iso-8601=seconds):$(getLevel)" if eval "$(isDischarging)"; then if eval "$(levelIsCritical)"; then i3-nagbar -t warning -m "$(getLevelMessage) which is below the critical level of $BAT_LEVEL_CRITICAL%. The computer will be suspended in 30 seconds unless charged." sleep 30 eval "$(levelIsCritical)" && systemctl suspend elif eval "$(levelIsWarn)"; then notify-send "$(getLevelMessage)" fi fi sleep 3 done