Amazon Web Services ブログ
Pelion Device Management 管理下のマイコンデバイスにおけるデータの分析・可視化とアラート通知
温度や湿度、加速度などのセンサーを設備に取り付け、その値をクラウドに上げて可視化する、といったユースケースは、商業施設や工場など様々なユースケースで求められています。AWS IoTをはじめとする、AWSのサービスを使うことで、そういったユースケースをすばやく実現することが可能です。これはAWS IoTで管理されているデバイスに限った話ではありません。他のデバイス管理ソリューションをお使いの場合においても、クラウドアプリケーションやデータ分析の用途でAWSをシームレスに利用頂くことができます。
この記事では、Arm Pelion Device Management上で管理されているデバイスから、ログデータをAWS IoT にアップロードし、分析・可視化を行う方法について、具体的な構築手順をご紹介します。ここではWi-Fi環境がない設置場所を想定し、通信手段として3G回線を使用します。また施設内のアラートを管理者に伝えるといったシーンを想定し、記事の後半ではデバイスのボタンを押すと管理者にメールが届く仕組みも構築します。最後に、身近なデバイスでクラウド開発のPoCをクイックに進める手段として、Pelion Device Managementで管理されているRaspberry PiでAWS IoT Coreに接続する方法を紹介します。
概要
 
 
       今回構築する仕組みは、上記のようなアーキテクチャになります。まず、Mbed OSが動作するマイコンが、Pelion Device Managementで管理されています。デバイスは、MQTTプロトコルによって時系列のセンサーデータを3G回線を経由してIoT Coreへアップロードします。IoT Coreのルールエンジンを使って、分析対象のデータのみをIoT Analyticsに送ります。IoT Analyticsでは、収集、処理、保存といった分析の前処理を行いデータセットを作成します。最後に作成したデータセットをQuickSightからアクセスすることでセンサーの時系列データをグラフ描画することが可能になります。
さらに、ここでは触れませんが、AWS IoT Analyticsを用いて作成したデータセットをAmazon SageMakerというAI・MLのサービスにわたすことで、機械学習による高度な予兆保全や、アノマリー検出なども可能になります。
 AWS IoTの認証には、2020年5月に追加されたAWS IoT CoreのMulti-Account Registrationの機能を使用します。これによって、Pelion Device Managementで発行された証明書をIoT Coreに設定するだけで、デバイスは1つの証明書を使って接続することができます。
準備
こちらの記事 の4.2章までを実施し、SIMの設定、センサーおよびボタンの接続、Pelion Portal Account の設定を進めてください。以下は、事前に用意していただくハードウェアです。
使用するハードウェア
- Seeed Wio 3G
- GROVE – 温湿度・気圧センサ(BME280)
- GROVE – 青LEDボタン
- SIMカード
- Raspberry Pi 3 B+, microSDカード (Raspberry Pi のセクションを実施する場合)
デバイスの実装
Multi-account Registration
2020年5月に発表されたAWS IoTの新機能である、Multi-Account Registrationを使用し、Pelion Device Managementで発行された証明書をAWS IoTに登録することで、AWS IoTの認証を行うようにします。
まずは、以下のステップでPelion Device Managementから、デバイスの証明書をダウンロードします。
 
 
       
- こちらから、Pelion Device Managementにログインし、左側のメニューから 証明書をクリックします
- 先程登録したデバイス(上図の例では wio)をクリックし、証明書の詳細を表示します
- 証明書の詳細をスクロールし、開発者証明書の項目にあるコピーをクリックします
- 任意のエディタを開き、クリップボードの内容をペーストし、ファイル名を cert.pemとして保存します
次に、証明書をAWS IoTに登録します。
- こちらからAWS IoTのコンソールを開きます
- 左側のメニューの安全性>証明書をクリックします
- 右側の作成をクリックします
- 証明書を作成するのページで、一番下の項目の- 開始方法をクリックします
- CAの選択のページで、CAの登録をせずに、- 次へをクリックします
- 既存のデバイス証明書を登録するのページで- 証明書の選択をクリックします
- 先程保存した証明書を選択し、左側のチェックを入れて、証明書の登録をクリックします
続いて、登録された証明書に紐付けるモノを作成します。
- 左側のメニューの管理>モノをクリックします
- 右側の作成をクリックします
- 項目の一番上にある、単一のモノを作成するをクリックします
- Thing Registryにデバイスを追加の画面で、名前に- device-1と入力し、- 次へをクリックします
- モノに証明書を追加の画面で、- 証明書なしでモノを作成をクリックします
モノの権限を設定するためのポリシーを作成します。
- 左側のメニューの安全性>ポリシーをクリックします
- 右側の作成をクリックします
- ポリシーの作成の画面で、名前にdevice-policyと入力します
- ステートメントを追加の項目で、アクションに iot:*, リソースARNに*と入力し、効果の許可にチェックをいれます- 注意 
            - この記事では、簡単のために、デバイスにすべての権限を許可しています
