IoT機器で温湿度を測定してクラウドでグラフ化 AWS IoT Core編(その2) | そう備忘録

IoT機器で温湿度を測定してクラウドでグラフ化 AWS IoT Core編(その2)

温湿度の測定

RaspberryPi Zeroと温湿度モジュール(DHT22)を使用して温湿度を指定した間隔(分)で測定してクラウド(AWS IoT Core)にデータをアップロードしてグラフ化するまでの2回目。

前回のハードウェア編はこちらの記事を参照

今回の記事の範囲は

  • Google Sheetsへのアクセスする為の設定
  • AWS IoT Coreの設定
  • Amazon Simple Notification Serviceの設定

とする。

システム概要図

システム概要図と今回の記事の範囲は以下の通り。

システム概要図 今回の記事の範囲

主な実現したい機能は以下の通り。

  • 指定した間隔(分)で温湿度を測定する
  • 指定した間隔(分)でデータをサーバーにアップロードする
  • アップロードしたデータは集計、グラフ表示する
  • 温湿度のしきい値(上限、下限)を超えた場合はアラートを発信する
  • しきい値は場所毎に異なる値を指定出来るようにする
  • 設定情報はGoogle Sheetで一括指定して設定値を変更したら各端末に速やかに反映させる
  • それぞれの端末は遠隔で再起動等の操作が出来るようにする
  • 測定端末は複数台設置するが基本的に室内とする(屋外には設置しない)
  • 100V電源を確保できる場所とする(バッテリー駆動も一応試してみる)
  • 初期コスト、ランニングコストともに出来るだけローコストで実現する

Google Sheetsへのアクセス

設定値はラズパイのPythonのプログラムからGoogle Sheetsから読み取る仕様とするのでGoogle Cloud Platformで認証情報を作成すると同時にラズパイに必要なモジュールをインストールする。

主な手順は以下の通り。

  1. Google Cloud Platformにアクセス
  2. プロジェクトを作成してAPIを有効化する
  3. 認証情報を作成する
  4. アクセス対象のGoogleスプレッドシートを作成して共有設定する
  5. RaspberryPiにGoogleスプレッドシートの操作に必要なモジュール(gspread)をインストール

尚、こちらの作成手順については以前に記事にしているので「RaspberryPi 3 Model B+からGoogleスプレッドシートへアクセスする方法」を参照して欲しい。

シートの仕様

温湿度設定シートの仕様は以下の通りとする。

温湿度設定シート

シートへのリンクURL

シートをユニークに特定するリンク(上部のアドレス欄)を後でプログラムで使用するので控えておく

シート名

”温湿度設定シート”と名前を付けている

後でプログラムからこの名前を使用する

ClientID

端末ID

この列と端末毎のinitial.jsonファイルのclient_idセクションを比較してマッチする行を選択して場所毎に異なるしきい値を設定できるようにする

LocationID

場所を表すID

LocationName

場所の表示名

Interval

ここで指定された数値(分)間隔で温湿度を取得する

取得した温湿度は一旦ローカルファイルに保存される

UpLoadInterval

ここで指定された数値(分)間隔でAWS IoT Coreにデータをアップロード(Publish)する

MinTemp

最低温度

この温度を下回った時にアラートを発信する

尚、アラートは上記のUpLoadInterval(AWSへのPublish間隔)には依存せず、しきい値超えた値を測定時に随時発信する

MaxTemp

最高温度のしきい値

MinHumi

最低湿度のしきい値

MaxHumi

最高湿度のしきい値

AdjTemp

温度補正用の値

DHT22モジュールで計測された値にこの数値を乗算する

モジュールによって若干の温湿度の誤差が発生していたので補正用の設定値

例えば0.9が設定されている場合は、

測定値:32.6(℃)

32.6×0.9=29.34→29.3(小数点以下2桁目を四捨五入)となる

AdjHumi

湿度補正用の値

いくつかのDHT22モジュールを試した所、湿度は実際の値より若干高めに検出される模様

Alert

温湿度がしきい値超えた場合にアラートを発信するかどうかのフラグ

  • 1:発信する
  • 0:発信しない

通常は1(発信する)に設定しておくが例えばInterval(温湿度測定間隔)を5分に設定した場合、しきい値を超えると5分毎にメール(やSMS)が飛んでくる

