1.経緯
以前からRaspberryPI版のVolumioを使用していたが、電源の管理が面倒だと思っていたところ、電源管理機能のついたDAC基板(GeeekPi X930 HiFi DAC HAT拡張ボード)がAmazonで安くなっていた。
つられて購入したが、メーカサイトの指示通りにスクリプトをインストールしても機能しなかった。
お勉強も兼ねてChatGPTにいろいろ聞きながらスクリプト修正してみた。
2.エラーの確認
Volumio3のデバック画面(Volumioテストプレーヤー:PCブラウザから「http://[volumio(環境に合わせる)].local/DEV/」で確認すると以下のエラーを出していることが判明。
・「"13" > /sys/class/gpio/export;」で「write error: Invalid argument」
・「cat: /sys/class/gpio/gpio5/value」で「そのようなファイルまたはディレクトリはありません」
どうやら、GPIOの入出力で失敗しているらしい。
3.対策確認
とりあえずスクリプトがダメなことは判明した。
メーカのインストール手順からスクリプトファイルをダウンロードしたが、RaspberryPIのVolumioOSに使われるスクリプトはさっぱりわからないので、ChatGPTさんにエラー内容やスクリプトをファイルごと丸投げして確認してもらった。
「Raspberry Pi OS の Bullseye 以降では /sys/class/gpio/export が非推奨。」「Raspberry Pi OS Bullseye(2021年以降のバージョン)では、sysfs による GPIO 制御は無効。」等の情報をゲット。
おそらく原因はこれで間違いない。(安売りのわけも理解した)
その他にもいろいろとご指摘をいただいたので、それらも含めて修正した。
4.スクリプトの編集
CahtGPTさんといろいろやり取りして、追加パッケージのインストールとスクリプトを修正した。
・libgpiod パッケージをインストール
sudo apt update
sudo apt install gpiod
・/sys/class/gpio/export が非推奨 ー> 解決策: 代わりに libgpiod を使う
・sysfs による GPIO 制御は無効 ー> 解決策: 代わりに libgpiod を使う
・その他、ChatGPTさんが指摘してくれた元スクリプトの甘いところを修正
# ダウンロードした「x930.sh」を修正(流用は自己責任でお願いします。)
#!/bin/bash
sudo sed -e '/shutdown/ s/^#*/#/' -i /etc/rc.local
echo '#!/bin/bash
SHUTDOWN=5
REBOOTPULSEMINIMUM=200
REBOOTPULSEMAXIMUM=600
BOOT=12
gpioset --mode=time --background gpiochip0 $BOOT=1
echo "X930 Shutting down..."
while true; do
shutdownSignal=$(gpioget gpiochip0 $SHUTDOWN || echo 0)
if [ "$shutdownSignal" -eq 0 ]; then
/bin/sleep 0.2
else
pulseStart=$(date +%s%N | cut -b1-13)
while [ "$shutdownSignal" -eq 1 ]; do
/bin/sleep 0.02
if [ $(($(date +%s%N | cut -b1-13)-$pulseStart)) -gt $REBOOTPULSEMAXIMUM ]; then
echo "X930 Shutting down, halting RPi..."
sudo poweroff
exit
fi
shutdownSignal=$(gpioget gpiochip0 $SHUTDOWN || echo 0)
done
if [ $(($(date +%s%N | cut -b1-13)-$pulseStart)) -gt $REBOOTPULSEMINIMUM ]; then
echo "X930 Rebooting, recycling RPi..."
sudo reboot
exit
fi
fi
done' > /etc/x930pwr.sh
sudo chmod +x /etc/x930pwr.sh
sudo sed -i '$ i /etc/x930pwr.sh &' /etc/rc.local
#X930 full shutdown through Software
#!/bin/bash
sudo sed -e '/button/ s/^#*/#/' -i /etc/rc.local
echo '#!/bin/bash
BUTTON=13
gpioset --mode=time --background gpiochip0 $BUTTON=1
SLEEP=${1:-4}
re="^[0-9\.]+$"
if ! [[ $SLEEP =~ $re ]] ; then
echo "error: sleep time not a number" >&2; exit 1
fi
echo "X930 Shutting down..."
/bin/sleep $SLEEP
gpioset --mode=time --background gpiochip0 $BUTTON=0
' > /usr/local/bin/x930softsd.sh
sudo chmod +x /usr/local/bin/x930softsd.sh
5.その他
私の場合は、すでにスクリプトをインストールしてしまっていたので、ロールバックとかVolumioの再インストールとかするのは面倒なのと修正内容が簡単だったので、以下のインストール済みのスクリプトを直に修正して対策した。
・/etc/x930pwr.sh
・/usr/local/bin/x930softsd.sh
RaspberryPIのスクリプト編集したことがなかったので勉強になりました。(初めてsshでnanoを使用)
シャットダウンとリブートのボタンを別に追加するとか、もっと使いやすくできそう。