IoT機器で温湿度を測定してクラウドでグラフ化 AWS IoT Core編(その2)
Contents
温湿度の測定
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で認証情報を作成すると同時にラズパイに必要なモジュールをインストールする。
主な手順は以下の通り。
- Google Cloud Platformにアクセス
- プロジェクトを作成してAPIを有効化する
- 認証情報を作成する
- アクセス対象のGoogleスプレッドシートを作成して共有設定する
- 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(発信する)に設定しておくが例えばInterval(温湿度測定間隔)を5分に設定した場合、しきい値を超えると5分毎にメール(やSMS)が飛んでくる 実際の現場での対応まで時間が必要で、一旦アラートの送信を停止したい時に0(発信)しないに設定する為の項目 |
M列 | コメント列 プログラム中では使用していない |
AWSの設定
AWS IoT Coreの設定
ラズパイからAWS IoT Coreにデータを送信(Publish)するに辺り、IoT Core側でモノの作成や認証情報の作成が必要になる。
AWSにログインをしてサービスからIoT Coreを選択する。
尚、リージョンは東京を選択している。
モノの作成
”管理”ー>”モノ”から「作成」ボタンをクリックする。
「単一のモノを作成する」をクリックする。
- 名前:RaspZTempHumiCheck
- タイプ:RaspberryPiZero
※タイプは必要に応じて「タイプの作成」で作成する。
尚、タイプ及びこの後出てくるグループ、モノの属性の設定は未設定であってもプログラムは動作する。
数や種類が多くなった時の管理を容易にする機能である。
モノのグループにて”グループの作成”を行いTempHimuCheckのグループを割り当てた。
”検索可能なモノの属性の設定”は未設定で「次へ」ボタンをクリックする。
証明書の作成
モノに対して1対1で証明書を作成する。
「証明書の作成」ボタンをクリックする。
- このモノの証明書
- パブリックキー(プログラムでは使用しない)
- プライベートキー
が発行されるので3つとも”ダウンロード”をクリックして保存する。
次にAWS IoTのルートCAの”ダウンロード”をクリックする。
RSA 2048 bit key”Amazon Root CA 1”のリンクをクリックする。
画面上にAmazon Root CAが表示されるのでコピペしてテキストファイルに保存する。
尚、この際の文字コードはutf-8で保存した。
先程の画面に戻って「有効化」ボタンをクリックする。
次にポリシーの作成を先に行うので一旦「完了」をクリックしてモノの作成は終了する。
ポリシーの作成
このモノに対するアクセス制御の為のポリシーを作成する。
”安全性”ー>”ポリシー”で「作成」ボタンをクリックする。
Connect(接続)用のポリシーを設定する。
このモノにアクセスできるClient名をコントロールする為に以下の設定を行った。
- 名前:Temp-and-Humi-policy
- アクション:iot:Connect
- リソースARN:arn:aws:iot:ap-northeast-1:XXXXXXXXX:client/SKRP*
- 効果:許可にチェック
これでClient名の先頭4文字がSKRPの端末のみがアクセス可能になる。
「ステートメントを追加」をクリックする。
Publish(ラズパイからAWS IoT Coreへの送信)用のポリシーを設定する。
このモノにアクセスできるTOPICをコントロールする為に以下の設定を行った。
- アクション:iot:Publish
- リソースARN:arn:aws:iot:ap-northeast-1:XXXXXXXXX:topic/dt/TempAndHumi/*
- 効果:許可にチェック
これは通常時の温湿度をPublishする為のデータのTOPICの設定。
TOPICについてはプログラミング編で別途説明する。
更に「ステートメントを追加」をクリックする。
アラート時の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/*"
}
]
}
ポリシーのアタッチ
証明書に作成したポリシーをアタッチする。
”安全性”ー>”証明書”で先程作成した証明書を選択した後、”アクション”ー>”ポリシーのアタッチ”をクリックする。
先程作成したポリシーを選択して「アタッチ」ボタンをクリックする。
これにより証明書とポリシーが関連付けられる。
エンドポイントを控えておく
後程プログラムで使用するので作成したモノのエンドポイントを控えておく。
エンドポイントは作成したモノを選択して”操作”をクリックすると表示される。
今は左のメニューから”設定”を選択すればエンドポイントが表示される。
Amazon SNSの設定
Amazon SNS(Simple Notification Service)の設定を行い、アラート時にメッセージをメールに送信する。
上記IoT CoreでTPOICがalertで始まるポリシーを設定したがその際にAmazon SNSを使ってメール(やSMS)を送信する。
トピックの作成
左側のメニューから”トピック”を選択して「トピックの作成」ボタンをクリックする。
- 名前:temp_alert
- 表示名:temp_and_humi_alert(この件名でメールが来る)
- 暗号化(オプション)
- アクセスポリシー(オプション)
- 配信再試行ポリシー(オプション)
- 配信ステータスのログ記録(オプション)
- タグ(オプション)
はデフォルトのままで「トピックの作成」ボタンをクリックする。
サブスクリプションの作成
”トピックが正常に作成された”とのメッセージが表示されるのでトピックの元にサブスクリプションを作成する。
尚、トピックに対して複数のサブスクリプションを作成することが出来る。
「サブスクリプションの作成」ボタンをクリックする。
プロトコルで”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ターゲット:先程作成したトピック(temp_alert)を選択する
- メッセージ形式:JSON
「ロールの作成」をクリックする
- 名前:temp_alert_role
「ロールの作成」ボタンをクリックする。
ロールが追加されて選択されているので「アクションの追加」ボタンをクリックする。
先程の画面に戻るので「ルールの作成」ボタンをクリックする。
alert_temp_humiが作成されるので右端の三点マークをクリックして”有効化”を選択する。
以上の設定でラズパイゼロからアラート情報が送信(Publish)されるとAWS IoT Core→Amazon Simple Notification Service→メールの流れでアラートメールが送信される。
続く
長くなったので今回の記事は一旦終了。
次はAWS DynamoDBの設定の記事とする。
最近のコメント