MESH ハブ用 Status board をハックする

スイッチサイエンスさんなどで[売っている](https://www.switch-science.com/catalog/3132/)、MESH ハブ用 Status board を本来の目的である MESH HUB アプリケーション以外でも使ってみよう、という記事です。

MESH や MESH ハブなどについては、下記リンクをご参照ください
- MESH : http://meshprj.com/jp/
- MESH ハブ : http://meshprj.com/jp/hub/
- MESH ハブ用 Status board : https://www.switch-science.com/catalog/3132/

※本記事では、あくまでも調査した結果の情報を共有するものであり、各メーカー様の公式見解ではありません。本記事の内容について一切の保証はできません。本記事の内容により被った損害及び損失について、一切の責任を負いません。

# 動作を調べてみよう
Raspberry Pi の GPIO 部分にボードを刺します(1番ピンから20番ピンまで)。

![IMG_3782.JPG](https://qiita-image-store.s3.amazonaws.com/0/30051/5357f419-878c-30af-60ab-23d69a1e51ff.jpeg)

この状態で、WiringPi の gpio コマンドを使って動作を確かめます。

もし gpio コマンドを実行して、

```
pi@raspberrypi:~ $ gpio
-bash: gpio: command not found
```

となった人は、

```
pi@raspberrypi:~ $ sudo apt-get install wiringpi
```

としてインストールしておきましょう。

## ボタン
ボタンを押した前後で、gpio readall コマンドの差分を見てみましょう

```bash
pi@raspberrypi:~ $ gpio readall > off # ボタンを押さずに
pi@raspberrypi:~ $ gpio readall > on  # ボタンを押して
pi@raspberrypi:~ $ diff off on
5c5
<  |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
---
>  |   2 |   8 |   SDA.1 |   IN | 0 |  3 || 4  |   |      | 5v      |     |     |
```

どうやら、押した時に GPIO2 が 0 になるようです。

## LED
物理ピン番号の若い方からアタリをつけて確認していきます。

GPIO3を 0 にしてみると

```
pi@raspberrypi:~ $ gpio -g mode 3 out
pi@raspberrypi:~ $ gpio -g write 3 0
```

![IMG_3849.JPG](https://qiita-image-store.s3.amazonaws.com/0/30051/99f3d5c0-98ac-133c-f105-e2f1db9e6c62.jpeg)

LAN LED が光りました！
同様に GPIO4 が Internet に対応していました。

続いて、Status のところですが、よく見ると２つの LED が入ってます。
GPIO14 を 0 にすると赤が、GPIO15 を 0 にすると緑が、それぞれ光ります。
両方を0にすると、遠目に見るとオレンジっぽく見えます。

# 応用例
展示会やイベントなどで Raspberry Pi を使ったデモをやっていると、モニタやキーボードをつながない、ヘッドレスな状態とする事も多いと思います。ネットワークの状態も悪かったり接続をしない場合もあると思います。
そのような時にうまくデモが動作していない時や撤収時などに、安全に再起動・シャットダウンをしないで、祈りながら電源をブチっとやるケース、意外に多いのではないでしょうか。
そんな場合に、アプリケーションやネットワークの状態の確認、必要に応じて安全に再起動やシャットダウンができるといいですよね？

ということでスクリプトを作ってみました。

https://gist.github.com/j3tm0t0/c8bd610ab3c5f877b97457689acdcc7e

## 使い方
このスクリプトを crontab の `@reboot` などで、起動時に実行するようにしておきます。

```
pi@raspberrypi:~ $ wget https://gist.githubusercontent.com/j3tm0t0/c8bd610ab3c5f877b97457689acdcc7e/raw/ca1b5fe1070cee0edf96751a4857b91951e001ee/status.sh
--2018-03-05 09:41:03--  https://gist.githubusercontent.com/j3tm0t0/c8bd610ab3c5f877b97457689acdcc7e/raw/ca1b5fe1070cee0edf96751a4857b91951e001ee/status.sh
Resolving gist.githubusercontent.com (gist.githubusercontent.com)... 151.101.72.133
Connecting to gist.githubusercontent.com (gist.githubusercontent.com)|151.101.72.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1961 (1.9K) [text/plain]
Saving to: ‘status.sh’

status.sh                           100%[===================================================================>]   1.92K  --.-KB/s    in 0s

2018-03-05 09:41:03 (10.1 MB/s) - ‘status.sh’ saved [1961/1961]

pi@raspberrypi:~ $ chmod +x status.sh
pi@raspberrypi:~ $ sudo mv status.sh /usr/local/sbin/
pi@raspberrypi:~ $ echo @reboot /usr/local/sbin/status.sh | crontab -e
```

再起動後は、

- WiFi や有線のインターフェースが上がって入れば、LAN が点灯
- ppp0 や wwan0 などのインターフェースが上がって入れば、Internet が点灯 ※
- Switch を ５秒以内程度押すと再起動、押しっぱなしにするとシャットダウン
- /run/user/1000/status/OK /run/user/1000/status/NG ファイルをそれぞれ作ると、Status LED の色が変わる

という機能があります。

※ Internet への疎通を真面目にチェックするなどはしていないので、必要に応じて改変するなどしてみてください。