- ポリシーを適切に設定することでデバイスに与える権限を限定することが可能です
- ポリシーについて詳しくはこちらを参照してください
 
 
- 注意 
            
- 項目の一番上にある、単一のモノを作成するをクリックします
- 以下の図のようになります 
          
- すべて入力し、作成をクリックします
ここまでで、AWS IoTでデバイスを管理するためのモノと、証明書、ポリシーの設定が終わりました。
 最後に、登録された証明書に対して、モノとポリシーを紐付けし、デバイスからアクセス可能な状態にします。
- 左側のメニューの安全性>証明書をクリックします
- 先程登録した証明書をクリックします
- 右上にある アクション>ポリシーのアタッチ をクリックします
- 先程登録した device-policyを選択し、アタッチをクリックします
- 同様に、右上にある アクション>モノをアタッチ をクリックします
- 先程登録した device-1を選択し、アタッチをクリックします
ソースコードの修正
ここまでで、クラウド側の接続するための設定は完了しました。ここではご自身の環境にあわせてエンドポイントを設定します。
- AWS IoTのコンソールを開きます
- 左側のメニューの設定をクリックします
- エンドポイントの欄をコピーします
- 準備のセクションでセットアップしたMbed Studioを起動し、 MQTT_server_setting.hを開きます
- 以下のようにMQTT_SERVER_HOST_NAMEにペーストします
const char MQTT_SERVER_HOST_NAME[] = "<prefix>-ats.iot.<region>.amazonaws.com";なお、MQTT通信で利用する証明書や秘密鍵などの設定は、Pelion Device Managementの設定情報を直接参照するため不要です。
プログラムの実行
プログラムをビルドし、ファームウェアをデバイスに書き込みます。
 
 
       - ボードをUSBケーブルでPCに接続します
- 初回接続時には、ダイアログが出ますが、Yesをクリックします
- Build Program(かなづちのマーク)のボタンをクリックします
- ビルドが完了すると画面下部にあるOutputのウインドウにImageのファイル名が表示されます
- 続いてRun Program(三角のマーク)をクリックします
- 画面右下にある Baud rateを115200に設定します
以上でデバイス側の実装は完了です。定期的に湿度、気圧、温度情報がIoT Coreにパブリッシュされます。
 デバイスのトラブルシューティングについては、こちらの記事をご参考ください。
AWS IoTの設定
ここからは、AWS IoTのコンソールを使って、クラウド側の設定を進めていきます。
 まず最初に、このエリアのデバイスから上がってきた温度データを、分析のために収集・保存するためのサービスであるIoT Analyticsに送信するように設定します。これを実現するために、IoT Coreのルールエンジンという機能を用います。
ルールの設定
- AWS IoTのコンソールを開きます
- 左側のメニューのACT>ルールをクリックします
- 右側のルールの作成をクリックします
- ルールの作成の画面にて、名前に sensorと記入し、下のルールクエリステートメントで以下のように記述します
SELECT parse_time("yyyy-MM-dd'T'HH:mm:sssZ", timestamp()) as timestamp, topic(2) AS area, topic(3) AS device, * FROM 'data/#'-  
          - ルールクエリステートメントでは、上記のようにSQLのような構文でアップロードされたデータのフィルタリングしたり、情報の付加を行うことが可能です
- ここでは、時刻情報と、トピック名に入っているエリア名、デバイス名をそれぞれ、timestamp,area,deviceとして付加しています
- 使用可能な関数についてはこちらを御覧ください
 
- アクションの追加をクリックします
- アクションの中から、IoT Analytics にメッセージを送るを選び、アクションの設定をクリックします
- 選択項目の中から、IoT Analyticsリソースをすばやく作成するを選びます
- リソースプレフィックスに、MySensorと記入し、Quick Createのボタンをクリックします- ここでIoT Analyticsのチャネル、データストア、パイプライン、データセットおよびロールの作成が自動で行われます
 
