GeeekPi X930 HiFi DAC HAT拡張ボードのスクリプト修正やってみた

# 1.経緯
以前からRaspberryPI版のVolumioを使用していたが、電源の管理が面倒だと思っていたところ、電源管理機能のついたDAC基板（GeeekPi X930 HiFi DAC HAT拡張ボード）がAmazonで安くなっていた。
つられて購入したが、[メーカサイトの指示](https://wiki.geekworm.com/X930?_gl=1*2f0hw1*_gcl_au*MTkzODY0MjMxMC4xNzQ0MTk5NTU0*_ga*MTUzNzA0NTA0Ni4xNzQ0MTk5NTU0*_ga_WCBGYZY3V4*MTc0NDQxNTEzMC4zLjAuMTc0NDQxNTEzMC42MC4wLjA. "X930")通りにスクリプトをインストールしても機能しなかった。
お勉強も兼ねて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.対策確認
とりあえずスクリプトがダメなことは判明した。
[メーカのインストール手順](https://suptronics.com/miniPCkits/x930-software.html "suptronics.com")からスクリプトファイルをダウンロードしたが、RaspberryPIのVolumioOSに使われるスクリプトはさっぱりわからないので、ChatGPTさんにエラー内容やスクリプトをファイルごと丸投げして確認してもらった。
「Raspberry Pi OS の Bullseye 以降では /sys/class/gpio/export が非推奨。」「Raspberry Pi OS Bullseye（2021年以降のバージョン）では、sysfs による GPIO 制御は無効。」等の情報をゲット。
おそらく原因はこれで間違いない。（安売りのわけも理解した）
その他にもいろいろとご指摘をいただいたので、それらも含めて修正した。

# 4.スクリプトの編集
CahtGPTさんといろいろやり取りして、追加パッケージのインストールとスクリプトを修正した。
・libgpiod パッケージをインストール
~~~ssh:sshでlibgpioのインストール
sudo apt update
sudo apt install gpiod
~~~
・/sys/class/gpio/export が非推奨 ー＞ 解決策: 代わりに libgpiod を使う
・sysfs による GPIO 制御は無効 ー＞ 解決策: 代わりに libgpiod を使う
・その他、ChatGPTさんが指摘してくれた元スクリプトの甘いところを修正
~~~sh:x930_repa.sh
# ダウンロードした「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を使用）
シャットダウンとリブートのボタンを別に追加するとか、もっと使いやすくできそう。