Menambahkan notifikasi low battery di i3wm
Di customizable window manager seperti i3wm, segala hal yang berkaitan dengan desktop environment harus kita konfigurasikan. Salah satu hal yang perlu diatur konfigurasinya adalah notifikasi low battery.
Sudah beberapa kali saya tidak sadar kalau baterai laptop saya di bawah 20%, dan berujung pada laptop yang tiba-tiba mati sendiri. Menyebalkan, pastinya. Apalagi kalau kita sedang mengerjakan pekerjaan penting.
Saya minta GLM 4.7 untuk buatkan bash script yang akan memunculkan notifikasi low battery ketika persentase baterai di bawah 11%. Saya modifikasi sedikit untuk handle beberapa case yang belum ke-cover sepenuhnya oleh GLM.
Berikut script-nya:
#!/bin/bash
# Configuration
BATTERY_PATH="/sys/class/power_supply/BAT*"
LOW_BATTERY_THRESHOLD=11
CHECK_INTERVAL=1
SOUND_THEME="/usr/share/sounds/Yaru/stereo"
SOUND_LOW_BATTERY="${SOUND_THEME}/battery-low.oga"
SOUND_POWER_PLUG="${SOUND_THEME}/power-plug.oga"
SOUND_POWER_UNPLUG="${SOUND_THEME}/power-unplug.oga"
NOTIFICATION_COOLDOWN=300
last_low_battery_notification=0
read_battery_info() {
local capacity_file=$(echo ${BATTERY_PATH}/capacity 2>/dev/null | head -1)
local status_file=$(echo ${BATTERY_PATH}/status 2>/dev/null | head -1)
if [ -z "$capacity_file" ] || [ ! -f "$capacity_file" ]; then
echo "ERROR: Battery not found" >&2
return 1
fi
capacity=$(cat "$capacity_file" 2>/dev/null)
status=$(cat "$status_file" 2>/dev/null)
return 0
}
play_sound() {
local sound_file=$1
if [ -f "$sound_file" ]; then
paplay "$sound_file" &
fi
}
send_notification() {
local urgency=$1
local title=$2
local message=$3
notify-send -u "$urgency" "$title" "$message"
}
status_file=$(echo ${BATTERY_PATH}/status 2>/dev/null | head -1)
prev_status=$(cat "$status_file" 2>/dev/null)
while true; do
if ! read_battery_info; then
sleep "$CHECK_INTERVAL"
continue
fi
current_time=$(date +%s)
echo $prev_status
if [ "$status" = "Discharging" ]; then
if [ "$prev_status" != "Discharging" ]; then
play_sound "$SOUND_POWER_UNPLUG"
elif [ "$capacity" -lt "$LOW_BATTERY_THRESHOLD" ]; then
time_since_last_notification=$((current_time - last_low_battery_notification))
if [ "$time_since_last_notification" -ge "$NOTIFICATION_COOLDOWN" ]; then
send_notification "critical" "Battery Low" "Battery at ${capacity}%"
last_low_battery_notification=$current_time
fi
play_sound "$SOUND_LOW_BATTERY"
sleep 2
fi
elif [[ ("$status" = "Charging" || "$status" = "Not charging" || "$status" = "Full") && "$prev_status" = "Discharging" ]]; then
play_sound "$SOUND_POWER_PLUG"
fi
prev_status="$status"
sleep "$CHECK_INTERVAL"
done
Script ini disimpan di ~/.config/i3/scripts/battery-notify.sh. Script ini kemungkinan ditambahkan ke file ~/.config/i3/config.
# CHECK FOR BATTERY PERCENTAGE. NOTIFY WHEN LOW
exec --no-startup-id "sleep 2; ~/.config/i3/scripts/battery-notify.sh &"
Kenapa harus sleep selama 2 detik dulu sebelum menjalankan script? Hanya untuk memastikan bahwa proses Dunst (program untuk notifikasi) sudah berjalan sebelum script battery-notify.sh dieksekusi, sehingga notifikasinya pakai notifikasi yang tampilannya sudah saya custom ketimbang pakai notifikasi bawaan Ubuntu MATE.
Balas melalui email.
Suka dengan karya/tulisan saya?