Node-Redはコーディングレスでデータフローを作成し、リモートから情報を受け取ったり、ローカルの情報と組み合わせてデータを保存、送信すると言った流れを作成できます。このNode-RedはIoT分野でも活躍しています。コーディングをせずにデータフローが作れるのは大きな利点です。

Webブラウザ上で開発を行えるので手軽な反面、それをリモートに多数あるデバイスに反映するのが困難です。今回はisaaxを使って、リモートデバイスのNode-Redを更新する方法を紹介します。

前提条件

前提条件として、手元に開発環境のRaspberry Piがあることとします。そして、そのRaspberry Pi上でNode-Redが動いている状態です。

そのRaspberry Pi上で作ったフローをリモートにあるRaspberry PiのNode-Redに反映します。

環境構築する

注意点

isaaxを使ってNode-Redは起動させません。Node-Redは起動に若干の時間を要するので、常に起動した状態にしておきます。そのため、Raspberry PiにあらかじめNode-Redをインストール&起動しておく必要があります。

Node-Redのインストール

Node-RedはNode.jsが必要です。

$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n stable

Node.jsのインストール後、Node-Redをインストールします。

$ sudo npm install -g --unsafe-perm node-red

Node-Redの起動

Node-Redは以下のコマンドで起動できます。

$ node-red

http://(Raspberry PiのIPアドレス):1880/ にアクセスしてNode-Redのエディタ画面が表示されれば問題ありません。起動したら一度終了します。

設定を変更する

Node-Redの設定を変更します。これは司令塔になる手元にあるRaspberry Piのみで大丈夫です。リモートにあるRaspberry Piは node-red コマンドで立ち上げるだけで問題ありません。

まずisaaxで管理するディレクトリを作成します。作業はこの中で行います。

$ mkdir node-red-isaax
$ cd node-red-isaax

設定ファイルとして setting.js を以下の内容で作成します。

module.exports = {
  flowFile: "flows.json",
}

さらに conf というディレクトリを作成します。

$ mkdir conf

そしてNode-Redを再度実行します。

$ node-red -s ./setting.js -u conf/

これでNode-Redのフローを作成すると、conf/flows.json というJSONファイルで作成されるようになります。

isaaxの設定を行う

次にisaax用の設定を行います。まず node-red-isaax フォルダ内に isaax.json を作成します。内容は以下の通りです。

{
  "name": "node-red",
  "version": "",
  "description": "node-red raspberry",
  "main": "deploy.sh",
  "author": "",
  "language":"shell",
  "license": "",
  "scripts": {
     "start": "sh deploy.sh"
    }
}

さらに deploy.sh というファイルを作成します。ここではNode-Redのフロー反映APIを呼び出します。その際送信するファイルとして、isaaxを通じて配信されるフロー用のJSONファイルを指定します。

#/bin/sh

curl -X POST http://localhost:1880/flows \
     -H "Content-Type: application/json" \
     --data "@/var/isaax/project/conf/flows.json"

自動反映

これでRaspberry Piのフローを編集してデプロイ後、GitリポジトリにプッシュすればリモートにあるRaspberry Piにも自動反映されるようになります。

司令塔になるRaspberry PiにログインしてGitコマンドを叩きたくない場合はファイルの変更を定期的に監視して、特定のコマンドを実行するシェルスクリプト – Qiitaなどを参考にして、フローファイルの編集と同時にGitリポジトリにプッシュする仕組みを作れば良いでしょう。例えば以下のスクリプトになります。

#!/bin/sh
update() {
  echo `openssl sha256 -r $1 | awk '{print $1}'`
}

INTERVAL=1 #監視間隔, 秒で指定
no=0
last=`update $1`
while true;
do
  sleep $INTERVAL
  current=`update $1`
  if [ "$last" != "$current" ];
  then
    nowdate=`date '+%Y/%m/%d'`
    nowtime=`date '+%H:%M:%S'`
    echo "no:$no\tdate:$nowdate\ttime:$nowtime\tfile:$1"
    git add conf/flows.json
    git commit -m "Auto update"
    git push origin master
    last=$current
    no=`expr $no + 1`
  fi  
done

開発時はプッシュごとに反映で良いですし、本番環境ではリリースのタイミングと使い分けても良さそうです。

まとめ

Raspberry PiとNode-Redの組み合わせはIoTプロジェクトを進める上で、とても手軽な選択肢になりそうです。そして手元の環境で作成したフローを自動的にリモートへ反映する際にisaaxは役に立つことでしょう。ぜひお試しください!

Node-RED日本ユーザ会


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *