rohaniのブログ

ゆるっと自然言語処理奴。ときどき工作系バイト。

MacにNode-REDの環境を構築し、はじめてのNode-REDプログラミングでHTTP通信を試した(RaspberryPi-Mac)

RaspberryPiを使ったモノをバイト先のメンバと共同開発することになった。 通信システム担当。

センサやらArduinoやらを扱う都合でRaspberryPiのプログラミングにはNode-REDを使うことになり、
通信部分もNode-REDを使って実装することになった。

今回初めてNode-REDを扱ったので、環境構築からHTTP通信するまでに得た知見等を記録しておく。

Node-REDの環境構築

RaspberryPi

メンバの一人に貸して頂いたRaspberryPiには既にNode-REDが入っていたので、ありがたく使わせていただいた。

Mac

  • 自分の環境:macOS Mojave(ver 10.14.1)
  • 所要時間:15分程度(考える要素はないので、インストールの所要時間程度)

Node-RED 日本ユーザー会のページのインストールに関する説明を参考に進めた。

Node.jsを入れる

Node.jsの公式ダウンロードページからインストーラをダウンロードして、GUI操作で簡単インストール。

Node-REDをインストール前に、Node.jsをインストールする必要があります。Node.js LTS 8.xを使用することをお勧めします。

ページにはNode.js LTS 8.xの使用が勧められているが、Node.jsが現在(2018/12/30)推奨しているバージョンはNode.js LTS 10.15.0だった。 ここではNode.js公式に従い、Node.js LTS 10.15.0をインストールした。

OKなどを勧められるまま気軽に押していくと、躓くことなくインストールが完了した。

> node -v

でインストールがされていることを確認した。

Node-REDを入れる

最も簡単なNode-REDのインストール方法は、Node.jsに付随しているnode package manager(npm)を利用する方法です。

お勧めに従い、"最も簡単な方法"でインストールを行った。

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

特に躓くことなくインストールできたので、起動してみた。

> node-red

起動できるとServer now running at http://127.0.0.1:1880/といったログが表示されるので、 ブラウザでhttp://127.0.0.1:1880/を開くとエディタ画面が表示される。

起動方法は書かれていても終了方法は書かれていなかったりすることが度々あるが、今回も例によって終了方法が書かれていなかった。 仕方なくCtrl+cで打ち切っているが、正しく終了できているのか少し疑問だ。

HTTP通信のプログラムを書く

独特なエディタなので、HelloWorldの儀式を飛ばしていきなりHTTP通信に取り掛かることにした。

Node-RED 日本ユーザー会のページのチュートリアル2つ目のFlow作成と、Node-RED公式cookbook:HTTP recipesを参考に行った。

Node-REDでプログラミングする基本の流れ

Node-REDではGUI操作でプログラミングを行う。

f:id:ojho0318:20190121233613p:plain
チュートリアル「二つ目のFlow作成」を行った様子
(図はチュートリアル「二つ目のFlow作成」を行った様子。このチュートリアルでは、プログラムの開始や、ログの表示方法など基本的なことを学べた。やって良かった。)

様々な機能を持つノードを、左側の[パレット]から真ん中の[ワークスペース]にドラック&ドロップで配置し、ノード同士をワイヤーで繋ぐことでフローを作る。

配置したノードをダブルクリックすると、詳細な設定を行うためのウィンドウが出る。

プログラムが出来上がったら右上の[デプロイ]をクリックする。 普段Pythonで書いていると「デプロイ」という用語は耳慣れないのだけれど、実行できる状態にすることらしい。

書いてるフローは「デプロイ」を押すまでは実行されない。

RaspberryPiでのNode-REDプログラミング

公式によると、RaspberryPiでのNode-REDの扱いとMacでのNode-REDの扱いは異なるらしい。

自分はデスクトップ付きのラズパイOSを用いているので、RaspberryPiでのNode-REDプログラミングも特にMacとの違いは殆ど感じなかった。

ひとつだけ、RaspberryPiでNode-REDを起動するときは

node-red-start

終了するときは

node-red-stop

を利用するという点だけ、Macの際と違っていた。

Node-REDのサンプルを試すには

CookbookにはFlowのスクショが掲載されている他に、JSON形式でも掲載されている。 ノードの細かい設定はスクショだけでは分からないから、JSONをインポートしてエディタ上で実際に見るのが早い。

右上の[ドロップダウンメニュー]>[読み込み]>[クリップボード]を選択し、JSONをコピペして[読み込み]を押すと、ワークスペースにフローが出現する。

f:id:ojho0318:20190121233729p:plain
JSON形式のFlowのインポート

ソースコードの保存場所

作成したFlowは~/.node-red/flows_*.local.jsonに保存されている。

HTTP Endpoints を実装する

所謂、http serverとか表現されるもの。 GET Requestを貰って、パラメータを読んだり、情報を返したりする。

参考: Node-RED : Handle query parameters passed to an HTTP endpoint

上記ページのExample JSONをインポートして、実行してみると、わずか3ノードでHTTP Endpointsが実装できた。 すごい。

ひとつ引っかかったのは、

You want to access the query parameters passed to an HTTP endpoint, such as: http://example.com/hello-query?name=Nick

このURL、example.comはNode-REDを立ててるサーバーに変える必要がある。 ローカルからアクセスするなら、http://127.0.0.1:1880/hello-query?name=Nickとすること。

HTTP Requests を実装する

所謂、http cliantとか表現されるもの。 URLにパラメータをくっつけて、GET Requestsを送ったりする。

参考: Node-RED : Set the query string parameters in a URL

上記を参考にすると、パラメタを変数にしておいてURLにくっつけ、例えばhttp://127.0.0.1:1880/hello-query?name=Nickなどと送るプログラムが簡単に実装できる。

感想

ノードを繋ぐというプログラミング方法に腰が引けていたが、無事にできて良かった。