- 続いて アクションの追加をクリックしルールの作成を続けます
- ルールの作成をクリックします
以上により、センサーデータは、IoT Analyticsへと送られ、データはストレージに保存されるようになります。
IoT Analyticsの設定
次にIoT Analyticsの設定を行います。前の手順によって、すでにIoT Analyticsにデータが蓄積されています。これを確認するために、次のような操作を行います。
- AWS IoT Analyticsのコンソールを開きます
- 左側のメニューのチャネルをクリックします
- チャネルのリストの中から先ほど自動作成された、mysensor_channelを選択します
- モニタリングの項目で、IncommingMassagesとしてカウントされていることを確認します 
          
しばらく待っても届いていない場合は、ルールの設定などを見直します。また、AWS IoTのコンソールに戻り、ログを有効にすることで、原因の調査を行ってください。ログの設定方法については、こちらのドキュメントを確認してください。ここまでの設定により、IoT Analyticsのデータストア mysensor_datastore にログデータが保存され続けるようになりました。続いて、このデータストアのデータから、グラフ表示に使用するデータセットの作成を行います。
- AWS IoT Analyticsのコンソールを開きます
- 左側のメニューのデータセットをクリックします
- データセットのリストの中から先ほど自動作成された、mysensor_datasetを選択します
このmysensor_datasetを確認すると、SQLクエリは次のようになっています。
select * from MySensor_datastoreデータストアに保存されているすべての要素をクエリし、データセットに保存するようになっています。
 以下の手順によりこのクエリを実行し、データセットを作成します。
- 画面右上のアクションをクリックし、続けて今すぐ実行をクリックします
- 画面下部にある結果のプレビューを確認します
 
上記のような形でトピック名に記載されていたareaや deviceの情報を含めて、センサーの値が保存されていることがわかります。
QuickSightの設定
データセットに保存されたデータをQuickSightで可視化します。
アカウントの設定
初めてQuickSightを利用する場合には以下の操作で利用開始します。
- こちらからQuickSightを開きます
- Sign up for QuickSightをクリックし ます
- アカウントのエディションはStandardを選択し、Continueをクリックします- エディションによる違いはこちらをご確認ください
 
- リージョンは現在利用中のリージョンを設定します
- QuickSight account nameに任意の名前を、Notification email addressに任意のメールアドレスを入力します
- ページ最下部にあるAWS IoT Aanlyticsのチェックをいれます
- Finishをクリックします
- 設定が終わったら、Go to Amazon QuickSightをクリックします
データのインポート
- QuickSightを開きます
- 画面左上のNew Analysisのボタンをクリックします
- 画面左上のNew data setのボタンをクリックします
- データソースのリストから、AWS IoT Analyticsを選択します
- インポートするデータセットとして、mysensor_datasetを選択し、Create data sourceをクリックします
- データセットの作成が完了したら、Edit/Preview dataをクリックします
- 次の画像のように、timestampがDateとして扱われるように変更します
 
- Edit date formatのダイアログで、クエリステートメントで入力したフォーマットyyyy-MM-dd'T'HH:mm:sssZを入力します。
- 画面上部のSave & Visualizeのボタンをクリックします
グラフの表示
- 画面左側のFields listから、humidity,temperature,timestampを選択します
- 画面左下のVisual typesの一覧から、Line Chartのアイコンを選択します
- 画面上部のField wellsを展開します 
          
- X axisのtimestamp > Aggregate: Day > Minute をクリックします 
          
- Value のhumidity(Sum) > Aggregate: Sum > Averageをクリックします 
          
- 同様にtemperature(Sum) > Aggregate: Sum > Averageをクリックします
 
 
       以上でセンサーデータを遠隔からモニタリングする環境ができました。今回は使用するデバイスが1台のみですが、複数台デバイスが存在する場合には、PublishするMQTTトピックをdata/area-1/device-2のように変更することで、グラフ上でデバイスごとの差を見ることも可能です。
 今回構築した仕組みでは、日、月ごとなど、データを中長期的に収集し分析を行うことを想定としています。この記事では触れませんが、よりリアルタイムでのモニタリングを行いたい場合には、先述のルールエンジンのアクションとして、Amazon EleasticSearch Service を選ぶことで実現が可能となります。
