[D+IO]かわいいハムスターを見守るIoTシステムをつくった

こんにちは、@mihotoyama です！

この記事は**LITALICO Engineers Advent Calendar 2021 2つめ**の18日目の記事です。

# ことの始まり

突然ですが我が家のハムスター(ロボロフスキーハムスター)を見てください。

![cawaii.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479453/da3c596f-367c-31e7-1fb1-b05017531ff3.gif)


**とってもかわいいですね！**

しかし..

よく見ると...

**なんかしけっている**のです。

このgifの元動画は今夏に撮影したものです。

当時もちろんクーラーをかけていたのですが、ハムスターがしけっているということはやはり湿度が高すぎたのでしょうか...。

この頃から、部屋の中がハムスターにとって快適な温湿度になっているかがとても不安で、なにかいい手段はないかな？と思うようになりました。

エンジニアになったからにはIoTに挑戦していみたい気持ちもあったので、
せっかくならば温湿度を測定するセンサーでも買おうかな〜とか、
そんな機会があるとしたら、ついでに毎晩せっせと走っている回し車の回転数も取得したいな〜([この研究](https://www.tsukuba.ac.jp/community/students-kagakunome/shyo_list/2016/schc6.pdf)に触発された)とか考え、実現方法を調べていたところ...

**神レポジトリ**を発見しました。

# D+IO (ドゥーイングアイオー)との出会い

公式サイト：[https://panasonic.co.jp/design/flf/works/doing_io/](https://panasonic.co.jp/design/flf/works/doing_io/)

Panasonic株式会社が2020年から始めた、「大切な誰かへ届けたいみんなのモノづくり」を応援するプロジェクトです。

このコンセプトのとおり、さまざまな相手に向けたものづくりをするべく、初心者でも挑戦しやすい丁寧なドキュメントや動画での解説を公開しています。

わたしが見つけたのは、このプロジェクトの第2弾となる「**小動物ヘルスケアデバイス**」のレシピでした→[https://github.com/panasonic-corporation/doingio-small-pets-healthcare-docs](https://github.com/panasonic-corporation/doingio-small-pets-healthcare-docs)

これは本当にすごくて、

- 材料を購入できる販売先も紹介
- 写真たっぷりでわかりやすい解説
- M5stackのソースコードも提供(Arduino開発環境構築から解説！)

という、初めて電子工作に挑戦する人に優しいすばらしいレシピです...こんな最高のものを無償で公開してくださるなんて神としか言いようがありません🙏 本当にありがとうございます！！

神レポジトリとの出会いにより一気にハムスター駆動開発の機運が高まり、ついに行動に移しました🐹

# 目的

- 以下のデータをセンサーで取得し、リアルタイムなハムスター関連のデータをブラウザから確認できるようにする
    - 温湿度
    - 回し車の回転数
    - 餌場をうろうろした回数
    - 寝床から出入りした回数

# システム構成

システム構成は以下の図のとおりです。

![技術スタック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479453/5bed1427-5ef6-ac3e-d861-4e3fa1c1a6cf.png)

APIとフロントエンドの技術スタックは、最近業務で使っているものを選択しました。(コーディングの練習をしたかったので...。)

VPSはたまたま契約していたものを使いました。

# 開発

具体的なコードは [成果物](#成果物) を参照のこと。

大まかな手順は以下のとおりです。

1. M5Stack(上述の[D+IOのレシピ](https://github.com/panasonic-corporation/doingio-small-pets-healthcare-docs)に全て記載。今回は諸般の事情により重さセンサーのみ未実装)
    1. 材料を揃える
    2. センサーと接続する
    3. 提供されているコードをM5Stackに書き込む
    4. 自分のやりたいようにコードを編集する
2. API
    1. 以下のAPIを用意
        1. POSTでM5StackからのJSONデータを受け付けるAPI
            1. 自宅のIPからのみ許可する
        2. GETで最新のデータのみ取得するAPI
        3. GETで直近30分間のデータを全て取得するAPI
            1. cronにより30分前のデータを削除
3. フロントエンド
    1. 以下を表示するように作成
        1. 最新の回し車の回転数・餌場をうろうろした回数・寝床から出入りした回数
        2. 直近30分間の温湿度と回し車の回転スピード(rpm)のグラフ
            1. ライブラリはvue-chartjsを使用
4. デプロイ
    1. APIをVPSにデプロイ
    2. (フロントエンドはうまくデプロイできず未達)

1.のM5Stackパートについて自分がポイントと感じた部分を書いておきます。

- このパートは2時間程度で完了
- 単線の皮膜を剥くのがちょっとむずかしい
    - ペンチでじわじわ、中身を傷つけないように切れ目を入れて剥く
- 延長用コネクタはのレバー部分は思い切って持ち上げる(垂直になるまで)
- レシピ内で写真と説明文の不一致があったので、以下で実装した
    - 温湿度センサの部分
        - 単線は白と赤を使用
        - 白が16、赤が3(写真に合わせた)
    - PIRユニットの部分
        - M5Stackの側部に3本接続(写真に合わせた)

# 成果物

最終的なコードは以下のレポジトリに置いてあります。

- M5Stack内のArduinoコード(公開レポジトリからの差分)
    - [https://github.com/mihotoyama/doingio-small-pets-healthcare/pull/1](https://github.com/mihotoyama/doingio-small-pets-healthcare/pull/1)
- APIとフロントエンドのコード
    - [https://github.com/mihotoyama/hamster-observation](https://github.com/mihotoyama/hamster-observation)

フロントエンドのローカルサーバを立ち上げてブラウザで確認しました。

ハムスターの活動時間を待って...表示された画面(iPhone6~8サイズ)はこんな感じです！

![yosage_1_iPhone 6_7_8 Plus).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479453/1f775883-cefd-76a5-0184-4878ec222778.png)


温湿度は悪くない感じで安定していることがわかり一安心。

回転スピードが0のときは休んでいるということがわかるのと、グラフを描画したときに回転スピードが速いと「がんばってるんだなあ」という気持ちになれますね。

しばらくしてから更新ボタンを押すと、最新のデータで描画されます💡

![yosage_2_iPhone 6_7_8 Plus) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479453/0e9309b3-f94b-238d-cc40-4948c450b2ee.png)

グラフが若干ガビガビしていますが、今回はこんな感じでおしまいです。

# まとめ

D+IOのレシピのおかげで、家の中の違う部屋からもハムスターの様子をうかがい知ることができるようになりました。

近いうちにフロントエンドもデプロイして、外出中でも様子をチェックできるようにしていきたいです！

他に今回できなかったこととしては、

- テストを書く
- アクセス制限などのセキュリティ強化
    - controllerでむりやりIP制限をしたが、Pipeなどを使えそう
- もっとリアルタイムなグラフ描画
    - 初回取得時以外は最新のデータのみ受信して逐次グラフを自動更新するとよさそう？

などがあります。

また、今回の開発でいろいろなことを初めて経験することができました。

接続用の単線をどうやって選べばいいのか迷ったり...
C++のコードを(少しだけ)書いてみたところ、バッファオーバーフローでJSONをうまく書き出せなかったり...
Vue.jsのコンポーネントでデータの変化をうまくキャッチできなかったり...
通信やプログラムの処理時間が気になったり...

もっともっと学びたいことがたくさん見つかりました。

これからもハムスターの命ある限り、ハムスター駆動開発を進めていきたいです😄

最後に、今回の開発を強力に後押しする最高のレシピを公開してくださったPanasonic株式会社、そしてこんな素敵な機会をくれた我が家のかわいいハムスターに、最大限の感謝を...❤️

明日は我らがVPoE @kamesennin の記事の公開日です！お楽しみに😉