IBM Developer Japan Webサイトは2021年3月15日をもって終了となり、日本語コンテンツの一部は、オープンソースとして、提供予定です。 URLはこちら

IoT ソリューション開発の出発点として単純なホーム・オートメーション・システムを構築する

最も効果的なホーム・オートメーション・プロジェクトは、時として、実に単純な問題を解決するプロジェクトです。

私の単純なホーム・オートメーション IoT ソリューションを紹介しましょう。このソリューションを考え付いたのは、2 階でヘッドフォンを付けて仕事をしていると、ドア・ベルの音が聞こえないことがあるからです。この問題を解決するために、次のようなスマート・ドアベル・システムを作成することにしました。

  • 家の玄関にモーション・センサーを取り付けて、誰かが玄関の前に立つとセンサーが起動するようにします。
  • 温湿度センサーも取り付けます。外出するときに必要に応じてコートや傘を持っていけるよう、屋外の状態をモニターするためです。
  • PIR センサーを使用してリレーをトリガーすることで、LED ストリップ・ライトを点灯します。暗くなってから帰宅するときに、ドアの鍵穴がよく見えるようにするためです。

私はこれらすべてのセンサーを、Apple HomeKit デバイスとして公開する予定です。HomeKit という Apple のホーム・オートメーション・フレームワークでは、iOS 10 を実行している iPhone または iPad のホーム・アプリを使用して、センサーからデータを読み取って、家に取り付けられたスマート・デバイスを制御できるようになっています。つまり、センサーの測定値を、自分の iPhone から確認することができるのです ( 図 1 を参照)。

図 1. カスタム HomeKit Raspberry Pi デバイス
alt

これから、私が Raspberry Pi 上で稼働する Node-RED と手頃な価格で入手できるいくつかのセンサーとアクチュエーターを使って、このホーム・オートメーション・ソリューションを構築した方法を段階的に説明します。このチュートリアルを参考に IoT のスキルを磨いて、同様のホーム・オートメーション・ソリューションを構築してください。あるいは、このソリューションの概念を適応させて独自の IoT ソリューションの開発を開始することもできます。

この IoT ソリューションを構築するために必要なもの

この IoT ソリューションを構築するには、JavaScript と MQTT の基本を理解している必要があります。

私は開発環境として MacBook Pro を使用しますが、Wi-Fi および同等のソフトウェアがインストールされていれば、Linux または Window PC も開発環境として適切なはずです。このホーム・オートメーション・システムを構築するために使用したソフトウェアとハードウェアは以下のとおりです。

ソフトウェア

  • コマンド・ライン SSH クライアント
  • テキスト・エディター (Sublime Text、Atom など)
  • SD カードにイメージを書き込むソフトウェア (Etcher)
  • Web ブラウザー (できれば Google Chrome または Firefox)
  • Apple のホーム・アプリ (iOS 10 で稼働する iPhone または iPad などの Apple デバイスが必要です)
  • Raspbian Jessie (Raspberry Pi 用マイクロ SD カードにインストールします)
  • Node-RED (デフォルトで Raspberry Pi にインストールされています)

ハードウェア

  • ワイヤレス・ネットワーク・ルーター
  • Raspberry Pi とアクセサリー:
  • Raspberry Pi Zero W または Raspberry Pi 3
  • 40 ピン・ヘッダー
  • Raspberry Pi のケース
  • マイクロ USB ケーブルと USB 電源アダプター (携帯電話の充電器など)
  • 8 GB のマイクロ SD カードと、コンピューターからカードに書き込む際に使用するアダプター。マイクロ SD カードは、空の状態でも Raspbian Jessie がプリインストールされた状態でも構いません。
  • 例えば、このリンク先のページで紹介されている AdaFruit 製スターター・キットには、上記のアクセサリーがすべて揃っています。

このホーム・オートメーション・デバイスは、主電源に接続された USB 電源で動作することになるので、バッテリーや電源管理について懸念する必要はありません。主電源で動作するということは、低電力ネットワーキング・テクノロジー (例えば、市販のホーム・オートメーション・システムで一般的に採用されている Zigbee) を優先的に選択する必要もないことを意味します。

