ブロックチェーン・AI・システム開発の株式会社INDETAIL

ラズパイで手軽に作る!ドアロックセンサーの実現【第二回 モノからメッセージ送信】

2016.12.22
tacck

すっかり年の瀬となりましたね。
相変わらず札幌の冬に震えるtacckです。こんにちは。

これから、忘年会、クリスマス、大晦日・新年と、イベントが立て続けにあるので、みなさんも体調管理に気をつけましょう。

今回も引き続き、ラズパイでドアロックセンサーを作っていきたいと思います。

このシリーズの目次

(1) AWS IoTの設定 (前回)
(2) Raspberry PiからAWS IoTへメッセージを送信しそれをメールで通知 (今回)
(3) センサーからデータを取得しAWS IoTへメッセージ送信

今回は、(2)を完了させるところを目指します。

復習

ハード

前回で「センサーを使うのは次回」と書ききましたが、使うのは三回目(つまり、さらに次回)です。。

前回やったこと

前回は、主にAWS IoTを使う「準備」を行なってきました。
手元のRaspberry PiとAWS IoTを、サンプルプログラムで繋げられることを確認できているはずです。

Thing(モノ)から特定のメッセージを受け取りメールを送信する

今回は上記の続きとして、Raspberry Piで新たなサンプルプログラムを作成します。
このサンプルプログラムから「鍵が開いた」というメッセージをAWS IoTに送信し、AWS IoT経由でAWS SNSからメールを送信する、という流れを実現していきます。

メッセージ受け取りとアクション定義

では、AWS IoTに設定を追加していきましょう。

AWS IoTでは、Ruleを設定することで、どのようなメッセージを受け取るか、また、受け取ったメッセージに対してどのようなアクションを起こすか、ということを定義します。

今回は、特定のメッセージ(鍵が開いた)を受け取った時にメールを送信する、というルールを作成します。
まずは、左側メニューのRulesをクリックし、Create a ruleをクリックします。

続いて、ルールの名前と説明の入力です。
Nameにはpi_check_lock_rule_lockedDescriptionにはLockedと入力しました。

続けて画面を下にスクロールして、下記画面のように選択・入力を行なっていきます。
Topic filterは、「こういう名前で情報を受け取ります」というルールですね。「鍵の状態」ということで、sensor/lockStatusとします。

また、Conditionは「この条件でアクションを起こす」という意味です。今回は、status1と等しかった場合を「鍵が閉まった」と定義します。この条件の場合に、メールを送信するアクションを起こすようにします。

入力が終わったら、さらに下にあるAdd actionをクリックします。そうすると、下記のページのように「何をするか」を選択するページに遷移します。
今回はメール送信のためにSNSを選択し、ページの下の方にあるConfigure actionをクリックします。

次に、メール送信のためのSNSの設定です。
SNS targetの右側にあるCreate a new resourceをクリックします。

SNSの設定画面に遷移するので、Create new topicをクリックします。

Topic namepi_check_lock_snsDisplay nameCheckLockとしました。
Display nameは、「こういう送信者名でメールを送りますよ」という感じのものです。
入力できたら、Create topicをクリックしましょう。

ダイアログが閉じられると、今入力したTopic nameでTopicが増えていることがわかります。

続けて、ARNの青い文字の部分をクリックします。
すると、Topic detailsという画面に遷移します。

ここでは「メールの送信先」を登録することができます。
まず、真ん中辺りにある、Create subscriptionをクリックします。

ダイアログが出てくるので、ProtocolEmailを選択し、Endpointに自分のメールアドレスを入力します。
入力できたら、Create subscriptionをクリックしましょう。
(今回は、私のGmailアドレスを入力しました。)

ダイアログが閉じると、先ほど入力したメールアドレスに確認メールが送信されてきます。

 

受信確認のために、メール内のConfirm subscriptionをクリックしましょう。
ブラウザが開き、確認完了のメッセージが表示されます。

 

確認完了まで進んだら、AWS IoTの設定画面に戻りましょう。
Create a new resourceの左にある更新ボタンをクリックし、さらに左の選択ボタンをクリックして、
今作ったSNS targetであるpi_check_lock_snsを選択します。

また、その下にあるMessage formatRAWを選択します。

続けて、さらに下にあるIAM role nameの欄のCreate a new roleをクリックして新たなIAM roleを作成します。
今回は、pi_check_lock_roleと入力します。
入力できたら、再度Create a new roleをクリックします。
そうすると、さらにUpdate roleと表示されるので、こちらもクリックし、最後に一番下にあるAdd actionをクリックします。

ここまでで、「メールを送信するアクション」の追加が完了しました。

Ruleの設定画面に遷移した状態になっているので、こちらのページ右下にあるCreate ruleをクリックしましょう。

これで、「メッセージを受信したらメールを送信する」というルール作りは完了です!
次は、Raspberry Piからメッセージを送信してみましょう。

Raspberry Piからメッセージ送信

前回からの変更

前回はAWSからダウンロードしたサンプルコードをすぐに実行しましたが、今回は自分で作成する必要があります。
そのための準備として、下記を実行しておきます。

プログラム作成

自分で作成しますが、参考として上記でinstallしているaws-iot-device-sdkGitHub上の情報を参考にして、下記プログラムを作成します。

先にRuleで定義したtopicであるsensor/lockStatusに対して、鍵が閉まった意味となるstatus: 1をJSONで10秒おきに送る、というプログラムになります。

実行

Raspberry Piで実行

では、実行してみましょう。

無事にメールが届きました!
プログラムで書いたJSONのデータ{ status: 1, message: "Locked" }を、きちんと受け取れています。

ちなみに、10秒ごとにメールを送り続けるので、メールを受信できたらCtrl+Cでプログラムを停止しておきましょう。

まとめ

実際に「Thing(モノ)」からメッセージを出し、それに反応して何かする、という仕掛けが一通りできあがりました。
ここまで色々とやることも多かったですが、かなり見通しが立った状態になったと思います。

次回は(今度こそ)センサーを使って、ドアの鍵開閉を知らせるシステムを完成させます!

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。