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

ラズパイで手軽に作る!ドアロックセンサーの実現【番外編 判定処理をLambdaでやってみよう】

2017.02.08
tacck

寒さ厳しい札幌よりお届けしております、tacckです。
今年も雪まつりのシーズンとなりました。

会社前の大通公園は、とても賑やかな感じです。
会社帰りにイベントに立ち寄れるのも、弊社の良いところですねぇ。

さて、今回は前回までに作成したドアロックセンサーの番外編といたします。
特にセンサー部分に機能追加するのではなく、「ラズパイでやっていた処理をクラウドに持っていくとどうなる?」ということを実現してみたいと思います。

ラズパイで手軽に作る!ドアロックセンサーの実現 シリーズ

処理をクラウドに移すとは?

そもそも、このシリーズで実現したいことは、
「ドアの鍵の開閉を検知して、ユーザーへ通知」です。
これを実現する要素として、

1) 鍵に磁石を設置
2) 磁力を検知できるセンサーでデータ収集
3) センサーのデータをBLE (Bluetooth Low Energy) でRaspberry Piに送信
4) Raspberry Piでデータの変化から鍵の状態を判定
5) 判定結果を AWS IoT を通じてメール送信

というものがあります。
これの4番目のところは、Raspberry Pi上にプログラムを実装することで対応しました。

しかし、世の中のデバイスには、こういう自分で作成したプログラムを自由に載せられないものも存在します。
また、Raspberry Piの処理能力では、(能力が高い方とはいえ)十分な速度で判定処理ができないようなこともあります。

その場合には、デバイスは取得したデータを単純にクラウド上へ渡すだけとし、クラウド内で判定処理を行なうようにすることが必要になります。

AWSのサービスでこれを実現するのが、 Lambda です。

Lambda とは

利用者(今回だと私)がインフラの準備をすることなく、クラウド上でプログラムを実行できるサービスの一つです。

  • 何を契機に呼び出して
  • どういう処理をして
  • 何をするか

ということを設定することで、利用できます。
また、Lambda に書く処理の内容としては、ここで大きな処理を行なわず、次のサービスへどうやって渡すか、という書き方を行ないます。

今回は

  • AWS IoT のルール実行を契機にLambda を呼び出して
  • ステータスのチェックを行ない
  • 条件に応じて SNS でメール送信する

という形にします。
つまり、先に挙げていた実現したい要素の4番目「Raspberry Piでデータの変化から鍵の状態を判定」を、 Raspberry Pi 上のプログラムではなく Lambda で実現します。

Lambda で条件判定してメール送信

AWS IoT で受け取ったメッセージを Lambda へ渡す準備をする

AWS IoT のルールを少し修正します。
前回までは、ルールの Actions に直接 SNS を設定することで、直接メール送信の設定をしていました。
今回は、ここに Lambda を呼び出す設定を追加します。

実際にルールを追加してみましょう。
ルール名 pi_check_lock_rule_locked に対して、追加を行ないます。

まずは、 Add action をクリックします。

画面が切り替わったら、 Lambda を選択し画面下の Configure action をクリックします。

Configure action 画面になったら、 Create a new resource のボタンをクリックします。

ここまで進むと、 Lambda の画面に切り替わります。
引き続き、 Lambdaの設定に進みましょう。

Lambda で条件判定と動作を実装する

Lambda の画面では、 Select blueprint というものが表示された状態になります。
ここの blueprint は「設計図」というような意味で使われています。つまり、これから Lambda を使うにあたって基にするものを選んでください、という画面です。

今回は、 AWS IoT との連携なので、検索キーワード(Filter)に IoT と入れてみましょう。

出てきたものの中で、一番右にある iot-button-email というものが、今回やりたいことに一番近そうです。
せっかくなので、これを利用しましょう。こちらをクリックして、次に進みます。

次は Configure triggers です。
ここでは、 Lambda を呼び出すトリガの設定を行ないます。

「何から」という部分には、すでに AWS IoT が入った状態になっています。
IoT TypeCustom IoT rule を選択します。
Rule name は連携したい AWS IoT のルール名を入れます。先ほど編集対象として選んだ pi_check_lock_rule_locked を入れましょう。
ここまで入力すると、 Rule descriptionSQL statement には pi_check_lock_rule_locked のものが自動的に入力された状態になります。

最後に、下の方にある Enable trigger にチェックを入れ、 Next ボタンをクリックしてください。

次は、条件判定してメール送信を行なう設定です。メール送信には、前回までと同様に SNS を利用します。

まずは、 function に名前をつけます。
今回は、 pi_check_lock_rule_locked_lambda とします。
Runtime はそのまま Node.js 4.3 にしておきます。

