SORACOM LTE-M Button powerd by AWS を使って、玄関の電灯をON/OFF制御してみた(改良版)

#はじめに
本記事は、以前投稿した[記事](https://qiita.com/YSFT_KOBE/items/bbd93c8a72527cfea980)をさらに改良したものです。
また、本記事に記載の手順は、以下のマシンでの実行を想定しています。また、AWSを多少触ったことのある人を想定して記載してます。

+ ホストOS：Ubuntu18.04(LTS) / CentOS 7

#概要

以前投稿した[記事](https://qiita.com/YSFT_KOBE/items/bbd93c8a72527cfea980)では、以下のようなシステムを構築しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/fbf1277b-450f-a7d8-2010-de6ad4023225.png)

左上の装置は、SORACOM LTE-M Button powerd by AWSです。
左下の黒基盤のマイコンはESP32DevkitCで、Amazon FreeRTOSを実装しています。さらに左にある緑基盤は100V電源をON／OFFするための制御基盤です。

###動作概要
上記システムでは、以下のような動作をします。

*1.* SORACOM LTE-M Button powerd by AWSのボタンをクリック(シングルクリック、ダブルクリック、長押し)することで、ボタン情報がAWS IoT 1-Cllickサービスを経由して、Lmabda関数がキックされます。

*2.* Lmabda関数では、1-click経由で送られてきたボタン情報を元に、AWS IoT Coreにある以下のトピックに対してパブリッシュを実施します。

|ボタン操作種別|処理内容　　　|
|:----------------|:--------|
| シングルクリック | トピック「Iotdemo/topic/**1**」へ​Publish |
| ダブルクリック| トピック「Iotdemo/topic/**2**」へ​Publish​ |
| 長押し | トピック「Iotdemo/topic/**3**」へ​Publish​ |
    
*3.* ESP32DevkitCマイコンでは、各トピックをサブスクライブしており、データを受信したトピックに応じて以下の処理を実行します。
 
|トピック|処理内容　　　|
|:----------------|:--------|
| Iotdemo/topic/**1** | 電灯ON(点灯) |
| Iotdemo/topic/**2** | 電灯OFF(消灯)​ |
| Iotdemo/topic/**3** | 電灯OFF(消灯)し、システム停止​ |

上記の仕組みによって、玄関の電灯をON／OFFすることが可能になっています。

###課題と改善
上記のシステムですが、以下のような課題がありました。
1. 電灯が点灯したかどうかがわからない。
 電灯がON／OFFさせた後に通知が無いため、本当に玄関の電灯がON／OFFしたかどうかが分かりませんでした。遠隔から（帰宅時等）操作した時、稀にですがSORACOM LTE-M Buttonの通信が失敗し、点灯してない事がありました。

*2.* 電灯を点けっぱなしにしてしまう事がある。
帰宅した後、電灯を消灯させる事を忘れて（点灯していた事に満足してしまい。。。）、朝まで点けっぱなしにしていた事もありました。

上記課題に対して、システムを改良しました。

###改善概要
まず、課題1に対して、以下のような対策を実施しました。

+ 玄関の電灯をON／OFFしたタイミングでLineにメッセージを通知し、状態がわかるように。
+ Lineから特定のメッセージを送ることで、電灯の状態をメッセージとしてLineに返答。

次に、課題2に対しては、以下のような対策を実施しました。

+ 玄関の電灯が点灯している時に、定期的にLineにメッセージを通知する。


上記改善を実施したシステムが下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/66619ebe-4a4a-67a8-a47d-1a4a75784911.png)



赤枠が新規に追加したサービスになります。主にLineとのメッセージのやり取りを行う部分です。


#改善システム構築手順
改善システムの構築手順を記載します。
AWS SAMを使って構築を行いますので、以前投稿した[記事](https://qiita.com/YSFT_KOBE/items/bbd93c8a72527cfea980)の内容を事前に行う必要はありません。

###手順（AWS IoT 1-Click デバイスの登録）
まず初めにAWS IoT 1-Click デバイスを登録します。
SORACOM LTE-M Button powerd by AWSは、AWS IoT 1-Clickサービスに登録できるデバイスですので、AWSコンソールから登録するだけで、各種サービスと連携させることができます。 登録手順は、以下のHPで詳細に記載されていますので、そちらを参照ください。

+ [SORACOM LTE-M Button powered by AWS をクリックしてSlackに通知する](https://dev.soracom.io/jp/start/aws_button_slack/)

実施するのは、STEP1のみで構いません。STEP2以降はSAMで構築します。
登録が完了したら、デバイスIDを確認しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/f70c1c04-de8b-e452-914f-b58b34403ad1.png)

###手順（AWS IoT Core へのモノ登録）
次に、AWS IoT Coreへモノを登録します。制御するマイコンデバイスをモノとして登録します。あわせて、マイコンにFreeRTOSを実装し、クラウドと通信できるようにしておきます。具体的な手順については、[Espressif ESP32-DevKitCでAWS IoT Coreとの通信を行ってみた(Dockerでの開発環境構築)](https://qiita.com/YSFT_KOBE/items/2b3f25546aadcc30deb3)の記載内容をもとに行います。

**1. 環境構築**

[Espressif ESP32-DevKitCでAWS IoT Coreとの通信を行ってみた(Dockerでの開発環境構築)](https://qiita.com/YSFT_KOBE/items/2b3f25546aadcc30deb3)の「開発環境構築」を実施します。

**2. Amazon FreeRTOSのビルドと実行**

環境構築ができたらビルドを実行しますが、その前に以下内容を実施ください。

(1)ソースファイルの差し替え
電灯を制御するためには、ダウンロードしたAmazonFreeRTOSのソースを一部変更する必要があります。[GitHub](https://github.com/YSFT-KOBE/AmazonFRTOS_MQTT.git)で変更したソースを公開していますので、ダウンロードして差し替えてください。但し、差し替えるソースは、**aws_iot_demo_shadow.c**のみです。

(2)Device Shadow機能の有効化
Device Shadow機能を有効化するために、以下のソースを変更します。

```C:amazon-freertos/vendors/espressif/boards/esp32/aws_demos/config_files/aws_demo_config.h
#define CONFIG_MQTT_DEMO_ENABLED
        ↓
#define CONFIG_SHADOW_DEMO_ENABLED
```

上記ができたら、[Espressif ESP32-DevKitCでAWS IoT Coreとの通信を行ってみた(Dockerでの開発環境構築)](https://qiita.com/YSFT_KOBE/items/2b3f25546aadcc30deb3)の「Amazon FreeRTOSのビルドと実行」を実施します。
この時、「AWSCLI/AmazonFreeRTOS/AWSIoTの設定」の手順2：Amazon FreeRTOSの設定で、**thing_name**には"**thingUbuntu**"を設定してください。他の名称を設定すると正しく動作しません。
また、実施する手順は「Amazon FreeRTOS デモプロジェクトをビルド、フラッシュ、および実行」の手順2までです。

###手順（Line Botの作成）
次にLine Botを作成します。作成方法は[こちら](https://qiita.com/YSFT_KOBE/items/8dc62ac40c5112df2ed3)を参照ください。ただし、バックエンド構築手順は実施する必要はありません。
作成が完了したら、以下の項目を確認しておいてください。

+ チャネルシークレット
+ ユーザーID
+ チャネルアクセストークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/60fc992c-ece0-ad80-150a-00fb590d4224.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/927ab8d2-6677-9825-d3ce-c96e6da6f7a2.png)
また、QRコードをスキャンして、Line公式アカウントを友達登録してください。

###手順（バックエンドの構築）
予め、AWS CLI/AWS SAMをインストールおよび設定を実施しておいてください。

構築用のSAMテンプレートやLambda関数などのソースコードを[Github](https://github.com/YSFT-KOBE/LineAwsIot_Sample.git)に公開してますので、そちらを取得してください。
ファイルを取得したら、その中にある**template.yaml**を修正します。

|変更箇所|変更内容|
|:----------------|:----------------|
|CHANNEL_ACCESS_TOKEN: \<channel-access-token\>|\<channel-access-token\>を、手順（Line Botの作成）で確認したLine botチャンネルのチャンネルアクセストークンに書き換える。|
|LINE_USER_ID: \<line-user-id\>|\<line-user-id\>を、手順（Line Botの作成）で確認したLine botチャンネルのユーザーIDに書き換える。|
|LINE_CHANNEL_SECRET: \<line-channel-secret\>|\<line-channel-secret\>を、手順（Line Botの作成）で確認したLine botチャンネルのチャンネルシークレットに書き換える。|
|DeviceId: \<deviceid\>|\<deviceid\>を、AWS IoT 1-Clickサービスに登録したデバイスのIDに書き換える。|
複数箇所修正しないといけませんので、修正漏れが無いようにしてください。
**template.yaml**の修正が終わったら、template.yamlファイルがあるフォルダ（ディレクトリ）配下でコマンドを実行します。

```cmd:実行コマンド
# sam build
# sam package --s3-bucket <s3-bucket> --output-template-file .aws-sam/out.yaml
# sam deploy --template-file .aws-sam/out.yaml --stack-name sam-app --capabilities CAPABILITY_NAMED_IAM
```
###手順（Line BotへのWebhook登録）
バックエンドを構築した時に作成されるApi GatewayのエンドポイントURLを、LineBotのWebhookに登録します。
まず、AWSコンソルーからAPI Gatewayサービスへアクセスし、エンドポイントURLを確認します。確認するAPI名は**sam-app**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/9f648f12-88dd-543a-3cff-09ed1560694c.png)

確認したURLを、Line BotのWebhookに設定します。この時、URLの後ろに”/status”をつけてください。
例）確認したURLが**https://xxxxxx.api.ap-north-1.amazonaws.com**だった場合
&nbsp;&nbsp;&nbsp;**https://xxxxxx.api.ap-north-1.amazonaws.com/status**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/992ddb63-1c28-6963-afd3-20dc9b61af3a.png)

# 動作確認
これでシステムの構築が完了しました。Lineから"点灯状態"というメッセージを送ると、応答メッセージが返ってきます。SORACOM LTE-M Button powerd by AWSを操作してみてください。シングルクリックが点灯、ダブルクリックが消灯です。正しく動作すれば、Lineにメッセージが表示されます。

# マイコンへの接続
ここまでの手順では、マイコンに対して電源以外は何も接続してませんので、実際にマイコンが動作しているか外からは確認することができません。
マイコンに搭載したプログラムには、GPIO0番を、点灯時にON(High) / 消灯時にOFF(Low)するようしていますので、GPIO0番にLEDをつなぐと、動作を確認する事が出来ます。また、以下の図のように、100V電圧制御用基盤(今回は、秋月電子で販売しているソリッド・ステート・リレーキットを使用)を接続することで、電灯のON／OFFが可能になりますので、興味有る方はチャレンジしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307872/b880503f-ebb4-33d5-4378-2804cce70fe5.png)

# 最後に
マイコン関連は少し難易度が高いかもしれませんが、Line Bot／AWSの構築や連携は簡単に行うことができます。
本記事の内容を元に、新たなシステムにチャレンジしてみてください。