ミーティング中の来客時に便利 ! AWS IoT でインターホンと警告灯を連動させてみた
渡邉 聡
はじめに
は、私の部屋のインターホンスピーカーが鳴る問題を解決しつつ、ピアノレッスン中でもしっかり来客に気付けるように AWS IoT を使って解決していきたいと思います。
実際にお試し頂くために、今回作成したソースコードも下記に置いておきました。
目次
1. 利用するデバイス
2. 利用する AWS のサービス
3. 全体のアーキテクチャ
4. M5StickC を使ってアナログ信号を MQTT メッセージに変換する
4-1. Arduino IDE のセットアップ
4-2. ライブラリのセットアップ
4-2-1. PubSubClient のセットアップ
4-2-2. ArduinoJson のセットアップ
4-3. 実装
4-3-1. MQTT エンドポイントの確認
4-3-2. デバイス証明書を発行する
4-3-3. ソースコードを修正する
4-3-4. ビルドを実行しデバイスへ転送する
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 利用するデバイス
この記事で作ったものは以下のデバイスを利用しています。
- M5StickC
ESP32 を搭載した超小型マイコンモジュール
- PATLITE NHL-FV2
AWS IoT に対応した世界初クラウド対応ネットワーク表示灯
https://www.patlite.co.jp/lp/aws_integration/
アナログ⼊⼒をデジタル変換し、信号をクラウド側の仕組みに連携するために今回は⼩型マイコンの M5StickC を使うこととしました。M5StickC はアナログ⼊⼒を読み取り、Wi-Fi 接続ができるうえにディスプレイへの表⽰ができるので、今回の⽤途にぴったりです。このマイコンに対して Arduino 環境で開発をしていきます。また、インターホンの⾳声の変換先として、(株)パトライト様よりお借りしていた AWS IoT に対応したネットワーク表⽰灯の NHL-FV2 を使⽤しました。
2. 利用する AWS のサービス
今回の仕組みを作成するにあたり利⽤したサービスは以下のものになります。
- AWS IoT Core
- AWS IoT Events
これらのサービスについてはこの後セットアップしながら説明していきますが、より詳しく知りたい場合は、「詳しくはこちらを」から各種サービスの特徴ページをご覧ください。
AWS IoT Core
AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。 詳しくはこちら »
AWS IoT Events
AWS IoT Events は、IoT センサーやアプリケーションで発⽣したイベントを容易に検出し対応できるようにする、完全マネージド型の IoT サービスです。 詳しくはこちら »
3. 全体のアーキテクチャ
私の部屋のスピーカーに来るアナログ信号を MQTT メッセージに変えて AWS IoT Core に配信し 、同時に AWS IoT Eventsで状態を検出し、状態に合わせた MQTT メッセージをパトライトに向けて配信するという構成です。 具体的には、インターホンが鳴るとパトライトの緑が点灯するのですが、再び⼀定時間内にインターホンが鳴ると次はパトライトの⻩が点灯し、更に⼀定時間内に鳴ると次は⾚が点灯するという具合です。お客様をお待ちさせている状態を⾊で表現してみます。また、⼀定時間経つとパトライトの点灯も消す⼯夫も⼊れておきます。
では、早速作ってみたいと思います。
4. M5StickC を使ってアナログ信号を MQTT メッセージに変換する
まず、部屋まで来ているスピーカーの線から⼀定のアナログ信号を検知したたら特定の MQTT トピックにメッセージを Publish するよう M5StickC に実装していきたいと思います。 今回実装は Arduino IDE を使うことを前提に下記に⼿順を記載していきますが、他にも Arduino 実装を便利に⾏うことができる開発環境やツールが⽤意されていますので、お好みでご利⽤いただければと思います。
4-1. Arduino IDE のセットアップ
こちらのページを参考に Arduino IDE を設定していきます。ドライバのインストール、ArduinoIDE のインストール、ボードマネージャ (今回は M5StickC 向け) の設定、M5StickC ライブラリのインストールまで⾏います。
4-2. ライブラリのセットアップ
今回のプログラムでは検知したアナログ値を MQTT メッセージとして AWS IoT に送信するために PubSubClient というライブラリと、JSON メッセージを簡単に作成するために ArduinoJson というライブラリを使用しています。これらのライブラリをそれぞれ利用できるようにセットアップします。
4-2-1. PubSubClient のセットアップ
Arduino IDE のメニューから "スケッチ" -> "ライブラリをインクルード" -> "ライブラリを管理..." を選択します。 ライブラリマネージャが開いたら検索領域に "PubSubClient" と⼊⼒し検索を実⾏します。
※今回バージョン 2.8.0 をインストールしています。バージョンが異なると今回使⽤するソースコードに変更が必要となる場合がありますのでご注意ください。
クリックすると拡大します
4-2-2. ArduinoJson のセットアップ
PubSubClient と同じようにライブラリマネージャから "ArduinoJson" を検索してセットアップします。
※今回バージョン 6.16.1 をインストールしています。バージョンが異なると今回使⽤するソースコードに変更が必要となる場合がありますのでご注意ください。
クリックすると拡大します
4-3. 実装
4-3-1. MQTT エンドポイントの確認
まず、ソースコードに反映する必要がある MQTT のエンドポイントを確認します。AWS IoT のコンソールを開き設定を選択します。
クリックすると拡大します
カスタムエンドポイント の URI を確認します。この後ソースコードに埋め込む必要があるのでメモしておくと良いでしょう。
クリックすると拡大します
初めて AWS IoT を利⽤する場合はエンドポイントが有効化されていない場合があります。その際はステータスの確認ボタンを押下して有効化してください。
クリックすると拡大します
4-3-2. デバイス証明書を発⾏する
続いて、M5StickC が AWS IoT Core のエンドポイントに接続するために使⽤するデバイス証明書を発⾏します。デバイス証明書には接続の認可を⾏うためのポリシーを割り当てる必要があるので、ポリシーを作成し証明書に割り当てを⾏います。
最初にポリシーの作成を⾏います。AWS IoT のメニューから安全性を展開しポリシーを選択します。
クリックすると拡大します
任意のポリシー名を⼊⼒し画⾯下にスクロールします。
クリックすると拡大します
今回はデバイスを AWS IoT Core に接続 (iot:Connect) し、任意のトピックに対して Publish (iot:Publish) できれば良いので、ステートメントのアクションには iot:Connect, iot:Publish、リソース ARN には arn:aws:iot:apnortheast-1:XXXXXXXXXXXX:client/*,arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/* (リージョン及び XXXXX となっているアカウント ID はご⾃⾝のアカウント ID) とし、効果は許可にチェックしました。
⼊⼒が終わったら作成を押下してポリシー作成を完了します。
クリックすると拡大します
M5StickC に設定するデバイス証明書を発⾏し、先程作成したポリシーを割り当てます。AWS IoT のメニューから管理を展開しモノを選択し、モノ画⾯の中の作成を押下します。
クリックすると拡大します
AWS IoT のモノの作成⽅法について選択肢が出てきますが、今回は単⼀のモノの作成となるので、単⼀のモノを作成するを選択します。
クリックすると拡大します
デバイスの Thing として任意の名前を付け、画⾯下部までスクロールして次へを押下します。
クリックすると拡大します
続いて証明書の作成ですが、今回は AWS IoT が発⾏した証明書を使うので証明書を作成を押下します。
クリックすると拡大します
作成されたモノの証明書、パブリックキー、プライベートキーをダウンロードリンクからダウンロードし保存しておきます。 加えて AWS IoT のルート CA 証明書もリンクからダウンロード (Amazon Trust Services エンドポイント (推奨) の RSA 2048 ビットキーをダウンロード)しておきます。更に有効化ボタンを押下して作成した証明書を有効化しておきます。ダウンロード、有効化が終わったらポリシーをアタッチを押下して次に進みます。
クリックすると拡大します
検索ウィンドウで先程作成したポリシー名を⼊⼒して検索し、リストに表⽰されたポリシーにチェックを⾏い、モノ の登録を押下して作成を完了します。
クリックすると拡大します
4-3-3. ソースコードを修正する
今回作成した M5StickC 用のプログラムは main.ino としてダウンロードファイルの中に含めておきました。Arduino IDE で開き、メモしたエンドポイントの URI とダウンロードした証明書、及びプライベートキーを用いてソースコードを作成してきます。
また、M5StickC をネットワークにつなげる為に、接続先の WiFi アクセスポイントの SSID と接続パスフレーズについても書き換えていただく必要がありますが、M5StickC は 2.4GHz でしか通信できないのでご注意ください。
具体的には下記のソースコードを修正します。
// 以下を環境に応じて変更
#define WIFI_SSID "SSID_STRING" // 接続する WiFi アクセスポイントの SSID に変更
#define WIFI_PASSPHREASE "WIFI_PASSWORD" // WiFi アクセスポイントのパスフレーズに変更
#define DEVICE_NAME "DEVICE_NAME" // デバイス証明書作成時に登録したデバイス名
#define AWS_IOT_ENDPOINT "AWS_IOT_ENDPOINT" // AWS IoT の設定で控えた IoT Core のエンドポイント
また、root_ca, certificate 及び private_key も更新します。
ダウンロードしたルート CA を⽤いて root_ca 変数の -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- の部分を更新し、証明書登録時にダウンロードした XXXXXXXXXX-certificate.pem.crt を⽤いて certificate 変数の -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- の部分を更新、XXXXXXXXXXprivate.pem.key を⽤いて private_key 変数の -----BEGIN RSA PRIVATE KEY----- から -----END RSA PRIVATE KEY----- を更新します。
// ダウンロードした AWS IoT のルート CA 証明書を⽤いて更新
const char *root_ca = R"(-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)";
// AWS IoT からダウンロードした XXXXXXXXXX-certificate.pem.crt の情報を⽤いて更新
const char *certificate = R"(-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)";
// AWS IoT からダウンロードした XXXXXXXXXX-private.pem.key の情報を⽤いて更新
const char *private_key = R"(-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
)";
プログラムの構成としては、setup 関数で表示の設定、WiFi への接続、MQTT 接続の初期化、AWS IoT Core への接続を行い、loop 関数でアナログ値の読み込みを行い、一定の閾値を超えた値を検出した際に、アナログ値を埋め込んだ JSON メッセージを作成して MQTT でトピックに対して Publish しています。また、高頻度で検知する (loop 関数を呼び出す) 必要はないので一定時間の wait を入れた上で loop 関数を終了するようにしています。
4-3-4. ビルドを実行しデバイスへ転送する
Arduino IDE のメニューからスケッチ - 検証・コンパイルを選択してコンパイルを実⾏します。
クリックすると拡大します
問題なくコンパイルが完了したら、スケッチ - マイコンボードに書き込むを選択して M5StickC に書き込みを実⾏します。
クリックすると拡大します
書き込みが⾏えたら、M5StackC でプログラムが起動し、設定した WiFi アクセスポイントへの接続、AWS IoT Core への接続が⾏われ、7 セグメントのフォントで 0 が表⽰されます。
クリックすると拡大します
クリックすると拡大します
5. インターホンのスピーカーの配線を M5StickC に接続する
M5StackC の G36 を使うようプログラムしているので、インターホンスピーカーに対する⼊⼒をこちらに接続することでインターホンの出⼒を取ります。配線の極性を合わす必要があるので、注意が必要です。
配線を接続してインターホンを鳴らし問題ないことを確認します。
クリックすると拡大します
インターホンからの配線の引き回しです。丁度良い⽳が空いていたのでそこから外に配線を延⻑しました。 暫定的にビニールテープで貼り付けての配線となり少々汚いですが (汗)
クリックすると拡大します
実際にインターホンを押してみて反応するかテストします。
クリックすると拡大します
インターホンを押すとアナログ値が検出されて表⽰されました。 また、同時に AWS IoT コンソールのテスト機能を⽤いて今回の Publish 先となっている myhome/chime をサブスクライブして確認するとメッセージが⾶んでくることを確認できます。
クリックすると拡大します
6. AWS IoT Core に来たメッセージを AWS IoT Evenets に連携する
さて、インターホンを鳴らすと AWS IoT でメッセージを受け取れるようになったので、次にそのメッセージをもとにパトライトを点灯するようにします。今回はパトライトの UX を活かす形で、⼀定時間内に複数回インターホンが鳴らされるとパトライトの⾊が緑→⻩→⾚と変わるようにしようと思います。また、留守中やパトライトを設置した部屋にいないタイミングでパトライトが点灯しっぱなしにならないように点灯から⼀定時間経ったらパトライトを消灯させたいと思います。
このような IoT 機器の状態に応じた動作をプログラムレスで実現できる AWS IoT Events を活⽤し実現してみたいと思います。
まずは AWS IoT Core に到達したメッセージを AWS IoT Events に連携するよう設定します。
6-1. AWS IoT Events で⼊⼒の定義を作成する
M5StickC から Publish されるメッセージは、単純なアナログ値のみで Publish され、下記のようなメッセージフォーマットとなっています。
{
"analog_value": 2843
}
この JSON を input.json としてファイルを作成して AWS IoT Events の⼊⼒を作成します。⼊⼒の名前は chime としました。
クリックすると拡大します
6-2. AWS IoT Core から AWS IoT Events にメッセージを連携する
AWS IoT Core に到達したメッセージを AWS IoT Events に連携する為に AWS IoT Core のルールアクションを設定します。
AWS IoT のコンソールから ACT - ルールを選択して作成を選択します。任意のルール名を付けてクエリステートメントには下記を⼊⼒します。
SELECT * FROM 'myhome/chime'
これで myhome/chime トピックに届いたメッセージを AWS IoT Events に連携するようになります。
クリックすると拡大します
さらに、1 つ以上のアクションを設定するの項⽬のアクションの追加から IoT Events ⼊⼒にメッセージを送信するを選択し IoT Events に連携するアクションを追加します。
⼊⼒名は先程 AWS IoT Events の⼊⼒で作成した chime を選択し、メッセージ ID にはメッセージ毎にユニークな ID を IoT Core で割り当てるよう ${newuuid()} を指定しました。ロールについてもロールの作成から新規にロールを作成します。
以上で AWS IoT Core に来たメッセージを AWS IoT Events に連携できるようになりました。
クリックすると拡大します
7. AWS IoT Events でインターホン状態を管理する
AWS IoT Events に連携されたメッセージをもとに状態を管理しパトライトを操作する MQTT メッセージを送信するよう AWS IoT Events で 探知機モデル を作成していきます。パトライトの操作に使う MQTT トピックはこのあと設定しますが、cmd/myhome/patlite とするように設定していきます。また、パトライトに設定した MQTT トピックに
{
"led_red": "1",
"led_yellow": "1",
"led_green": "1"
}
というメッセージを送ることでパトライトの点灯をコントロールできます。各 LED 色のキーに対して "0" (消灯)、"1" (点灯)、"2" (点滅) を設定できる仕様となっています。
このメッセージをインターホンの状態に合わせ IoT Events を使って Publish していくようにしていきます。
今回の AWS IoT Events の設定を予め作成し、エクスポートした Json ドキュメントを chime_status.json としてダウンロードファイルの中に含めておきました。
探知モデル画⾯のアクションメニューの探知モデルのインポートからファイルをインポートすることでご利⽤いただけます。
クリックすると拡大します
インポート直後は探知モデルのパーツの各配置がバラバラで整頓されていませんが、マウスでドラックして配置を整頓すると下記のようなモデルを確認できます。
クリックすると拡大します
各種設定は下記のようになっています。
- normal
- OnEnter
- パトライトを全消灯する為の MQTT メッセージを発⾏
- パトライトを全消灯する為の MQTT メッセージを発⾏
- OnEnter
- first_call
- OnEnter
- 1 分間何もなかったら Normal に遷移するためのタイマー reset_timer をセット
- パトライトの緑を点滅させる為の MQTT メッセージを発⾏
- OnEnter
- second_call
- OnEnter
- 再度 1 分後に Normal に遷移するために reset_timer をリセット
パトライトの⻩を点滅させる為の MQTT メッセージを発⾏
- 再度 1 分後に Normal に遷移するために reset_timer をリセット
- OnEnter
- third_call
- OnEnter
- 再度 1 分後に Normal に遷移するために reset_timer をリセット
- パトライトの⾚を点滅させる為の MQTT メッセージを発⾏
- OnEnter
また、各状態遷移は以下の条件としています。
- to_call_1, to_call_2, to_call_3
- $input.chime.analog_value > 0 の条件を満たしたら遷移
- $input.chime.analog_value > 0 の条件を満たしたら遷移
- to_normal
- reset_timer のタイムアウト
- reset_timer のタイムアウト
モデルの作成が終わったら発⾏ボタンを押して探知機モデルを有効にします。探知機モデルは探知機⽣成メソッドは今回は⼀つの⽞関チャイムだけですので単⼀の探知機を作成するとし、ディテクターの評価⽅法はバッチ評価としています。
クリックすると拡大します
8. パトライトを構成する
さて、ここまででパトライトを制御する準備は整いましたので、あとはパトライトを AWS IoT に接続するよう設定し、点灯を確認していきます。
8-1. パトライト向けのデバイス証明書を発行する
まず、パトライトを AWS IoT に接続する為のデバイス証明書の発⾏を⾏っていきます。
発⾏は M5StickC 向けに⾏った設定と同様になりますので、同様の⼿順でパトライト向けのデバイス証明書を発⾏します。具体的な⼿順は省略しますが、ポリシー設定は M5StickC では接続して Publish だけ⾏えばよかったのですが、⼀点注意点としてはパトライトではメッセージの Subscribe を⾏うので iot:Subscribe も許可するように設定するようにする必要があります。
また、AWS IoT のルート CA 証明書もモノの証明書、プライベートキーとともにダウンロード (Amazon Trust Services エンドポイント (推奨) の RSA 2048 ビットキーをダウンロード) しておきます。
8-2. パトライトを設定する
⾃宅のネットワークで使えるよう諸々ネットワーク設定を⾏った上で、クラウド接続設定で AWS IoT との接続設定を⾏っていきます。
まず、M5StickC のプログラム中にも埋め込んだ AWS IoT のエンドポイント URI も接続先として設定します。 ポート番号はデフォルトのまま 8883、クライアント ID は AWS IoT でモノに対して付けた名前と同じ値を設定しておきます。
Subscribe トピックは AWS IoT Events で指定した cmd/myhome/patlite としておきます。Publish トピックは今回は使⽤しませんが data/myhome/patlite としました。
証明書登録の項⽬では、ダウンロードしたルート CA 証明書、クライアント証明書 (モノの証明書)、クライアント秘密鍵 (プライベートキー) をそれぞれ設定しています。
クリックすると拡大します
以上ですべての設定は完了しました。
早速⽞関でインターホンを鳴らしてみますと、緑⾊の点灯、
クリックすると拡大します
⽴て続けに 2 回⽬を押すと、⻩⾊の点灯に変わり、
クリックすると拡大します
再度 3 回⽬の呼び出しをすることで、⾚⾊の点灯に変わることを確認しました。
クリックすると拡大します
このパトライトには本体の前⾯にボタンがついており押すことでライトが消灯しますが、そのまま放置しておいても IoT Events の動作によって 1 分後には⾃動で消灯することも確認できました。
9. まとめ
今回の DIY によって、リモートでの打ち合わせ中に響くインターホンの呼び出し⾳がうるさくなくなり、かつ、妻からはピアノ教室の⼦供達をエントランスで待たせることなく対応できるようになったと感謝の⾔葉をいただきました。
M5StickC の実装は必要でしたが、それ以外のクラウド側のプログラムによる実装は⼀切なくデバイスの制御ができたのは AWS IoT Events によるメリットも⼤きいところですよね。⾃宅にパトライト設置、この他にもアイデア次第でいろいろな活⽤も考えられそうです。各部屋に配置したくなりました。
筆者プロフィール
渡邉 聡
アマゾン ウェブ サービス ジャパン合同会社
デジタルトランスフォーメーション本部 プロトタイピングソリューションアーキテクト
趣味は DIY で棚や机の作成から、料理から手芸まで興味のあるものは何でも作ってみます。最近は何十年ぶりに自作 PC を組み立ててみました。
AWS を無料でお試しいただけます