DesignSpark Electrical Logolinkedin
Menu 検索
フォーラムで質問

Raspberry Pi 2とNode-REDを使ったホームオートメーション

Node-REDは、Raspberry Piで実行できるモノのインターネットの配線を定義し、プロジェクトの迅速なプロトタイピングを可能にするビジュアルツールです。このチュートリアルでは、まずNode-REDをRaspberry Pi 2で設定してから、温度センサの値を読み取ってLightwaveRF主電源ソケットを制御するフローを作成します。

title

ここでは、Raspberry Piのネットワーク設定が完了し、SSHが行える状態になっていることを前提としています。
まずディストリビューションが最新の状態かどうか確認します。

$ sudo rpi-update

$ sudo reboot

Raspberry Piが再起動したら、再びログインして以下を実行します。

$ sudo apt-get update
$ sudo apt-get upgrade

ハードウェア

以下のハードウェアを使用します。

ハードウェアを以下の図のように接続します。

title

ここでは、温度センサとワイヤレストランスミッタをRaspberry Piに接続しています。それぞれに電源、アース、データ接続があり、Raspberry PiのGPIOヘッダーの正しいピンに接続されていることを確認してください。また、アンテナ線がワイヤレスモジュールに接続されていることも確認してください。

LightwaveRFコントロールの設定

ワイヤレス主電源ソケットを制御するには、wiringPiとlightwaverf-piをインストールする必要があります。まずwiringPiをインストールします。

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build

wiringPiが正しくインストールされたかどうかをテストします。

$ gpio -v
$ gpio readall

title

次に、lightwaverf-piをインストールします。

$ git clone https://github.com/leachj/lightwaverf-pi.git
$ cd lightwaverf-pi
$ make
$ sudo make install

title

テスト送信コマンドを実行します。
$ sudo ./send 0
このコマンドでエラーが発生しなければ正常にインストールされています。次に、Raspberry Piと主電源ソケットのペアリングを試行して、ワイヤレスコントロールをテストします。
主電源ソケットをプラグに差し込み、インジケータライトがオレンジ/青に点滅するまで側面のボタンを押し続けて、ペアリングモードにします。次に信号を送信します。
$ sudo ./send 1

ソケットがRaspberry Piとペアリングされるはずです。ステータスライトの点滅速度が速くなり、正常に完了したことを確認できます。以下のコマンドでソケットの電源をオン/オフにできます。
$ sudo ./send 1
$ sudo ./send 0

Node-REDのインストール

まず、Node.jsをインストールします(このRaspberry Pi 2での手順は以前のRaspberry Pi基板での手順とは異なります)。

$ curl -sL https://deb.nodesource.com/setup | sudo bash -
$ sudo apt-get install -y build-essential python-dev python-rpi.gpio nodejs

次に、Node-REDをインストールします。
$ sudo npm install -g node-red

Node-REDを起動します。

$ node-red-pi --max-old-space-size=128

これで、Node-REDサーバーがRaspberry Piで起動します。新しいWebブラウザのタブを開き、Raspberry PiのIPアドレスであるポート1880に移動します。Node-RED環境が読み込まれ、使用可能な状態になっているはずです。

title

ここで、Node-RED内からDS18B20温度センサを使用するための新しいノードを追加します。正常に動作させるには2つのカーネルモジュールが必要になるため、まずカーネルモジュールを読み込みます。

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm

モジュールを手動で読み込むのは簡単ですが、ここでは起動時に自動的に読み込まれるように、/etc/modulesファイルを編集します。

$ sudo nano /etc/modules

モジュールの名前をそれぞれの行に追加します。

title

ds18b20モジュールからデータを読み取るノードをインストールします。

$ cd /usr/lib/node_modules/node-red
$ sudo npm install node-red-contrib-ds18b20 --save

次に、/boot/config.txtファイルに行を追加する必要があります。

$ sudo nano /boot/config.txt

ファイルの最後に、次の行を追加します。

dtoverlay=w1-gpio,gpiopin=4

ファイルを保存して終了したら、再起動してRaspberry Piに再びログインします。
温度センサが正常にRaspberry Piに接続され、データを取得できるかどうかテストします。

$ cd /sys/bus/w1/devices
$ ls

title

上のような画面が表示されるはずです。ここでは、センサは28-000006439bd5として表示されます。センサに直接切り替えます。

$ cd 
e.g.
$ cd 28-000006439bd5

センサはw1_slaveファイルに情報を書き込むので、そのファイルにデータが書き込まれているか確認します。

$ cat w1_slave

2つの行が表示されれば、センサはRaspberry Piに接続され、データを書き込んでいることになります。

Node-REDフローの作成

センサノードが正常にインストールされ、温度データがNode-REDに供給されるか確認します。

$ node-red-pi

title

Webブラウザを開き、Raspberry PiのIPアドレスであるポート1880に移動します。「ds18b20」という新しいノードが左側のメニューの下方に表示されます。このノードをワークスペースにドラッグします。ここで、ノードを設定して、使用するセンサIDを指定する必要があります。ノードをダブルクリックして編集画面を開きます。最初のドロップダウンタブでデバイスIDを選択できます。ここで、温度の読み取り間隔を変更することもできます。デフォルトは1分です。読み取り間隔の時間が経過しないと最初のメッセージがdebugコンソールに表示されないため、テスト中は間隔時間を0.1などの値に変更できます。

