植物と会話する時代へ: M5Stack自動給水器とDiscord Botの完璧な連携
こんにちは、エンジニア見習いの巽(大学生)です。
IoTに触れてみる第一歩としてM5Stackを使ってDiscordで植物の状態を管理できる自動給水器を作成しましたので紹介します。
このプロダクトを通して、植物と会話する時代への第一歩を踏み出しましょう。
まだ読んでない方は前回の未経験がウェアラブルアプリを開発した | Happy Life Creatorsをぜひ読んで見てください。
利用した製品・サービス
M5Stackは、ESP32を搭載したIoTデバイスです。Arduino IDEで開発することができます。
M5Stack用の自動給水器を作成するにあたり、M5StickC Plusを利用しました。
M5Stackを拡張することができるユニットです。水分測定センサと給水ポンプが搭載されています。
Discord Botを作成するために必須のサービスです。
Postmanなのにgetpostman.com
リクエストを簡単に送るためのサービスです。
Cloudflareが提供している、任意のTCPで動くようなサーバをセキュアに公開できるすごいサービスです。
詳しい仕組みは省きますがCloudflareの世界中に分散されたデータセンターを使って実現しているサービスです。
Cloudflareはipアドレス1.1.1.1を割り当てられているすごい会社です
- Python
2023年に2番目によく使われていた言語です。Pythonのメリットは簡単に使えることです。
- pycord
pycordは、DiscordのBotをPythonで開発するためのライブラリです。
選定理由は今までメジャーだった公式ライブラリだったdiscord.pyの開発が停止されたためです。
- flask
flaskは、PythonでWebアプリケーションを開発するためのライブラリです。同じようなライブラリにfastAPIというライブラリもありますが、シンプルにサクッと作りたかったのでflaskを選びました。
- SQLite3
SQLite3は、Pythonでデータベースを利用するためのライブラリです。選定理由はMySQLとは異なり、軽量のディスクベースのデータベースで、外部のデータベースサーバーを必要とせずに、ローカルストレージに直接組み込むことができるからです。つまり、手軽に使えるのでSQLiteを選びました。
- SQLAlchemy
オブジェクトリレーショナルマッピング(ORM)ライブラリです。ORM(Object-Relational Mapping)は、リレーショナルデータベースのテーブルとオブジェクト指向プログラミング言語のクラスをマッピングする技術です。つまりデータベースの操作を簡単に行うことができます。選定理由は異なるDBの違いを吸収してくれたり、SQLを書かなくてもよいのでコードの可読性が向上するなどいろいろありますが、使ってみたかったからです。
仮想化環境を構築するためのオープンソースのプラットフォームです。仮想マシン(VM)およびコンテナ仮想化(CT)を作成することができ、僕の愛用OSSです。クラスタリング、RESTful API提供、スナップショット、ネットワーキング、クラウドインテグレーションなどの楽しく、便利な機能がたくさんあります。Flask、Pycordの環境を用意しました。
システム構成
初期に作成した設計案の様子について紹介します。
データの流れとテーブル設計を簡単に表したものです、リアルタイムで更新されるデータをポーリングを用いて更新することにしました。
※汚いですが適当なので許してください
実際の写真
機能
- 乾いていて、指定時間になると自動給水
- 乾いてきているかどうかのデータはdiscordのチャンネルで見ることができる
- M5Stackのボタンを押すと強制的に給水
- discordで指示すると強制的に給水
- 乾いてきているかどうかのデータをグラフで見ることができる
- 週/日単位で給水の定期実行の予約を立てられる機能
完成までの過程
- M5Stackで出来ること調べる
- discord botで出来ること調べる
- 水やりのコツを調べる
- テーブル設計
- API作成
- discordbot作成
- M5Stack作成
- API繋ぎ込み
- テスト
苦労したポイント
- 当初、データベースをGoogleスプレッドシートを利用し、Google Apps Scriptを介して操作する計画を立てていました。M5Stackデバイスからリクエストを送信した際に、予想されたレスポンスが得られないという問題です。リクエストは、302ステータスコードでリダイレクトされるという形で失敗していました。ドキュメントによると、この問題はリダイレクトを有効にすることで解決する可能性があると書かれていました。しかし、解決することはできませんでした。そのため、GoogleスプレッドシートとGoogle Apps Scriptの代わりに、SQLiteとFlaskを使用することにしました。この経験から得た教訓は多く、特にテクノロジー選択の柔軟性と、予期せぬ問題に直面した際の迅速な対応の重要性を再認識しました。
改善点
- 今回使用したFlaskはデフォルトで並列処理出来ないので、2つ以上のリクエストを同時に送った際通常よりも長い待ち時間が発生してしまいます。リクエストの並列処理を有効にする設定を適用する、もしくはWSGIサーバー上で動作させるとよい。しかし、今回の使用用途では並列処理を有効にする必要がないため、そのままの状態で使用しました。
- 今回は、データベースに時間をDateTime型で保存せず、String型で直接JST時刻を保存した。データベースに時間を保存する際、一般的にGMT (UTC) で保存され、アプリケーションレベルで表示時に JST に変換することが推奨されている。
感想
今回初めてIoTというものに触れました。僕の中で、IoTを使ったサービス作ることはとても難しく、専門的な知識が必要なものだというイメージがありましたが、今回の経験でそこまで難しくないことがわかりました。IoTを使ったサービスを作るにはネットワーク、データベース(データ分析)、組込みシステム、セキュリティ、アプリケーション、運用保守などしっかりとした幅広い知識が必要ですが、それらを学ぶことができ、とても楽しかったです。
「植物と会話する」がこのIoTのコンセプトです。将来的にAIを使用したり、データを分析し、水が欲しいときにのどが渇いた、水が欲しいというようなことを言えるようになるといいなと思います。
一旦の開発はここまでです、これからもアップデートしていきますのでIoT×HLCに乞うご期待ください!!!
コード
hitto-hub/Watering-back (github.com)