このプロジェクトのネットワーキング・テクノロジーとしては、Wi-Fi を選びました。なぜなら、私の自宅ではすでに Wi-Fi ネットワークを使えるようになっていて、このホーム・オートメーション・システムの信号が到達しなければならない範囲は自宅のローカル・エリア・ネットワーク (LAN) 内に収まるからです。また、Wi-Fi にはデータ・スループットが高いという利点もあります。つまり、接続されたセンサーから、問題なくデータを収集できるはずです。ネットワーキング・テクノロジーの選択については、このリンク先の私の記事「モノのインターネットの中ですべてのモノを接続する」で詳しく説明しています。

私は Raspberry Pi Zero W を使用することにしましたが、Wi-Fi 対応であれば、どの Raspberry Pi を使っても構いません。Raspberry Pi Zero W は、すぐに利用できる小型の安価なシングルボード・コンピューターで、Bluetooth と Wi-Fi があらかじめ組み込まれています。このことから、既存の Wi-Fi ネットワークに接続したり、Bluetooth を使って市販のデバイスを統合したりする必要のある IoT ソリューションには、Raspberry Pi Zero W が理想的な選択肢です。Raspberry Pi は愛好家の間でよく使われているボードなので、開発者の役に立つ豊富なオンライン・リソースおよび互換性のあるデバイスが利用できます。このソリューションに使用するデバイスは、主電源に接続された USB 電源で動作することになるので、バッテリーや電源管理について懸念する必要はありません。

IoT プロジェクトに使用するハードウェアを選択する際に考慮すべきハードウェア要件について詳しくは、このリンク先の私の IoT ハードウェア・ガイドを参照してください。

電子コンポーネント

  • 赤外線 (PIR) センサー。私は Keyestudio 焦電センサーを使いましたが、Arduino 対応のデジタル PIR センサーであれば、どのセンサーでも機能するはずです。
  • Piezo ブザー
  • DHT-11 または DHT-22 デジタル温湿度センサー・モジュール
  • 5V リレー・モジュール
  • ジャンパー・ワイヤー
  • 12V LED ストリップおよび電源アダプター
  • 小型ソルダーレス・ブレッドボード。ブレッドボードは必須ではありません。ブレッドボードを使用しないのであれば、ワイヤーをはんだ付けするという方法を取れます。
  • その他のコンポーネント: デバイスを収容するための小さいプラスチック・ケース ケーブル・タイ 両面テープ

動きを感知するためのセンサーには、市販の赤外線 (PIR) センサーを選びました。また、DHT-11 デジタル温湿度センサー・モジュールをデバイスに取り付けます。これらのセンサーは両方とも手頃な価格で入手できるデジタル 5V センサーです。しかも、Arduino と Raspberry Pi のどちらとも互換性があります。Raspberry Pi のボードにはハードウェアのアナログ・デジタル・コンバーターが搭載されていないため、デジタル・センサーを選択するのが賢明です。アナログ・センサーを使用するとなると、アナログ・デジタル・コンバーターを追加しなければならなくなります。このシステムでは出力コンポーネントとして、動きが検知されるとビープ音を鳴らす Piezo ブザー・エレメントを使用します。このブザーを使用するのはプロトタイプの作成中だけです。最終的なシステムでは、12V LED ストリップを接続した、動きによってトリガーされる 5V リレーを使用します。

工具

  • プラス・ドライバー
  • ホビー・ナイフ
  • はんだごて
1

センサーを Raspberry Pi デバイスに接続する

下の動画で説明する手順に従って、PIR センサー、ブザー、DHT11 温湿度センサーを接続してください。動画に続き、回路を組み立てる際の参考になる図と表を記載します。

GPIO ピンが取り付けられていない状態の Raspberry Pi を入手した場合は、最初にピンをボードにはんだ付けする必要があります。 図 2 に、私が使用した回路を示します。

図 2. センサーとブザーが接続された状態の回路 (「 謝辞」を参照)
alt

