ニフクラ ブログ

ニフクラ/FJcloud-Vやクラウドの技術について、エンジニアが語るブログです。

IoTデバイスハブを活用して郵便受け監視システムを作ってみた

こんにちは。見習いエンジニアの大橋です。

宅配便や郵便物が届く予定があるのに外出しなければならない日は、不在中に宅配業者が来ていないか気になって仕方がありません。帰宅するまでに宅配業者が来てしまったかどうか、すでに不在連絡票が郵便受けに入れられてしまったかどうかは、出かけている間にも知りたくなってしまうものでしょう。

そこで、今回は「IoTデバイスハブ」を活用し、宅配物や郵便物が届いたときにメールで伝えてくれたり、遠方にいてもスマートフォンからWebで郵便受けの状態を確認できる「郵便受け監視システム」を作ってみました。

システム概要

こちらが今回製作した郵便受け監視システムの構成とデータの流れになります。
主な構成要素はRaspberry Pi, サーバー, IoTデバイスハブ, ESS, オブジェクトストレージですね。

まずは郵便物の通知フローから説明します。Raspberry Piは、郵便受けの「受け口」の状態をチルトスイッチによって監視します。郵便物が「受け口」に投函される(=チルトスイッチが傾く)と、

  1. Raspberry Piに取り付けられたWebカメラが郵便受け内部の写真を撮影し、オブジェクトストレージにアップロードします。
  2. 次に、写真が撮られたことを通知するためのイベントをIoTデバイスハブに送信します。
  3. イベントを受け取ったIoTデバイスハブは、そのデータをWebhooksスマートモジュールに設定されたURLへ転送します。
  4. 通知を受けたサーバーは、ESSにメールの送信を依頼します。
  5. ESSは、ユーザーに対してメールを配信します。

次に郵便物の撮影フローを説明します。ユーザーは郵便物が投函された時の画像以外に、遠隔地からWebアプリを用いることによって、郵便受けの現状の撮影をRaspberry Piに命令し、その画像を取得することができます。郵便物撮影フローは、ユーザーの操作に起因する処理とWebアプリの動作に分解することができます。ここでは、Webアプリの動作を括弧書きで示します。

  1. ユーザーはWebアプリにアクセスします。
  2. Webアプリはオブジェクトストレージにアップロードされている画像を取得し、表示します。(また、Webアプリは自動で、定期的にオブジェクトストレージから画像を取得し続けます。)
  3. ユーザーがWebアプリを用いてコマンドを発行します。
  4. IoTデバイスハブはコマンドをRaspberry Piに転送します。
  5. コマンドを受け取ったRaspberry Piは、Webカメラによる撮影を行い、その画像をオブジェクトストレージにアップロードします。
  6. Webアプリはオブジェクトストレージから画像を再取得し、ユーザーに対して表示します。

ニフティクラウド側の準備

ニフティクラウドのコントロールパネルから各サービスの準備を整えていきます。まず、画面右上のユーザー名をクリック、アカウントメニューを開き、アカウント管理を選択します。ここで、

  • ニフティクラウドアカウントのAPIキー
  • ニフティクラウドアカウントのシークレットキー

をお控えください。後の設定で必要となります。

IoTデバイスハブの設定

クラウドユーザーガイド(IoTデバイスハブ:プロジェクトの作成)を参考にしながら、

  • プロジェクトの作成
  • デバイスの登録
  • アプリの登録
  • ユーザーの登録
  • Webhookスマートモジュールの登録

を進めていきます。webhookスマートモジュールについては、Event WebhookのURLに、以下のようなURLを設定してください。
http://${ご自身で用意されたサーバーのIPアドレス}:5000/api/events
参考:クラウドユーザーガイド(IoTデバイスハブ:Webhooks スマートモジュールを利用する)

また、IoTデバイスハブの設定作業では、

  • デバイスID
  • デバイスAPIキー
  • WebhookのURL
  • Webhookキー
  • デバイスハブユーザーのAPIキー(アプリシミュレーターからご確認頂けます)

をメモを取るなどしてお控えください。

ESSの設定

ダッシュボードにて、「認証キーの表示」をクリック、

  • SMTPユーザー名
  • SMTPパスワード

を確認し、控えます。

次に、下記を参考にして送信元および送信先となるアドレスを登録します。
クラウドヘルプ(ESS:メールアドレス新規登録)

このとき、登録したメールアドレスを控えてください。

オブジェクトストレージの設定

NIFTY Cloud ニフティクラウドクラウドヘルプ(ストレージ:バケット作成)を参考にバケットを作成します。

また、作成したバケット名を控えます。

Raspberry Pi 3側の準備

Raspberry Piの設定を行います。

以下のようにしてインプットプルアップ回路を組みます。 mailbox-observer_fritzing

赤=3.3V, 黒=GND, 白=21 です。

必要なパッケージ、ライブラリーをインストールしていきます。

$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get install fswebcam
$ sudo apt-get install wiringpi
$ sudo pip3 install git+git://github.com/pachicourse/mode-py.git
$ sudo pip3 install wiringpi