debugノードをドラッグし、2つのノードを接続します。Node-REDワークスペースで複数のノードを接続すると、フローとして表示されます。フローはサーバー上で実行する前に展開しなければなりません。ワークスペースの右上隅にある[Deploy (展開)]ボタンをクリックし、フローを展開します。設定を変更した場合は、サーバーでの実行に反映させるために再展開する必要があります。

title

センサを使った基本的なフローをテストしたところで、以下を実行する、より複雑なフローを作成してみます。

  • センサから温度を読み取る
  • ソケット(ヒーター)をオンにするべき温度かどうか判断する
  • ソケットをオンにするべき日かどうか判断する
  • ソケットをオンにするべき時間帯かどうか判断する
  • ソケットのステータスをオン/オフに変更する

Node-REDには多くの便利なノードが付属していますが、その1つが上で使用したdebugノードです。ここではinjectノードも使用してテストをサポートします。この場合、ノードのボタンをクリックするだけで、メッセージペイロードを送信できるようになります。つまり、コードをテストする場合は、時間ベースデータの時間が経過するまで待機する必要がありません。

さらに、functionノードを使ってロジックを実装し、ソケットをオン/オフにするタイミングを判断します。

最後に、execノードでNode-RED内からシェルコマンドを実行します。このノードでは、ワイヤレスソケットの制御に使用したsendコマンドを実行します。

execノードをワークスペースにドラッグします。ダブルクリックして編集画面を開き、以下の詳細を[Command (コマンド)]フィールドに追加します。

sudo //send 

sudo /home/pi/SW/lightwaverf-pi/send

title

[Name (名前)]フィールドにテキストを追加します。ここでは「switchExec」と入力します。ノードに名前を付けることで、大きく複雑なフローでもノードを区別しやすくなります。このexecノードは、ノードが入力メッセージを受け取るたびにコマンドの実行を試みます。コマンドの追加引数もメッセージペイロード内で送信できます。このコマンドには、前の例で使用した「0」や「1」の引数が含まれていません。これはフローの中でexecノードにこれらの引数を渡すからです。

そのためのfunctionノードも後述しますが、ここではinjectノードを使ってexecノードが正常に機能することを確認します。2つのinjectノードをドラッグします。それぞれのノードを順にダブルクリックして、「Payload」タイプが「string」になっていることを確認し、「payload」フィールドに0や1が表示されることを確認します。

各injectノードの出力をexecノードに接続し、一番上のexec出力をdebugノードに接続して、フローを展開します。いずれかのinjectノードのボタンをクリックすると、execノードによって「sending command」というメッセージがdebugコンソールに書き込まれます。また、クリックに応じて主電源ソケットのオン/オフも切り替わります。この場合、ソケットをすばやく切り替えると損傷する可能性があるため、そうした操作は避けてください。

これで、ワイヤレスコントロールを構築し、フローを作成して、カスタムコードをfunctionノードに追加できました。functionノードをドラッグし、以下の図のようにすべてを配線します。

functionノードをダブルクリックし、以下のコードを追加します。

//Control mains socket based on day, hour and temperature

//create date object
var d = new Date();
var day = d.getDay();
var hour = d.getHours();
var DAY = day;
var HOUR = hour;

//line to accept numbers in for testing
//var day = parseInt(msg.payload);

// change var DAY to 0 or 1 depending on day - we want Monday-Friday
if (day >= 1 && day <= 5) {
  DAY = 1;
}
else{
DAY = 0;
}

// change var HOUR to 0 or 1 depending on hour - we want 0700-1800
if (hour >= 7 && hour <= 17) {
  HOUR = 1;
}
else{
HOUR = 0;
}

// Format payload out to 0 or 1 depending on HOUR, DAY and temp/msg.payload - we want day/time as above and temperature setting of 23 degrees C
if (HOUR == 1 && DAY == 1 && msg.payload <= 23) {
  msg.payload = 1;
}
else{
msg.payload = 0;
}

return msg;



title

フローを展開します。Raspberry Piで読み取った温度に従ってオン/オフが切り替わるように主電源ソケットを設定できました。最後に、Node-REDが起動時に実行されるように設定します。ここでは、Node.js用のプロセスマネージャであるPM2を使用します。

$ sudo npm install -g pm2

Raspberry Pi上のnode-redのインストール場所を指定します。

$ which node-red
$ pm2 start /node-red --node-args="max-old-space-size=128" -- -v

これで、Node-REDがバックグラウンドで起動するようになります。

title

 


PM2プロセスのステータスは複数の方法で確認できます。

$ pm2 status
$ pm2 info node-red
$ pm2 logs node-red

PM2が起動時に実行されるように指定します。

$ pm2 startup

再起動してすべて正常に動作することを確認します。Node-REDが設定どおりに起動し、フローの実行を開始します。

functionノードは必要に応じて変更できます。異なる値や異なる条件で試してください。簡単に追加できる他の出力ノードもあります。例えば、Twitterノードを使用すると、ソケットがオン/オフになったときに通知できます。

maker, hacker, doer

13 Mar 2015, 11:07