chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

GCPのCloud FunctionsとCloud Schedulerを組み合わせて計測データを定期的にPublish

GCPが提供しているFunctionと、定期実行を実現できるSchedulerを組み合わせて、1分おきにSmart MeterのAPIを叩いて、MQTTでPublishするWebサービスを構築した。以下は参考画面(Functions)

以下は定期実行を可能にするScheduler

構築はしたものの、、このシステムには以下の課題がある

  • スマフォのアプリを開いてもすぐには更新されない(更新が1分周期だから)
  • 日中見ない時でも、Publishが動き続けている(これはあまりに無駄だし、場合によっては無料枠を超えてしまう)
  • システムの登場人物が多すぎて複雑

現在のシステムの登場人物、絵にすると分かりやすいが、スマフォに向けて流れるのみで、スマフォからサーバへの登り経路がない。だから、今欲しいとか、もういらないとかコントロールできない

やりたいことは、スマフォアプリを開いたらすぐに最新値が取れて、しばらくは動いている。だけど、アプリをクローズしたら、サーバ側の更新処理も止まる、そしてシステムはシンプル

そんなシステムにしたかったら、スマフォアプリがMQTTで通信せずに、直接Nature社のREMO WebAPIを叩いたらええやんという感じで、そもそもの出だしのMQTTがダメだったのか?という気になってきた。MQTTを使わず直接接続でいいじゃないかの案

再度考える。。。

  • MQTT自体はプロトコルでしかないので、MQTTが悪いということはない。それをどう使うかが問題
    • とは言え、Nature REMO APIはWebAPIなので、HTTP(S)/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