mode-pyライブラリーは、今回のために製作した、Python3でIoTデバイスハブを容易に扱えるようにするためのライブラリーです。

必要な環境変数をセットします。
$ sudo vi /etc/environment

export DH_DEVICE_ID=${デバイスID}
export DH_DEVICE_API_KEY=${デバイスAPIキー}
export DH_ENDPOINT='iot-device.jp-east-1.api.cloud.nifty.com'
export NC_API_KEY=${ニフティクラウドアカウントのAPIキー}
export NC_SECRET_KEY=${ニフティクラウドアカウントのシークレットキー}
export OS_BUCKET_NAME=${バケット名}
export OS_ENDPOINT='jp-east-2.os.cloud.nifty.com'

次に、sourceコマンドを実行します。
$ source /etc/environment

今回製作したプログラム、mailbox-observerをRaspberry Piにデプロイし、実行します。

$ git clone https://github.com/pachicourse/mailbox-observer
$ cd mailbox-observer/raspi
$ sudo -E python3 mailbox_observer.py

Server側の準備

サーバーの設定を行います。OSはUbuntu 16.04 64bit Plain (Ubuntu 64bit)を想定しています。

サーバーがお手元にない場合、ニフティクラウドコンピューティングをお使いください。コンピューティングをご利用頂ける場合には、ファイアウォール設定でIoTデバイスハブのIPアドレス(164.70.5.141, 164.70.5.142)を許可してください。

必要なライブラリー、パッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install python3-pip
$ sudo apt-get install git
$ sudo pip3 install git+git://github.com/pachicourse/mode-py.git
$ sudo pip3 install Flask Flask-API

環境変数をセットします。
$ sudo vi /etc/environment

export ESS_SMTP_ID=${SMTPユーザー名}
export ESS_SMTP_PASS=${SMTPパスワード}
export SMTP_HOST='ess-smtp.cloud.nifty.com'
export MAIL_ADDRESS=${郵便物受け取り通知先メールアドレス}
export WEBHOOK_URL=${WebhookのURL}
export WEBHOOK_KEY=${Webhookキー}
export NC_API_KEY=${ニフティクラウドアカウントのAPIキー}
export NC_SECRET_KEY=${ニフティクラウドアカウントのシークレットキー}
export OS_ENDPOINT='jp-east-2.os.cloud.nifty.com'
export OS_BUCKET_NAME=${バケット名}
export DH_ENDPOINT='iot-device.jp-east-1.api.cloud.nifty.com'
export DH_USER_API_KEY=${デバイスハブのユーザーAPIキー}
export DH_DEVICE_ID=${デバイスID}

次に、sourceコマンドを実行します。
$ source /etc/environment

mailbox-observerをサーバーにデプロイし、config.iniファイルの作成・設定を行います。

$ git clone https://github.com/pachicourse/mailbox-observer
$ cd mailbox-observer/server
$ vi config.ini

以下のように設定します。

[user]
name=${お好きなユーザー名}
password=${パスワード}

実行します。

$ python3 mailbox_observer.py

動作

自宅に設置・運用してみました。

準備を終え、Raspberry Pi側でプログラムを実行した後にチルトスイッチを傾けると、Webカメラで撮影された写真がオブジェクトストレージに送られます。さらに、指定したメールアドレスにメールが届きます。

では、ちゃんと撮影ができているかWebアプリ側から見て見ましょう。以下のURLにアクセスします。
http://${ご自身で用意されたサーバーのIPアドレス}:5000 アクセスしたら、右上のSign inボタンを押すと、以下のような入力画面になるので、config.iniに設定したユーザー名とパスワードでログインします。 mailbox-observer_sign_in

すると、オブジェクトストレージにアップロードされている写真が表示されます。Ratake a Pictureボタンを押せば、Raspberry Piに対してコマンドが発行され、画像が更新されます。どうやらお寿司屋さんのチラシが投函されているようです。 mailbox-observer_check_picture2

まとめ

いかがでしたか?前回の記事ではイベント送信のみでしたが、今回はコマンドの送信も交えて行ってみました。今回製作した監視システムは、郵便受けの監視のみならず、人物の入退室チェックや防犯などにも応用できると思います。

IoTデバイスハブを活用すれば、デバイスやアプリ、ユーザーの管理といった部分から、デバイスへのコマンド送信、アプリへのイベント送信などといったことを管理しやすく、また、簡単に行えます。もし、サーバーのIPアドレスが変わったとしても、所属するデバイスの設定をいちいち書き換える…といったことはせずに、IoTデバイスハブから設定を変えることで解決できます。また、サーバー側からは、コマンドの送信をIoTデバイスハブを中継することによって、デバイスのIPアドレスを意識することなくデバイスを操作することができます。特に、今回のシステムのように、各家庭に設置するようなタイプかつ取り付け先が変わる可能性のあるデバイスでは、このような機能は大変便利です。是非ご利用ください。

--------------------------------
参考サイト
Kensuke Kosaka's Blog Flaskで認証