アラート機能の追加
最後に、デバイスに接続されているボタンを押下したときに、指定したメールアドレスにメールを送信する仕組みを構築します。メールの送信にはAmazon SNSを使用します。基本的な流れは以下のとおりです。
- ルールを追加し、SNSプッシュ通知としてメッセージを送信するようにする
- SNSでEmailを登録する
- 登録されたメールアドレスに確認メールが届くので、そこで有効化する
- ボタンを押す
- メールが届くことを確認する
新たなルールの追加
- AWS IoTのコンソールを開きます
- 左側のメニューのACT>ルールをクリックします
- 右側のルールの作成をクリックします
- ルールの作成の画面にて、名前に alertと記入し、下のルールクエリステートメントで以下のように記述します
SELECT concat("This is the alert from ", topic(3), ". The count is ", count) AS default FROM 'cmd/#'-  
          - ボタンを押したときのメッセージは、cmd/area-1/device-1に送信されます。そのためここでは、先頭がcmd/で始まるトピックの場合にメールを送信するように設定しています
- デバイスから送られてくるメッセージは、{"is_button_clicked":true,"count":1}のような形になっていますが、トピック名に含まれるデバイス名device-1をtopic関数によって取得し、さらにカウント数countと追加の文字列をconcat関数によって繋げることで、以下のようなJsonが出力されるように変換しています
 
- ボタンを押したときのメッセージは、
{"default":"This is the alert from device-1. The count is 1"}-  
          - この形式にすることで、後段のSNSにこのメッセージを送ることができます
 
- アクションの追加をクリックします
- アクションの中から、SNSプッシュ通知としてメッセージを送信するを選び、アクションの設定をクリックします
- アクションの設定の画面において、SNSターゲットの項目で作成をクリックします
- 名前に device-alertと入力し作成をクリックします
- メッセージ形式はJSONを選択します
- ロールの作成をクリックし、device-alert-roleと入力します
- 続いて アクションの追加をクリックしルールの作成を続けます
- ルールの作成をクリックします
以上により、センサーデータは、SNSへと送られます。
メール送信の設定
次にSNSのコンソールでメール送信の設定を行います。
- SNSのコンソールを開きます
- 左側のメニューからトピックをクリックし、トピック一覧にあるdevice-alertをクリックします
- 画面右下にあるサブスクリプションの作成をクリックします
- サブスクリプションの作成画面でプロトコルにEメールを選択し、エンドポイントにアラートを送信するメールアドレスを入力します
- サブスクリプションの作成をクリックします
- 指定したメールアドレスにサブスクリプションの確認メールが届いたら、メール本文の Confirm subscriptionをクリックします
動作確認
ここまでの設定で、デバイスがボタンを押すと cmd/area-1/device-1のトピックにメッセージが送信され、ルールエンジンによってSNSにメッセージが転送され、指定したユーザーにメールが送信されるようになりました。
 青LEDボタンを押すとしばらくして以下のような本文のメールが届きます。
This is the alert from device-1. The count is: 1
このように、どのデバイスが何回ボタンを押したかがメールで通知されるようになりました。
 今回はルールエンジンから直接SNSを呼び出すことで、簡単な内容のメールを送りましたが、実際のユースケースではルールのアクションとしてLambdaを指定し、そこでメール文章を作成してSNS を呼び出すやり方も考えられます。
