Edited at

冬休みはNode-REDでIoT

More than 1 year has passed since last update.

こんにちは。

今日はRails以外のサーバー言語について書こうと思ってたんですが、学校の実験で使ったNode-REDが思いの外面白かったので紹介したいと思います。


Node-REDとは

IoTに特化したGUIプログラミングができるツールです。

HPGithubはこちらです。

30分あれば室温をツイートするBOTが作れるぐらいには簡単で、

HTTPリクエストを飛ばしたり受けたりもできるので、IFTTTZapierと連携すれば思いついたことは大体実現できます。


導入


前提


  • Node.js 9.3.0

  • npm 5.6.0

それぞれのインストールがまだの人は以下を参考にインストールしてください。

Mac

Macにnode.jsをインストールする手順。

Windows

Node.js / npmをインストールする(for Windows)


インストール方法

npmでさっくり入ります

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

インストールが終わったら以下のコマンドを実行して

node-red

ブラウザで http://localhost:1880 にアクセスしてください

以下のような画面が表示されるはずです。


基本的な使い方

Node-REDではノードと呼ばれる部品をつなげてプログラミングしていきます。

作成したプログラムはフローと呼ばれます。

2つほどフローを作成した後に解説していきます。


時刻を表示する

では、現在時刻を出力するだけの単純なプログラムを作っていきましょう。

まず、入力の中にあるinjectノードを置きます。自動的にtimestampの表示になると思います。

次に、出力の中にあるdebugノードを置きます。こちらも自動的にmsg.payloadの表示になると思います。

2つのノードをつなぎます。

デプロイをクリックして、injectノードの左にあるボタンをクリックします。

画面右にあるデバッグタブに現在時刻(UNIX時間)が出力されれば成功です。


入力を加工する

先程のフローをそのまま使用します。

機能の中にあるfunctionノードをinjectノードとdebugノードの間に置いてそれぞれ繋ぎます。

functionノードをダブルクリックすると編集画面が出てきます。

以下のようにコードを入力して完了をクリックします。

msg.payload = new Date(msg.payload);

return msg; // もとから書いてある

先ほどと同じようにデプロイしてinjectionノードのボタンをクリックすると整形された現在時刻が表示されます。


解説

Node-REDにおいて一番大事な考え方は、msgというデータが流れていくということです。

入力ノードはmsgを流しますし、機能ノードはmsgを受け取って加工し、msgを流します。

出力ノードはmsgを受け取って何かしらに出力します。

時刻を表示するセクションで作ったフローはinjectionが流したmsgのうち、payloadをデバッグタブに出力しています。

また、入力を加工するセクションではinjectionが流したmsgpayloadからDateのインスタンスを生成し、それをpayloadに入れています。

2行目でmsgを流しています。

msg.payload = new Date(msg.payload);

return msg;


Arduinoと連携して室温ツイートBOTになる


下準備

Arduino側の設定はここのArduino側の準備を参考にしてください。

また、

npm install node-red-contrib-gpio

を実行してnode-red-contrib-gpioをインストールしてください。

両方終わったらnode-redを再起動してください。

入力出力gpioノードやnode ledノードが表示されていたら正常にインストールされています。


BOTになる方法


ノードを置く

以下のようにノードを置きます。


Arduinoと連携する

Arduinoはここの配線図のように配線しておきます。

gpioノードの設定画面からBoardTypePinを設定します。

Boardの設定画面に行くと、デフォルトでFirmataが選択されているのでそのまま追加します。

COMポートはここのシリアルポートの設定のセクションを参考にしてください。

他の設定は以下のとおりです。


流量を制限する

Arduinoから読んだデータを流す間隔を設定します。

これがツイートする間隔になります。

設定は以下のとおりです。


電圧を温度に変換する

functionノードのコードは以下のようにします。

var temperature = (msg.payload - 600) / 10

msg.payload = `今の室温は${msg.payload}だよ!!!`
return msg;


twitterと連携する

twitterノードの設定画面からtwitterの認証します。

以上で設定は終了です。

Arduinoにfirmataを書き込んでデプロイすると30秒毎に室温がツイートされると思います。


まとめ

ざっくり基本の使い方とtwitter、Arduinoとの連携の話をしましたが、かなり簡単だということがわかってもらえたと思います。

他の人が作ったフローやノードがここで公開されているので色々使ってみるともっと簡単になると思います。

今後どんどんIoTが生活に浸透してくると思いますが、そのときに自分で好きなものを作れるとすごく素敵ではないでしょうか?

それでは。よいプログラミングライフを!!