見出し画像

観葉植物のお世話をDX! その2~ 水分量をAWS IoT Core経由でDynamoDBに保存する ~

はじめに

こんにちは。SHIFT DAAE(ダーエ)開発グループ所属のsakuraiです。
観葉植物のお世話のDXの第2回です。

今回は前回数値化した水分量AWS IoT Core経由でDynamoDBに保存するところまで実施しようと思います。
対象範囲は赤枠の部分になります。

当初はAPI Gateway + Lambdaでの構成を検討していましたが、今回はAWS IoT Coreを利用したMQTTプロトコルでの通信を利用する構成にしようと思います。それはなぜ?ということで、まずはMQTTの簡単な説明を行った後、実際に環境構築を行いましょう。

MQTTとは

出版(publish)-購読(subscribe)型のメッセージ処理を軽量に行うプロトコルです。ブローカーとなるサーバーを介してクライアント間でメッセージを送受信します。

出典:https://mqtt.org

固定長ヘッダが2バイト~と小さく通信量や消費電力を抑えることができます。また、一対多・双方向・非同期の通信が可能なことや到達保証度の設定が可能なことから一つ一つが小さく、大量のデータを通信するIoTではHTTPより適したプロトコルと言えます。

今回の構成では1つのデバイスからの少量のデータ送信となりますので
HTTPでも問題ありませんが、M5StickC Plusの消費電力と通信量の軽量化のためMQTTを利用してみましょう!

ということで構築に入ります。

AWS IoT Coreの設定 その1 モノの設定

AWS IoT Coreを利用することで簡単に構築することが出来ました。
以下今回の構築手順です。

AWS マネジメントコンソール→IoT Coreを選択。「すべてのデバイス」からモノを作成します。
今回は「M5StickC_PLUS」という名前でモノを作成しました。

同時に新しい証明書も作成します。

次にポリシーを作成・アタッチします。
「M5StickC_PLUS」として以下のポリシーを作成してアタッチしました。

作成したポリシーです。 今回は動作確認程度ですので、すべてを許可したポリシーとなっています。
実際に稼働させる場合は適宜必要な権限のみに絞りましょう。

// M5StickC_PLUSポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

モノの作成が完了するとデバイス証明書、キーファイル、ルートCA証明書
ダウンロードできますので、デバイス証明書とプライベートキーファイルをダウンロードします。

上記の設定でMQTTを利用した通信の準備が出来ました。

M5StickC Plusのプログラム作成

次にM5StickC Plusのプログラムを作成します。
前回と同じく公式の開発環境であるUIFlow(https://flow.m5stack.com/)を利用して作成しましょう。
UIFlowではAWS IoTを利用するためのブロックも用意されていますので
以下のようにブロックでサクッと作成できます!便利!!

// main.m5f
from m5stack import *
from m5ui import *
from uiflow import *
from IoTcloud.AWS import AWS
import json

import time
import unit

setScreenColor(0x111111)
earth_1 = unit.get(unit.EARTH, unit.PORTA)

label0 = M5TextBox(42, 106, "Text", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)

aws = AWS(things_name='M5StickC_PLUS', host='xxxxxxxxxxxxxx-xxx.xxx.ap-northeast-1.amazonaws.com', port=8883, keepalive=120, cert_file_path="/flash/res/cert.pem", private_key_path="/flash/res/private.pem")
aws.start()
while True:
  label0.setText(str(earth_1.analogValue))
  aws.publish(str('test'),str((json.dumps(({'moisture':(earth_1.analogValue)})))))
  wait(60)
  wait_ms(2)

keyFilecertFileには先ほどダウンロードした
デバイス証明書(xxxx-certificate.pem.crt)と
プライベートキーファイル(xxxx-private.pem.key)を
それぞれcert.pem、private.pemとして設定します。

作成したプログラムをM5StickC Plusに転送し、ポトスの鉢にセンサを挿します。これで水分量の値が「test」というトピックにpublishされます。
では確認の為、再度AWSに戻ります!

AWS IoT Coreの設定 その2 MQTTの受信確認

M5StickC Plusから水分量が「test」というトピックでpublishされてきているはずですので、MQTT テストクライアントでsubscribeし、実際に受信できるか確認してみましょう。

AWS マネジメントコンソール→IoT Coreを選択。
MQTT テストクライアント画面を開きます。
test」トピックをsubscribeすることで、無事水分量を取得できました!

AWS IoT Coreの設定 その3 DynamoDBに値を登録

受信が確認できましたので、DynamoDBに値を登録しましょう。まずはDynamoDBの管理画面から、パーティションキーがpkeyソートキーがskeyであるpothosという名前のテーブルを作成します。

再びIoT Coreの管理画面に戻り、IoT Core→メッセージのルーティングからルールを選択し、新しいルールを作成します。
store_moistureというルールで以下の通り作成しました。

※センサーから入力される値は0~1024ですが、水やりなどで一時的にセンサを外した場合は、最小の0や最大1024付近の値が取得されます。これらは必要ないデータなので、今回は1~1000未満の値を保存の対象としました。

無事登録できました。

ルール登録後、DynamoDBに値が登録されています。

保存した値をreact-chartjs-2(https://react-chartjs-2.js.org/)でグラフ化してみました。

しばらくデータを溜めて、どのように水やりのタイミングを検知すれば良いか考えたいと思います。

ということで今回はここまで。
次回はいよいよ水やりのタイミングを通知する仕組みを作りたいと思います!

【前回の記事はこちら】

\もっと身近にもっとリアルに!DAAE公式Twitter/


執筆者プロフィール:sakurai
SHIFT DAAE部所属の開発エンジニアです。
ガラスの花器ほしい。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/