Raspberry Pi での実装例
最後に、このセクションではPelion EdgeがインストールされたRaspberry Piで、Pelion Device Management 発行された証明書を利用してAWS IoT Coreに接続する方法を紹介します。本セクションで紹介する内容をベースにすることで、特にクラウド開発のPoCをクイックに進めることが可能です。Productionに向けた注意事項についてはセクションの最後で説明いたします。
事前準備
- Pelion Edge チュートリアル の記事にしたがって、Raspberry Pi に Pelion Edge をインストールしておきます
ブートストラップ証明書のコピー
- Pelion Device Management のダッシュボードを開きます
- 左側のメニューの デバイスID>証明書を開きます
- Pelion Edge チュートリアル の記事で発行した証明書をクリックします
- 証明書の詳細のタブが開くので、以下の操作を行います
- 開発者証明書の中身をコピーし、PCに- raspberrypi.crtとして保存します
- 開発者の秘密鍵の中身をコピーし、PCに- raspberrypi.keyとして保存します
- 上記で保存した2つのファイルを Raspberry Pi に SCP などで転送しておきます
scp raspberrypi.crt root@<Raspberry PiのIPアドレス>:./
scp raspberrypi.key root@<Raspberry PiのIPアドレス>:./- またMulti-account Registrationのセクションで説明した方法を用いて、この開発者証明書をあらかじめ AWS IoT Core に登録し、証明書へポリシーをアタッチしておきます。
SDK とルートCA証明書のダウンロード
ターミナルで Raspberry Pi にログインし、以下のコマンドを実行して、AWS IoT Device SDK Python と AWS IoT のルートCA証明書のダウンロードを行います。
cd
git clone https://github.com/aws/aws-iot-device-sdk-python.git
wget https://www.amazontrust.com/repository/AmazonRootCA1.pemファイルを作成
以下のファイルを ~/aws-iot-device-sdk-python/demo.py として保存します。なお、<YOUR-ENDPOINT> の部分はご自身の AWS IoT Core のエンドポイントのURLに変更します。
#!/usr/bin/env python3
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
IOT_ENDPOINT = "<YOUR-ENDPOINT>"
CLIENT_ID = "RaspberryPi"
ROOT_CA_CERT = "/home/root/AmazonRootCA1.pem"
PRIVATE_KEY = "/home/root/raspberrypi.key"
CERTIFICATE = "/home/root/raspberrypi.crt"
client = AWSIoTMQTTClient(CLIENT_ID)
client.configureEndpoint(IOT_ENDPOINT, 443)
client.configureCredentials(ROOT_CA_CERT, PRIVATE_KEY, CERTIFICATE)
client.configureAutoReconnectBackoffTime(1, 32, 20)
client.configureDrainingFrequency(2)
client.configureConnectDisconnectTimeout(10)
client.configureMQTTOperationTimeout(5)
client.configureOfflinePublishQueueing(1)
client.connect()
print("connect MQTT")
while True:
    client.publish("/data/RaspberryPi", "hello world", 0)
    time.sleep(10)実行
Raspberry Pi のターミナルで以下のコマンドを実行すると、10秒おきに AWS IoT Core にメッセージが Publish されます。
unset PYTHONHOME
unset PYTHONPATH
python3 ~/aws-iot-device-sdk-python/demo.py本セクションでは、Raspberry Pi に Pelion Device Management のダッシュボードから開発者証明書や秘密鍵をダウンロードし、AWS IoT Device SDK Python でそれらのファイルを読み込んで AWS IoT Core に接続する方法を紹介しました。一方で Production に向けては、デバイス生産時に秘密鍵をセキュアな領域に埋め込み、証明書を Pelion Device Management や AWS IoT Core に登録することで、デバイスのクレデンシャルのセキュリティを高めるといった方法が取られます。上記で PoC として実装した方法をベースに、AWS IoT Device SDK Embedded C や C++ などにセキュアエレメントへのアクセス用のライブラリなどを組み合わせる方法をご検討ください。
まとめ
この仕組みを実践頂くことで、Pelion Device Management管理下のデバイスにおいても、センサーデータを収集し分析・可視化を行うPoCを開始することが可能となります。さらに、記事の後半でお伝えしたボタンをトリガーにしてメールを通知する仕組みを応用することで、工場などの現場で緊急用のボタンを設置してそれを関係者に伝えるといったことも簡単に導入ができます。今回お伝えした仕組みでは、3G回線を使用しているため、施設内にWi-Fiなどのインターネット環境の準備をする必要なくすぐに設置できることも、PoCを高速に行う上でのメリットになるかと思います。
著書について
 飯田 起弘
飯田 起弘
AWS プロトタイピングソリューションアーキテクト
 電機メーカーでソフトウェアエンジニアとしてIoT関連の新規事業の立ち上げを経験の後、AWSにてプロトタイピングソリューションアーキテクトとして、IoT関連案件のPoC, 本番導入などの支援に携わる。

三平 悠磨
AWS IoT スペシャリストソリューションアーキテクト
 ソフトウェアエンジニアとして会話AIやロボット開発を経験しました。AWS では IoT スペシャリストソリューションアーキテクトとして、お客様の IoT 関連案件を支援しています。





