おうちにデバイスをたくさん生やす時に気をつけていること

おうちにセンサやアクチュエータを多数配置しようとするときに気をつけていることのメモです。2020年12月現在、約80種類の独立したセンサデータを月間1GB程度のペースで収集しています。
![センサ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/7284921b-cf35-ac82-00ab-0b9258cffd80.jpeg)
また、それと連携して様々な機器を動かすなどしています。概要については [speakerdeck:「家にいっぱい棲みつかせてみた」](https://speakerdeck.com/ksasao/jia-niitupaiqi-mitukasetemita) もご参照ください。

# メッシュWi-Fiにする
Wi-Fiに接続されるデバイス数が15台くらいになってくると、時々つながらなくなるデバイスがでてきました。しばらくの間は、複数の Wi-Fiルータを用意して、それぞれに違うSSIDを割り当てることで回避することができましたが、やはり数が増えてくると接続しずらい状況となってきました。そこで、メッシュWi-Fi対応ルータに変えたところ、単一の SSID で済むようになり管理が楽になりました。

現在利用している機種は [TP Link Deco X20](https://www.tp-link.com/jp/home-networking/deco/deco-x20/)で、仕様上は150台以上が接続可能、30台程度では問題なく動作しています。なお、デバイス同士の間隔は 1m 程度開けたほうが安定します。

![メッシュWi-Fi](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/d890cafb-ab91-9721-02e1-421caf9529b6.jpeg)

# ケースに入れる
電子工作あるあるとして、Arduino にジャンパ線もじゃもじゃというパターンがあると思いますが、これはうっかり触って線が抜けてしまったりするなど故障しやすいほか、見た目にもあまりよくありません。ケースの加工の面倒さというのもあるので、はじめからケースに入っているものを選択するのも手です。

## M5 ATOM Lite + M5Stack用ユニット
M5Stack の M5 ATOM Lite (2020年発売) に [M5Stack用のユニット](https://www.switch-science.com/catalog/list/?keyword=M5Stack+%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88)を組み合わせるとケース問題はあまり考えなくてすみます。
M5 ATOM Lite は公式から10個単位で購入すると[1個あたり$5.5](https://m5stack.com/products/atom-lite-esp32-development-kit?variant=32259605233754)と格安で、Wi-Fi/Bluetooth なども利用できます。
[M5Stack用のユニット](https://www.switch-science.com/catalog/list/?keyword=M5Stack+%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88)は、スイッチ、照度、温湿度、気圧、磁気、ガス、IMUなど種類も豊富でそれぞれにサンプルコードが用意されており使いやすくなっています。
![M5ATOM+ガスセンサ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/dd3b6bab-e05f-4711-5ae9-45d2721e03e5.jpeg)
また、ユニットに用意されていないセンサ等を利用したい場合には、[ATOMICプロトキット](https://www.switch-science.com/catalog/6345/)や[ATOM HUB プロトキット](https://www.switch-science.com/catalog/6477/)にちょっとした回路を乗せることができます。
![ATOMICプロトキットを利用したガスセンサ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/4b4394f4-f881-90a4-8c12-acc20e048fa2.jpeg)


## TWELite PAL
温湿度・照度、磁気、加速度などのデータを1分おきに収集するのであれば、モノワイヤレスの[TWELite PAL](https://mono-wireless.com/jp/products/twelite-pal/index.html) が便利です。電池のみで数年動作するので、密閉容器に収めて放置するといったことができます。
![お風呂場の温度・照度を計測](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/6b265162-5ea7-9561-1c39-cc44dd13ff16.jpeg)
また、ケース付きのセットが[Amazonの公式ストア](https://www.amazon.co.jp/dp/B08253LMHN)で若干安く購入可能です。
![image16.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/e87fd331-315d-a39d-d541-aa958fe740d9.jpeg)
上記はベランダに設置しているもので、ケースの主要な穴をふさぎ、温湿度センサ部分に[タイベックシート](https://www.google.com/search?q=%E3%82%BF%E3%82%A4%E3%83%99%E3%83%83%E3%82%AF%E3%82%B7%E3%83%BC%E3%83%88)を貼って透湿・防水をしています。このような利用法は推奨するものではありませんがいまのところ(1年程度)は動作しています。

# プロトコルをそろえる
マイコンの処理能力程度でプッシュ通知なども含めてデータの共有や連携を行おうとした場合、HTTPやソケット通信ではなくMQTTを利用するのが簡単です。MQTTはマイコン向けのライブラリのほか、Python, C# などの各種言語に対応したライブラリも用意されており、マイコンとリッチな計算資源を連携したシステムの構築も容易です。また、WebSocket への変換も用意されており、ブラウザとの親和性もよくなっています。
仕組みとしては、クライアントから Topic と呼ばれる ```foo/bar``` のような宛先とメッセージ本文のペアをサーバー(MQTT broker)に投げる(publish)と、その宛先をあらかじめ購読(subscribe)しているクライアントにデータが通知されるという仕組みです。Topic は```foo/#``` のようにワイルドカードを指定して複数のデバイスに同報通知したり、特定のグループからのデータをすべて受信したりといったことも可能です。

下記のような構成で利用してます。

- サーバ(MQTT Broker)
  - [mosquitto](https://mosquitto.org/download/) (Windows/Mac/Debian/Ubuntu/Raspberry Piなど)
- クライアント
  - [Paho](https://www.eclipse.org/paho/index.php?page=downloads.php)

実装例として、上記の TWELite PAL のデータをMQTTに変換して、それをブラウザで可視化するコードを公開していますので参考にしてください。

- [GitHub: ksasao/TWELITE_PAL_MQTT](https://github.com/ksasao/TWELITE_PAL_MQTT)
![viewer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43450/16dfd09f-349e-94be-02e5-a83fefba2542.png)

なお、電子ペーパーなど常時オンではない端末の場合には MQTT は不向きです。そういったデバイス向けに、MQTTで流れてくるデータのうち一定量のデータをTopic毎に蓄積しておくサービスを用意し、そちらにHTTPでアクセスするようにしています。

### 参考
- [MQTT の仕様 | Learning | MAGELLAN Dev Center](http://devcenter.magellanic-clouds.com/learning/mqtt-spec.html)
- [MQTT Version 3.1.1 をふりかえる - OPTiM TECH BLOG](https://tech-blog.optim.co.jp/entry/2019/08/20/163000)

# 常に状態が確認できるようにする
上記のグラフのようなものを余ったiPadで表示したり、各デバイスのLEDで状態がすぐにわかるようにすることで、人が故障にすぐ気が付くようにしています。M5ATOM Lite はフルカラーLEDが1つ搭載されているので、色や点滅状態で動作状況が把握できるようにしています。色は[JIS安全色](https://ja.wikipedia.org/wiki/JIS%E5%AE%89%E5%85%A8%E8%89%B2)に合わせてもよいと思います。全体として統一されていることが大事です。

状態が常にわかるようになっていると正常時にもいろいろな気づきがあります。

# 定期的に状態を通知する
例えば開閉センサであれば、開→閉、あるいは、閉→開の時のみ通知をすればよいような気がしますが、実際にはデータが正しく伝わっていないこともあります。機器が正常に動作していることを通知する意味でも、何も変化がないようなものであっても１～3分に一度は状態の通知を行い、加えて、変化があった場合にも通知するといった動作となるようにします。

# 動かなくなったら自動的に再起動するようにする
動かなくなったことを検知して自動的に再起動を行うためのWDT(ウォッチドッグタイマー)というものがおおよそのマイコンには搭載されていますので、それを利用します。動かなくなっていることの検出の仕組みは下記のようになっています。

1. マイコンの初期化処理の部分でWDTの初期化処理を記述します
2. メインループ内でループのたびにWDTの値をリセットするように実装します
3. メインループで何らかの異常があり、指定した期間WDTの値がリセットされない場合は1.の初期化処理で指定した割込みが発生するので、その中でリセット処理を行います

M5Stack などで利用されている ESP32 のWDTの利用方法は、[公式のサンプル](https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Timer/WatchdogTimer/WatchdogTimer.ino)が参考になります。 

また、無線の接続ができなくなったり、サーバーへの接続ができなくなったりといったこともよくありますので、リトライ処理を行いそれでもうまくいかなかったら一定期間待ってリセットするという機能も実装しておきます。このようにすることで、多少うまく動作しなくても何とか復帰してくれるようになり、異常発生時の再起動の手間が軽減されます。