実際の現場での対応まで時間が必要で、一旦アラートの送信を停止したい時に0(発信)しないに設定する為の項目

M列

コメント列

プログラム中では使用していない

AWSの設定

AWS IoT Coreの設定

ラズパイからAWS IoT Coreにデータを送信(Publish)するに辺り、IoT Core側でモノの作成や認証情報の作成が必要になる。

AWSにログインをしてサービスからIoT Coreを選択する。

尚、リージョンは東京を選択している。

AWS IoT Coreの選択

モノの作成

”管理”ー>”モノ”から「作成」ボタンをクリックする。

IoT Coreモノの作成

「単一のモノを作成する」をクリックする。

単一のモノを作成する

  • 名前:RaspZTempHumiCheck
  • タイプ:RaspberryPiZero

※タイプは必要に応じて「タイプの作成」で作成する。

尚、タイプ及びこの後出てくるグループ、モノの属性の設定は未設定であってもプログラムは動作する。

数や種類が多くなった時の管理を容易にする機能である。

モノの名前とタイプを設定する

モノのグループにて”グループの作成”を行いTempHimuCheckのグループを割り当てた。

モノのグループ

”検索可能なモノの属性の設定”は未設定で「次へ」ボタンをクリックする。

次へをクリックする

証明書の作成

モノに対して1対1で証明書を作成する。

「証明書の作成」ボタンをクリックする。

証明書の発行

  • このモノの証明書
  • パブリックキー(プログラムでは使用しない)
  • プライベートキー

が発行されるので3つとも”ダウンロード”をクリックして保存する。

次にAWS IoTのルートCAの”ダウンロード”をクリックする。

証明書のダウンロード

RSA 2048 bit key”Amazon Root CA 1”のリンクをクリックする。

Amazon Root CA1

画面上にAmazon Root CAが表示されるのでコピペしてテキストファイルに保存する。

尚、この際の文字コードはutf-8で保存した。

Amazon Root CAが表示される

先程の画面に戻って「有効化」ボタンをクリックする。

次にポリシーの作成を先に行うので一旦「完了」をクリックしてモノの作成は終了する。

有効化

ポリシーの作成

このモノに対するアクセス制御の為のポリシーを作成する。

”安全性”ー>”ポリシー”で「作成」ボタンをクリックする。

ポリシーの作成

Connect(接続)用のポリシーを設定する。

このモノにアクセスできるClient名をコントロールする為に以下の設定を行った。

  • 名前:Temp-and-Humi-policy
  • アクション:iot:Connect
  • リソースARN:arn:aws:iot:ap-northeast-1:XXXXXXXXX:client/SKRP*
  • 効果:許可にチェック

これでClient名の先頭4文字がSKRPの端末のみがアクセス可能になる。

「ステートメントを追加」をクリックする。

connectのポリシー設定

Publish(ラズパイからAWS IoT Coreへの送信)用のポリシーを設定する。

