M5StickCの加速度センサとジャイロセンサの値の変化をAWS IoTを経由して、ElasticSearchとKibanaでリアルタイムにグラフ表示してみる。

#概要
M5STICKCには6軸IMU MPU6886が搭載されており、筐体自身の加速度とジャイロの変化をセンサシングできます。M５STICKC搭載のWIFIを経由し、AWS IoTのMQTTにセンサー値をプッシュし、ElasticSearchのKibanaでリアルタイムにグラフ表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/0512ab2e-a255-999f-d1c9-c3827413bef9.png)

#参考資料
[ESP32でAWS IoTに繋いでThing Shadowを弄る](https://blog.maripo.org/2017/07/esp32-aws-iot/)
[M5Stackを利用したAWS IoTの簡単な使い方](http://kyokucho1989.chillout.jp/2019/08/19/m5stack%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Faws-iot%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/)
[ESP32 DeveloperでAWS IoTを動かそうとしてハマったメモ](https://www.1ft-seabass.jp/memo/2017/07/31/esp32-developer-aws-iot-tips/)
[M5Stack（ESP32マイコン）とAWS IoTで始めるIoT入門](https://karaage.hatenadiary.jp/entry/2018/09/05/073000)
[「AWS IoTのデータをKibanaに表示する」をやってみた。2017/3版](https://qiita.com/moritalous/items/8907685d57ec8d3b5dbb)
[AWS IoTのデータをKibanaに表示する](https://qiita.com/hideyuki/items/eb4a87243eaeafa74c04)

#AWS IoTの設定
[M5Stackを利用したAWS IoTの簡単な使い方](http://kyokucho1989.chillout.jp/2019/08/19/m5stack%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Faws-iot%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/)から「3-1. ポリシーの作成」から「3-3. 証明書の作成」までの手順を実行してください
私が考える注意点を列挙します。
- 名前を付ける際には小文字と数値でつけてください。大文字が混ざるとElasticSearchとの連携がうまくいきませんでした。
- エンドポイントのURLはAWS IoTのコンソールの[設定]で見れます。

#M5StickCのArduinoでの開発

##ソース
https://github.com/MypaceEngine/m5stick_mpu6886_awsiot

##ソースの利用方法
下記の変更が必要です。

| 行      |       変更ソース |    変更内容    |
|:-----------------|:------------------|:------------------|
| 17 | const char* ssid = "<YOUR_SSID>";　|        あなたのWIFIのSSIDを指定してください|
| 18 | const char* password = "<YOUR_WIFI_PASSWORD>";　|        あなたのWIFIのパスワードを指定してください|
| 21 | const char* awsEndpoint = "<AWS_IOT_ENDPOINT>";　|あなたのAWS IotのURLを入力してください。<br>xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com|
| 25 | const char* pubTopic = "<YOUR_TOPIC>";　|あなたのAWS IotのTopicを入力してください|
| 26 | const char* rootCA = "-----BEGIN CERTIFICATE-----\n" \　|        AWS IoTでダウンロードしたCA証明書を入れてください。<br>[ESP32でAWS IoTに繋いでThing Shadowを弄る](https://blog.maripo.org/2017/07/esp32-aws-iot/)を参照<br>複数のCA証明書がありますので、全パターン試してみれば接続できるものがあります。|
| 27 | const char* certificate = "-----BEGIN CERTIFICATE-----\n" \　|        AWS IoTでダウンロードした証明書を入れてください。<br>[ESP32でAWS IoTに繋いでThing Shadowを弄る](https://blog.maripo.org/2017/07/esp32-aws-iot/)を参照|
| 28 | const char* privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" \　|        AWS IoTでダウンロードした秘密鍵を入れてください。<br>[ESP32でAWS IoTに繋いでThing Shadowを弄る](https://blog.maripo.org/2017/07/esp32-aws-iot/)を参照|
| 76 | String clientId = "<YOUR_THING_ID>";　|        AWS IoTのモノで設定した名前を入れてください。|

#AWS IoTでMQTTの受信の確認
[M5Stackを利用したAWS IoTの簡単な使い方](http://kyokucho1989.chillout.jp/2019/08/19/m5stack%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Faws-iot%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/)から「3-6.AWS IoTのテスト画面で確認」の手順を実行してください。
下記が注意点。
- Arduinoのソースの「AWS IotのTopic」で指定した名前を入力してください。

#Elasticの立ち上げ
ElasticSearchの作成には時間がかかります。
1. AWS IoTのトップ画面から「Elasticsearch Service」を押下する
2. 下記のように設定する。

| 項目      |       設定値 | 
|:-----------------|:-----------------|
|デプロイタイプ             | 開発およびテスト Elasticsearch エンドポイントが 1 つのみ必要な場合、1 つのアベイラビリティーゾーン |
|Domain name             | 好きな名前 |
|Instance type             | t2.ｓsmall.elasticsearch |
|Instance count             | 1 |
|Strage type| EBS  |
|ネットワーク構成| パブリックアクセス  |
|ドメインアクセスポリシーの設定| ドメインへのオープンアクセスを許可|

出来上がるまで気長に待ってください。

#アクションの設定
AWT IoTからElasticSearchにデータを流す設定を行います。
1. AWS IoTのコンソールでACTを選択し、右上の[作成]を押下する。
2. 名前と説明を適当につける。ルールクエリステートメントに「SELECT * FROM 'm5stickc_sensor'」を設定する。m5stickc_sensorの部分はArdiunoソースのAWS IotのTopicで設定した文字列を指定してください。
3. [1つ以上のアクションを設定する]の[アクションの追加]を押下し、「Amazon Elasticsearch Service にメッセージを送信する　AMAZON ELASTICSEARCH」を選択し、一番下の[アクションの設定]を押下する。
4. ドメイン名は先ほど作成したElasticSearchを選択する。IDに${newuuid()}、Indexにtimestamp、Typeにtimestampと指定し、IAMロールも追加する。アクションの追加を押下する。
5. 一番下のルールの追加を押下する。

#kibanaの設定
Chromeではだめで、Firefoxでないと動きませんでした。
1. AWSのトップページからElastic Searchを選択
2. 作成されたElasticを選択
3. ページ上にKibanaがあるので押下
4. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/726a1255-688c-73fa-c074-63c08ec06f4e.png)でデータが届いているのを確認します。
5. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/42f0649b-e45a-96c8-55e3-fdbcf272bf0c.png)でグラフ化します。

X軸の設定は下記のように行いました。

| 項目       |       設定 |    
|:-----------------|:-----------------|
| Aggregation              |   terms|  
| Field | timestamp |
|Order By| Alpabetical|
|Order| Descending |
|size|20|

Y軸は下記のように設定しました。
      
| 項目       |       設定 |
|:-----------------|:-----------------|
| Aggregation | TopHit |
| Field | accX |
|Aggregate With| Max|
|Size|1|
|Sort On| timeStamp|
|Order| Descending |

6種類あるので全部設定すると下記のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354086/ceee8e22-4cd9-356c-87bd-7253410516e4.png)


お疲れさまでした。