表 1 に記載されているように、Raspberry Pi のピン・ヘッダー上では、各コンポーネントのポジティブ・ピンを 5V に接続し、ネガティブ・ピンをアース (GND) に接続し、データ・ピンを GPIO ピンに接続します。表 1 では、中央の列にヘッダーでのピン番号、3 列目に Raspberry Pi GPIO ピン ID が示されています。Raspberry Pi のピン配列は、表の下に記載する図 3 に示されています。

Raspberry Pi のピン・ヘッダー番号と GPIO ピン番号
センサー/デバイス ピン・ヘッダー番号 GPIO ピン番号
PIR センサー
(図 2 の左上を参照)
7 GPIO4
Piezo ブザー
(図 2 の中央を参照)
11 GPIO17
DHT-11 センサー
(図 2 の右側を参照)
40 GPIO21
リレー
(図 6 の右側を参照)
13 GPIO22

コンポーネントを Raspberry Pi の GPIO ヘッダーに接続する際は、図 3 のピン配列を参照してください。

図 3. Raspberry Pi GPIO ピン (出典: http://elinux.org/File:Pi-GPIO-header.png)
alt
2

Raspberry Pi をセットアップする

Pi Zero は非常に小型なので、HDMI または USB 用のフルサイズのポートは搭載されていませんが、両端がミニ HDMI のケーブル/アダプターを追加することは可能です。また、マイクロ USB On-The-Go アダプターや USB ハブを使用して、モニター、USB マウス、キーボードを接続することもできます。ただし、Raspberry Pi をセットアップした後は、これらの周辺コンポーネントは不要になるため、私はこのようなドングルを省略してヘッドレス・モードで Pi Zero を構成するという方法を選びます。

このチュートリアル用に Raspberry Pi Zero W をセットアップする手順は以下のとおりです。

  • 最新バージョンの Raspbian OS をマイクロ SD カードにインストールする
  • マイクロ SD カード上に構成ファイルを追加する
  • Raspberry Pi Zero W を起動する
  • Node-RED を起動してセットアップする
  • 追加の Node-RED モジュールをインストールする
2a

最新バージョンの Raspbian OS をマイクロ SD カードにインストールする

Raspbian がプリインストールされたマイクロ SD カードを使用している場合は、このステップを省略できます。一方、空のカードが出発点となる場合は、最初に最新バージョンの Raspbian オペレーティング・システムをマイクロ SD カードにインストールする必要があります。私が使用するのは 8 GB のマイクロ SD カードです。このカードを、SD カード・アダプターを使用して MacBook からをセットアップします。OS イメージをインストールするには、このリンク先の Raspberry Pi Web サイトで説明している手順に従ってください。

オペレーティング・システムの切り換えは予定していないので、このプロジェクトには NOOBS ではなく、Raspbian Jessie イメージを使用することにしました。私の MacBook には Etcher アプリがインストールされているため、SD カードにイメージを書き込むには、ダウンロードした .zip ファイルを選択し、マイクロ SD カードを選択してから「Flash (書き込み)」をクリックすればよいだけのことです(図 4 を参照)。

図 4. Etcher を使用してマイクロ SD カードに Raspbian をインストールする
alt
2b

マイクロ SD カード上に構成ファイルを追加する

Pi をローカル・ネットワークに接続するために、SD カード上に構成ファイルを追加してワイヤレス・ネットワーク設定をセットアップする作業も必要になります。

wpa_supplicant.conf という名前のファイルを SD カードのルートに追加してください。このファイルに、ネットワーク・パスワードと SSID を含む Wi-Fi 設定を格納します。Sublime Text や Atom などのテキスト・エディターを使用してファイルの内容を編集し、以下の行を追加して ssid 変数と psk 変数の値を指定します。


  network={
      ssid="<wifi network name>"
      psk="<wifi password>"
  }

また、SD カードのルート・レベルに ssh という名前のファイルも追加する必要があります (ファイル自体は空のままで構いません)。このファイルが存在していることで、起動時に Pi 上で SSH が有効になります。

2c

Raspberry Pi Zero W を起動する

マイクロ SD カードを Raspberry Pi Zero W に挿入する準備ができました。カードを挿入し、マイクロ USB ケーブルを Pi 上の電源ジャックに接続して、Pi を起動してください。

お使いのワイヤレス・ルーターが DHCP によって自動的に接続先デバイスに IP アドレスを割り当てるようにセットアップされていないとしたら、初めは Pi に割り当てられた IP アドレスがわかりません。ですが、アドレスを知らなくても、.local という特殊な用途のドメイン名を設定して mDNS を使用すれば、Pi を検出して接続することができます。最もよく使われている mDNS の実装は、Apple の Bonjour サービスです。Mac を使用している場合、このサービスは設定なしですぐに機能します。Linux を使用している場合は、Avahi からこのサービスが提供されています (Zeroconf)。Windows では、iTunes がインストールされていれば、Bonjour もインストール済みになっています。そうでなければ、Apple Bonjour 印刷サービスをインストールすることが、Pi を稼働中の状態にさせる最も簡単な方法となります。

デフォルトで、Raspberry Pi にはホスト名 raspberrypi とデフォルト・ユーザー pi が構成されています。したがって、SSH を使用して Pi に接続するには、以下のコマンドを使用します。


ssh pi@raspberrypi.local

Pi に接続された後、Pi の IP アドレスを調べるには、ifconfig コマンドを実行します。あるいは、node-red を実行したときに、起動メッセージを確認することもできます。Bonjour をインストールして mDNS を使用するという方法を避けたいのであれば、ホーム・ルーターの DNS ログで Pi の IP アドレスを調べて、そのアドレスを raspberrypi.local ホスト名の IP アドレスで置き換えてください。

2d

Node-RED を起動してセットアップし、Node-RED モジュールをインストールする

Node-RED は、物理デバイス、API、そしてその他のオンライン・サービスを互いに接続する IoT フローを、視覚的な Web インターフェースを使用して作成できる開発ツールです。Raspbian Jessie ではデフォルトで Node-RED と node.js がインストールされた状態になっていますが、バンドルされているバージョンは少々古いものです。そのため、私が Raspberry Pi を起動した後、真っ先に行った作業は、Node-RED と node.js をアップグレードすることでした。さらに、DHT-11 温湿度センサーとホーム・キットを操作しやすくするために、いくつかのサード・パーティー製モジュールもインストールしました。

Node-RED には、IoT フローをプログラミングするためのグラフィカル Web インターフェースが備わっています。IoT フローでは、さまざまな要素がノードで表されており、これらのノードを互いに接続して、これらのノード間でデータ・ペイロードを含むメッセージをどのように渡すかを指定します。用意されているノードには、物理デバイスとそのデバイスに取り付けられたセンサーおよびアクチュエーターを表すノード、カスタム関数を実装するノード、ライブラリーまたはサービスへのインターフェースを提供するノードがありますが、モジュール (contrib) を追加でインストールすれば、他の種類のノードも追加することができます。モジュールを追加するには、Node-RED の Web インターフェースを使用します。Web インターフェースの右上にあるメニューを表示し、そこから「Manage Pallette (パレットの管理)」を選択して「Install (インストール)」タブを表示し、画面の左側にあるサイドバーで、コントリビューションとして提供されているモジュールを検索します。

下の動画で、SSH を使用して Raspberry Pi Zero に接続する方法、Node-RED を起動してアップグレードする方法、そして Apple HomeKit を統合するために使用する node-red-contrib-homekit モジュールをインストールする方法を見てください。これらの作業はすべて、Web ユーザー・インターフェースを使用して行います。

Node-RED モジュールをインストールする方法としては、Web インターフェースを使用するのではなく、コマンド・ラインで npm を使用することもできます。

例えば、homebridge モジュールをインストールすると、Apple HomeKit アクセサリーを統合できるようになります。


sudo npm install ‑g homebridge

DHT11 温湿度センサーを簡単に操作できるようにするにするには、node-red-contrib-dht-sensor モジュール (https://flows.nodered.org/node/node-red-contrib-dht-sensor) をインストールします。このモジュールの資料に、BCM2835 ライブラリーと node-red-dht モジュールに対する依存関係がリストアップされているので、これらのモジュールを最初にインストールする必要があります。
BCM2835 ライブラリーのインストール手順と最新バージョンは、http://www.airspayce.com/mikem/bcm2835 で調べることができます。このライブラリーをダウンロードしてインストールするには、Raspberry Pi 上のコマンド・ラインから、以下のコマンドを実行します。


  cd ~
  wget http://www.airspayce.com/mikem/bcm2835/bcm2835‑1.52.tar.gz
  tar xzf bcm2835‑1.52.tar.gz
  cd bcm2835‑1.52.tar.gz
  ./configure
  make
  sudo make check
  sudo make install

ライブラリーのインストールが完了したら、カレント・ディレクトリーを .node-red ディレクトリーに変更し、nmp を使用して node-dht-sensor および node-red-contrib-dht モジュールをインストールします。


  cd ~/.node‑red
  sudo npm install ‑‑unsafe‑perm ‑g node‑dht‑sensor
  sudo npm install ‑‑unsafe‑perm ‑g node‑red‑contrib‑dht‑sensor

図 5. npm を使用して Node-RED -contrib-dht モジュールをインストールする
alt

インストールしたモジュールをリストアップするには、.node-red ディレクトリー内から以下の npm コマンドを実行します。


   npm ls ‑‑depth=0

モジュールを手作業でインストールした後は、Node-RED を再起動することをお勧めします。


   sudo service nodered restart

DHT モジュールのインストールが完了すると、Node-RED の (Web インターフェース内に表示される) パレットに、DHT22 というノード・タイプが追加されているはずです。

3

Node-RED を使用してフローを作成する

私は Node-RED を使用して、このホーム・オートメーション・システムのロジックをセットアップしました。このロジックによって、Raspberry Pi の GPIO ピンに接続されたコンポーネントから測定値を読み取って、これらのコンポーネントを制御します。私はシステムの機能を 2 つのフローに分けました。一方のフローでは、PIR センサーから測定値を読み取り、動きが検知された時点でブザーをトリガーします。さらに、PIR センサーの測定値を Apple HomeKit に公開します (このホーム・キットの詳細については、Apple の資料を参照してください)。もう一方のフローでは、温湿度センサーから測定値を読み取り、温度用と湿度用の 2 つの HomeKit デバイスをセットアップして、これらのセンサーの値をホーム・アプリケーションから確認できるようにします。

3a

PIR モーション・センサーを対象としたフローを作成する

下の動画で説明している手順に従って、PIR センサーとブザーの間に Node-RED フローをセットアップし、PIR センサーが動きを検知するとブザーが鳴るようにしてください。モーション・センサーの状態を iPhone 上の Apple ホーム・アプリ内で表示可能にするために、この動画では Apple HomeKit ノードも構成します。

私の GitHub リポジトリー内にある MotionSensor.json ファイルから、この完成したフローの構成をインポートできます。

フローをインポートするには、Web インターフェースの右上にあるハンバーガー・メニューから「Import From (インポート元)」 > 「Clipboard (クリップボード)」を選択し、この新しいフローの構成をクリップボードに貼り付けます。

3b

DHT11 センサーを対象としたフローを作成する

下の動画で説明する手順に従って、2 番目のフローとして DHT11 温湿度センサー用のフローを追加し、このセンサーを Apple HomeKit デバイスとして公開してください。これによって、ホーム・アプリ内から温度 (摂氏) と湿度 (パーセンテージ) を確認できるようになります。

この温湿度センサーの完成版フローは、私の GitHub リポジトリー内にある TemperatureAndHumiditySensor.json ファイルからインポートできます。

作成したフローを JSON 形式でエクスポートすることで、どのフローでも共有できます。フローをエクスポートするには、まず、フロー内のすべてのノードを選択してから、ハンバーガー・メニューで「Export (エクスポート)」を選択します (ノードが 1 つも選択されていない場合、「Export (エクスポート)」項目は無効にされます)。

3c

LED ストリップ・ライトを対象としたフローを作成する

下の動画で説明する手順に従って、LED ストリップ・ライトをオン/オフにするためのリレーを回路に追加し、オン/オフ動作を PIR センサーによってトリガーできるようにしてください。この動画では、LED ストリップ・ライトの状態を表示して制御できるよう、ホーム・キット・デバイスをセットアップする手順も説明します。

3d

リレーを取り付ける

プロトタイプの作成中に、ドア・センサーが機能しているかどうかを即時にフィードバックする役割としては、Piezo ブザーがうってつけです。けれども、筐体として使用しているプラスチック製ボックスの中にこのブザーを入れたところ、ブザーの音が聞き取りにくいことがわかりました。そこで、最終バージョンの回路からは、ブザーを取り外すことにしました。Piezo ブザーを取り外したことで、筐体内にリレーを取り付けるためのスペースを確保できました。このリレーは、LED ストリップ・ライトをオン/オフに切り換えるために使用する、電気的に制御されたスイッチです。

図 6 に、このリレーを接続するための回路図を示します。表 1 に要約されているように、PIR モーション・センサーが接続されているのはピン 7、DHT11 温湿度センサーが接続されているのはピン 40 です。リレーは、ピン 13 に追加しました。

図 6. リレーを追加したホーム・オートメーション回路 (「 謝辞」を参照)
alt

それぞれのコンポーネントがアース・ピンと 5V ピンに接続されている必要があります。アース・ピンの数は十分にありますが、Pi Zero 上には 5V ピンが 2 つしかありません。この問題に対処するには、小型のブレッドボードを使用するか、あるいは、何本かのワイヤーを 1 つにはんだ付けして、3 つすべてのコンポーネントの間で 5V の接続を共有するという方法を取ることができます。

LED ストリップには別個の 12V 電源装置で電力供給して、リレー上の通常は開いている (NO でマークされた) 端子に LED ストリップを接続する必要があります (図 6 を参照)。こうすることで、リレーがアクティブになると、これらの端子が閉状態になり、それによって LED がトリガーされて点灯するようになります。

4

ホーム・オートメーション・システム (スマート・ドアベル) を設置する

すべての電子回路と Node-RED フローの作成が完了した後のステップは、ホーム・オートメーション・システムを設置することです。すべてのワイヤーとコンポーネントは、筐体の中にまとめて収容されています。この筐体は、クリア・プラスチック・ケースに PIR センサーとケーブル用のカットアウトを設けて作ったものです (カスタム・ケースを 3D プリントし、より長く使える筐体になるよう、シリコンを使って防水加工しました)。

下の動画で説明する手順に従って、リレーと LED ストリップ・ライトを接続し、すべてのコンポーネントをプロトタイプの筐体の中に収容してください。

図 7. 設置後のホーム・オートメーション・システムのプロトタイプ
alt

まとめと次のステップ

このチュートリアルでは、回路を組み立てる方法から、Node-RED を使用してフローをプログラミングする方法、Apple HomeKit を統合する方法までを含め、Raspberry Pi ベースの基本的なホーム・オートメーション・システムを構築するための一連の手順を説明しました。

このプロトタイプ・システムに改善を加えるとしたら、それは明らかに、光センサーを追加することでしょう。その目的は、周囲が暗くなったときにだけ LED ストリップがトリガーされるようにするためです。また、私は家の鍵に Bluetooth Low Energy タグ (Chipolo) を付けていて、それらのタグを Node-RED Chipolo モジュールで読み取るようにしているので、別の改善案としては、動きを検知するだけでライトをトリガーするのではなく、私がドアに近づくとタグを読み取ってそれを認識し、ライトを点灯させるという方法も考えられます。

このホーム・オートメーション・システムはプロトタイプなので、セキュリティーを重視することはしませんでしたが、デフォルトの Node-RED はセキュアではありません。したがって、このシステムを取り付ける前に、認証を追加してエディターのセキュリティーを保護することが、次のステップになります (https://nodered.org/docs/security を参照)。

謝辞

著者は以下の回路図を使用して、このチュートリアルに固有の回路図を作成しました。