phoenix-powerバッテリーが切れそうなときは、通知を出すようにしました。

バッテリーが突如切れて、パソコンが終了しました。こういったことがあると、その時は対応するのだけど、いつも忘れがちです。

現在考えられる方法としては、systemd-timerを使う方法かcronを使う方法です。

後者のほうが簡単ですが、前者のsystemd-timerのほうができることは多いかなという感じ。

ここでは、cronを使った方法を紹介します。

crontab

Cron -ArchWiki

1
2
3
4
$ sudo pacman -S cronie

$ sudo systemctl start cronie
$ sudo systemctl enable cronie

使い方は簡単で、以下のコマンドで使います。

1
2
3
4
5
# 設定
$ crontab -e

# 設定の確認
$ crontab -l

設定の書き方です。

1
2
3
4
5
6
分 時 日 月 曜日 コマンド
# test-notify
*/1  *  *  *  * DISPLAY=:0.0 XAUTHORITY=~/.Xauthority /usr/bin/notify-send "test"

# battery-notify
*/1  *  *  *  * DISPLAY=:0.0 XAUTHORITY=~/.Xauthority ~/.bin/battery-notify.sh

テスト、1分おきにnotify-sendで通知をします。

バッテリーを通知するスクリプトは以下。アイコンはNumixを使用していますので注意。

~/.bin/battery-notify.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
#export DISPLAY=:0.0
#export XAUTHORITY=/home/syui/.Xauthority
export battery_level=`cat /sys/class/power_supply/BAT0/capacity`
export battery_status=`cat /sys/class/power_supply/BAT0/status`

##test
#if [ "$battery_status" = "Charging" ];then
#    if [ $battery_level -le 5 ];then
#        sudo -u syui notify-send -u critical -i /usr/share/icons/Numix/24x24/status/battery-000-charging.svg "Battery level is ${battery_level}%!" 
#    elif [ $battery_level -le 100 ];then
#        sudo -u syui notify-send -u critical -i /usr/share/icons/Numix/24x24/status/battery-000-charging.svg "Battery level is ${battery_level}%!" 
#        #notify-send -i /usr/share/icons/Numix/24x24/status/battery-000-charging.svg "Battery level is ${battery_level}%!"
#    fi
#fi

if [ "$battery_status" = "Discharging" ];then
    if [ $battery_level -le 5 ];then
        notify-send -u critical -i /usr/share/icons/Numix/24x24/status/battery-000-charging.svg "Battery level is ${battery_level}%!"
    elif [ $battery_level -le 10 ];then
        notify-send -i /usr/share/icons/Numix/24x24/status/battery-000-charging.svg "Battery level is ${battery_level}%!"
    fi
fi

ちなみに、バッテリー関連は、Kernel領域になりますので、気になる方は調べればいいと思いますが、あまりおすすめはしません。ここでわかりやすいのは、udevです。

1
2
3
4
5
6
7
8
9
10
11
12
# 容量やステータスを取得
# これらはカーネルの機能として書き出される情報の末端に過ぎませんので、完璧なものではありません
$ cat /sys/class/power_supply/BAT0/capacity
$ cat /sys/class/power_supply/BAT0/status

# udevから取得
$ udevadm info -q property -a --path /sys/class/power_supply/BAT0

# udevの設定を書く
# https://wiki.archlinux.org/index.php/Laptop
$ cat /etc/udev/rules.d/99-lowbat.rules
KERNEL=="BAT0", SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[0-5]", RUN+="/usr/bin/systemctl hibernate"

udevの書き方は大体わかると思います。上記は、cat /sys/class/power_supply/BAT0/capacityで得られる値が0-5だった場合、サスペンドと言って、状態保存するという感じのものになっています。systemctl hibernateがそれに当たるコマンドです。

systemd-timer

System Timers -ArchWiki

次に、systemdtimer機能についての設定の書き方です。hoge.servicehoge.timerの2つのファイルを用意し、設定を書きます。登録の方は、systemctl start hoge.timer, systemctl enable hoge.timerです。

/etc/systemd/system/test.service
1
2
3
4
5
6
7
8
9
[Unit]
Description=Run foo weekly and on boot

[Service]
Type=oneshot
# 実行したいスクリプト
ExecStart=/usr/local/bin/test.sh
User=nobody
Group=systemd-journal
/etc/systemd/system/test.timer
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Run foo weekly and on boot

[Timer]
# 起動後15分
OnBootSec=15min
# 毎週
OnUnitActiveSec=1w
# 実行させたいサービス
Unit=hoge.service

[Install]
WantedBy=timers.target