このモノにアクセスできるTOPICをコントロールする為に以下の設定を行った。

  • アクション:iot:Publish
  • リソースARN:arn:aws:iot:ap-northeast-1:XXXXXXXXX:topic/dt/TempAndHumi/*
  • 効果:許可にチェック

これは通常時の温湿度をPublishする為のデータのTOPICの設定。

TOPICについてはプログラミング編で別途説明する。

更に「ステートメントを追加」をクリックする。

publish用のポリシー

アラート時のPublish用のステートメントを設定する。

IoT CoreではTOPICの1層目がdtで始まる通常時の温湿度データとalertで始まる温湿度がしきい値を超えた時にPublishされるアラートの2種類の情報を受け取る。

  • アクション:iot:Publish
  • リソースARN:arn:aws:iot:ap-northeast-1:XXXXXXXXX:topic/alert/TempAndHumi/*
  • 効果:許可にチェック

「作成」ボタンをクリックする。

アラート用のステートメントの作成

以下のポリシードキュメントが作成される。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/SKRP*"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/dt/TempAndHumi/*"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/alert/TempAndHumi/*"
    }
  ]
}

ポリシーのアタッチ

証明書に作成したポリシーをアタッチする。

”安全性”ー>”証明書”で先程作成した証明書を選択した後、”アクション”ー>”ポリシーのアタッチ”をクリックする。

ポリシーのアタッチ

先程作成したポリシーを選択して「アタッチ」ボタンをクリックする。

これにより証明書とポリシーが関連付けられる。

ポリシーをアタッチ

エンドポイントを控えておく

後程プログラムで使用するので作成したモノのエンドポイントを控えておく。

エンドポイントは作成したモノを選択して”操作”をクリックすると表示される。

2022年3月31日 追記

今は左のメニューから”設定”を選択すればエンドポイントが表示される。

エンドポイントを控えておく

Amazon SNSの設定

Amazon SNS(Simple Notification Service)の設定を行い、アラート時にメッセージをメールに送信する。

上記IoT CoreでTPOICがalertで始まるポリシーを設定したがその際にAmazon SNSを使ってメール(やSMS)を送信する。

トピックの作成

左側のメニューから”トピック”を選択して「トピックの作成」ボタンをクリックする。

トピックの作成

  • 名前:temp_alert
  • 表示名:temp_and_humi_alert(この件名でメールが来る)

トピックの名前

  • 暗号化(オプション)
  • アクセスポリシー(オプション)
  • 配信再試行ポリシー(オプション)
  • 配信ステータスのログ記録(オプション)
  • タグ(オプション)

はデフォルトのままで「トピックの作成」ボタンをクリックする。

トピックの作成

サブスクリプションの作成

”トピックが正常に作成された”とのメッセージが表示されるのでトピックの元にサブスクリプションを作成する。

尚、トピックに対して複数のサブスクリプションを作成することが出来る。

「サブスクリプションの作成」ボタンをクリックする。

サブスクリプションの作成

プロトコルで”Eメール”を選択する。

プロトコルでEメールを選択

  • エンドポイント:送信先のメールアドレス

エンドポイントにEメールアドレス

  • サブスクリプションフィルターポリシー(オプション)
  • Redriveポリシー(オプション)

はデフォルトの設定のままで「サブスクリプションの作成」ボタンをクリックする。

サブスクリプションの作成

サブスクリプションが作成される、ステータスは”保留中の確認”になっている。

サブスクリプションが作成された、ステータスは保留中

上記で設定したメールアドレス宛に確認メールが来るので”Confirm subscription”リンクをクリックする。

確認メール

下記のメッセージが表示されてメールアドレスが承認される。

メールアドレスが承認された

サブスクリプションのステータスが”確認済み”になっている。

ステータスが確認済みになっている

IoT CoreのACT

Amazon SNSのトピックが作成されたのでAWS IoT Coreでアラート情報を受信(サブスクライブ)した時にSNSのトピックにメッセージを送信する様にルールの設定を行う。

AWSのサービスからIoT Coreを選択する。

左側のメニューから”ACT”ー>”ルール”をクリックしてルール画面にて「作成」ボタンをクリックする。

ルールの作成

  • 名前:alert_temp_humi
  • 説明:Temperament and Humidity check alert(日本語は使えない)

と設定する。

ルール名と説明

ルールクエリステートメントに以下のselect文を指定する。

SELECT * FROM 'alert/TempAndHumi/#'

「アクションの追加」ボタンをクリックする。

尚、ワイルドカードが#(シャープ)なので注意が必要

ルールクエリーステートメントの設定

”SNSのプッシュ通知としてメッセージを送信する”を選択する。

SNSプッシュ通知

一番下までスクロールして「アクションの設定」ボタンをクリックする。

アクションの設定

  • SNSターゲット:先程作成したトピック(temp_alert)を選択する
  • メッセージ形式:JSON

「ロールの作成」をクリックする

トピックの選択

  • 名前:temp_alert_role

「ロールの作成」ボタンをクリックする。

ロールの作成

ロールが追加されて選択されているので「アクションの追加」ボタンをクリックする。

アクションの追加

先程の画面に戻るので「ルールの作成」ボタンをクリックする。

ルールの作成

alert_temp_humiが作成されるので右端の三点マークをクリックして”有効化”を選択する。

有効化する

以上の設定でラズパイゼロからアラート情報が送信(Publish)されるとAWS IoT Core→Amazon Simple Notification Service→メールの流れでアラートメールが送信される。

続く

長くなったので今回の記事は一旦終了。

次はAWS DynamoDBの設定の記事とする。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。