Lambda function code のテキストエリアに、コードが書かれています。
内容としては blueprint で選んだ通り、 IoT button が押されたときに SNS でメールを送信する、となっています。

ちなみに、 IoT buttonこちらのことです。先日国内でも販売開始された Amazon Dash Button のオープンプラットフォーム版、といった感じのものです。
(ただし、 IoT button は国内での正規販売がされておりません。利用のためには電波による通信の関係から、いわゆる「技適マーク」の取得が必要です。)

コード自体は長いのですが、今回編集したい箇所は Lambda が呼び出された後に SNS を呼び出すまでの間ですね。
ここに、「条件判定」と「送信するメールの内容設定」の処理を入れたいと思います。
具体的には、127-128行目で「送信するメールの内容設定」が行なわれています。

「条件判定」は無いので、これは追加が必要ですね。
この前後の行含めて、下記のように編集しましょう。

条件として、受け取ったイベントの status が1だった場合「鍵がかかっている」、それ以外を「鍵が開いている」、としてメールのタイトル(Subject)を設定するようにしています。
前回までに、 Raspberry Piのプログラムで AWS IoT に送信するJSONメッセージ内に status という名前をつけていましたが、それを ${event.status} という形で受け取って利用することができます。

コード修正ができたら、少し下にある Environment variables に移ります。
こちらでは、コード内で利用する「環境変数」を設定することができます。
細かいことは抜きにして、ここに key として email があるので、 enter value here に通知を送りたいメールアドレスを記入しましょう。

入力できたら、さらにもう少し下の方にスクロールします。
Role name を入力する箇所があるので、ここに新規のロール名を入力します。ここでは、 pi_check_lock_role_lambda としました。
入力が終わったら、画面下へスクロールし Next ボタンをクリックしましょう。

最後に設定の確認画面が出てきます。
ここもさらっと確認しつつ、画面下の Create function をクリックしましょう。

ここまでで、 Lambda 側の設定は終了です!

が、ここで AWS IoT に戻る前にやっておくことがあります。

遷移した画面に Test というボタンがあります。これは、今作成した設定の動作確認ができるものです。
今回は SNS を利用するので、一度先に Test を実行しておくと、 SNS 側に設定が追加されて確認メールの送信までを行なってくれます。

では、実際に Test ボタンを押しましょう。
Input test event というダイアログが出てきます。 受け取るJSONデータを、ここで擬似的に作っておくことで、動作チェックができるようですね。
今回は、特に気にせずに一番下の Save and test をクリックします。
少し待つと、 AWS Notification - Subscription Confirmation というメールが送信されてくるので、そのメール内にある Confirm subscription をクリックして、メールアドレスが正当なものである確認をしてください。
(この辺りは、第二回に出てきましたね。)

ここまでできたら、 AWS IoT の設定に戻りましょう!

AWS IoT で受け取ったメッセージを Lambda へ渡す

AWS IoT のタブに戻って、設定の続きです。
Create a new resource の左側にあるリフレッシュボタン (クルッと丸くなっている矢印) を一度クリックした後に、さらに左のセレクトボックスの「▼」をクリックします。
その中に先ほど Lambda で作成した名前が出てくるので、そちらを選択して右下の Add action をクリックします。

クリックできたら、下の画面になります。きちんと LambdaActions に追加されていますね。

試してみよう

では、実際に Lambda 経由でメールが届くか確認しましょう。
前回の環境があれば、実際に鍵をかける動作を行なえば良いでしょう。
個別にコードで実行する場合には、第二回のコードを参考にしてください。

ということでやってみた結果、無事に下記のメールが受信できました!
タイトルと本文が、今回作成したものになっていることがわかりますね。

まとめ

Raspberry Pi上で行なった条件判定を、 Lambda を使ってクラウド上に実現させることができました。
今回は単純なstatusしか見ていませんが、「磁力の変化に応じてステータス判定」ということもこの中で実現すると理想の形となります。
(ただし「前回」の磁力と比較する必要があるため、さらに他のサービスとの連携が必要になるでしょう。)

AWSなどのクラウドサービスの良いところは、「一つ一つのサービス」がシンプルであり、それらを連携させて複雑なシステムを構築できる、というところにあります。
特に Lambda は、その連携部分である程度の判定処理を交えながら振り分けをできる、非常に協力なサービスです。

また最近は、特に「サーバレス」というキーワードが出てきています。従来のようなインフラ構築を行なわず Lambda のような仕組みを使ってサービスを構築していくことが、「インフラ専門でないエンジニア」に必須のスキルとなってきています。
色々な「サーバレス」のサービスを利用し、システムの開発を行なえるようになっていきましょう。

関連タグ:

tacck Takuya KIHARA

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

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