GCPが提供しているFunctionと、定期実行を実現できるSchedulerを組み合わせて、1分おきにSmart MeterのAPIを叩いて、MQTTでPublishするWebサービスを構築した。以下は参考画面(Functions)
以下は定期実行を可能にするScheduler
構築はしたものの、、このシステムには以下の課題がある
- スマフォのアプリを開いてもすぐには更新されない(更新が1分周期だから)
- 日中見ない時でも、Publishが動き続けている(これはあまりに無駄だし、場合によっては無料枠を超えてしまう)
- システムの登場人物が多すぎて複雑
現在のシステムの登場人物、絵にすると分かりやすいが、スマフォに向けて流れるのみで、スマフォからサーバへの登り経路がない。だから、今欲しいとか、もういらないとかコントロールできない
やりたいことは、スマフォアプリを開いたらすぐに最新値が取れて、しばらくは動いている。だけど、アプリをクローズしたら、サーバ側の更新処理も止まる、そしてシステムはシンプル
そんなシステムにしたかったら、スマフォアプリがMQTTで通信せずに、直接Nature社のREMO WebAPIを叩いたらええやんという感じで、そもそもの出だしのMQTTがダメだったのか?という気になってきた。MQTTを使わず直接接続でいいじゃないかの案
再度考える。。。
- MQTT自体はプロトコルでしかないので、MQTTが悪いということはない。それをどう使うかが問題
- サーバ代をケチって、常時動作するサーバが存在しないため、定期実行しかできていない(スマフォがPublishしても受けられるサーバがいない)
- MQTTのブローカはお手軽な無料パブリックサービスを使っていて、GCPと分かれている
GCPにはCloud Pub/Subというのがあるらしく、これを中心に、サーバ側の処理とスマフォ処理がPub/Subで接続できたら構造はシンプルになる。 Cloud Pub/Subがグローバルから叩けるかどうかが不明
調べたら、、Google Cloud IoT Core というサービスがあり、これを使うと、Cloud Pub/Subにブリッジできるらしい。やってることが段々とAWSと変わらなくなってきた。無料を期待してGCPで試行錯誤を続けるのがいいのか、多少のお金を払うの覚悟でAWSを使うのがいいのか。。AWS/GCPいずれの場合もMQTTを喋るにはClient証明書(またはJWT?)が必要で、お手軽接続とはいかない(多分)
■方針
こうなったらハラをくくって、多少お金がかかっても、一旦MQTTで理想形を実現すべく、AWSのIoT Coreを使ってみる。IoT Coreを使うためのデバイス登録やClient証明書の扱いがややこしいが、一旦接続までできれば、AWS IoT Coreのメッセージをトリガーとして、Lambdaを呼び出すこともできるし。。いろいろ作りこみが可能だ(有料だけど)
AWS を使うと以下のようなアーキになるかと。できたらCronのOn/Offもboto3なんかで制御できたらいいのだけど。。詳細不明(Event Bridgeでできるようだ)
全く使いこなせるレベルでないFlutterでいきなりAWS IoT Coreにつなぐのは無謀なので、多少慣れたMicroPythonでAWS IoT Coreにつないでみたい。
最後の大事な所がマスクされているが、、 ESP32 + MicroPythonでAWS IoT Coreに繋ぐTutorial
Connect ESP32 MicroPython to AWS IoT
その他、ESP32 + AWS IoT Core接続例
MicroPython to AWS-IOT - Hackster.io
aws-edukit-micropython-examples/main.py at main · aws-samples/aws-edukit-micropython-examples · GitHub
boto3でCRONを制御するサンプル
Schedule your Lambda functions with boto3 (CRON) | by Johannes Gontrum | Level Up Coding
EventBridge — Boto3 Docs 1.21.42 documentation