おんどとりでIoT その3 node-REDで温度を取得

おんどとりには専用のノードが用意されていない

 node-REDではセンサなどの専用のノードが用意されていれば、すぐに利用できます。そうでない場合は、装置に合わせたコマンドを送って利用します。測定器の34461Aも同様に利用できました。多くの測定器では、コマンドはアスキ・コードで構成されています。

おんどとりのコマンドは16進で構成

 前回のPythonのプログラムでは、おんどとりへ温度データを送るように要求する16進のコマンドは次のように記述しました。

s.send(bytearray([0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00]))

 node-REDでも同じように16進のコマンドを送れれば、簡単にプログラムが作成できます。functionノードを置き、内容は下記のjavascriptのプログラムを書きます。debugノードで出力を確認すると10進で出力されますが、tcpdumpというネットワークのトラフィックをキャプチャするユーティリティで確認したら、16進コードが送られていました。

buf = [0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00];
msg.payload  = new Buffer(buf);
return msg;

 node-REDでは、各ノード間をメッセージが伝わります。そのメッセージに対して加工をプログラムで行えます。上記のプログラムを書いた前のノードは、プログラムをキックするだけで、メッセージは意味のあるものではありません。

作成手順

 ここでは、ラズパイでnode-REDを動かしています。ラズパイには、現在、node-REDが最初からインストールされているので、メニューのprogrammingからNode-REDを選ぶだけで起動できます。

 node-REDのプログラムは、PCのWebブラウザなどから、URLに「ラズパイのIPアドレス」:1880でアクセスすると、パレットが表示されるので、この画面から作業を始めます。

(1) 送信

 左のノード・パレットの一番上にある「inject」を中央の作業エリアであるパレットにマウスで持ってきます。

 ドロップした瞬間に、injectからtimestampに名前が変わります。ダブルクリックすると編集画面が出ます。

 何も変更しないでよいのですが、Nameを適当につけます。ここでは「get temp」にしました。このノードは、プログラムを動かす起点として利用することが多いようです。ノード・アイコンの左にあるベロのようなものはボタンと呼びます。ここを1回、マウスでクリックすると、メッセージが次のノードに送られます。

 今回、メッセージは何もありません。完了を押します。

 次に、「function」ノードをパレットに置きます。

 functionノードをダブルクリックして、編集画面を開きます。retuen msg; と1行だけプログラムが書いてあります。ここを下記の3行で置き換えます。

buf = [0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00];
msg.paylod = new Buffer(buf);
return msg;

 Nameを適当につけます。ここでは「Serial number」とし、完了を押しました。筆者のWindowsだと、カーソルが画面とずれているので、メモ帳でプログラムを作り、カット&ペーストで貼り付けます。

 ノード「tcp request」をパレットに置きます。

 ダブルクリックして編集画面を開きます。IPアドレスとポート番号を入れます。次の項目の時間はもっと短くてよいと思いますが、100msに変更しました。完了を押します。

 各ノードをつなぎます。最後にデプロイ(Deploy)をクリックします。ここまででおんどとりに温度読み出しのコマンドを送るところまでプログラミングできました。

(2) 受信

 コマンドにしたがって、おんどとりは温度データを送ってきます。送ってくる16進データは、ソケットの受信バッファに入っているので取り出します。toString('hex') で、バイナリ・データを文字として扱える形式に変換します。

msg.payload= msg.payload.toString('hex');
return msg;

 そのデータの並びの中で、10番目の1バイトと12番目の1バイトにch1の温度データが入っているので、逆順で読み出すfunctionを作り、temp1とNameをつけます。

d = msg.payload;
msg.payload = d.substr(12,2) +d.substr(10,2) ;
msg.payload= (parseInt(msg.payload,16)-1000)/10.0;
return msg;

 3行目では、通信手順書にしたがって、1000を引き、10で割って、摂氏の温度データを取り出します。

 温度データを表示するために、debugノードを置きます。このノードの出力は、画面右のdebugタブの欄に表示されます。

 各ノードを線でつなぎます。間違ったときは、その線やノードをクリックし、赤く縁取りが付いたときに、CTRL-Xで削除でき、やり直せます。

 デプロイ(Deploy)して、左上の「get temp」のボタンを押すと、おんどとりから読みだしたch1の温度データがdebugエリアに表示されます。

 同様にch2のデータを読みだして表示します。temp2のfunctionノードの記述です。

d = msg.payload;
msg.payload = d.substr(16,2) +d.substr(14,2) ;
msg.payload= (parseInt(msg.payload,16)-1000)/10.0;
return msg;

プログラム

 下記のプログラムの上でダブルクリックするとJSONで記述されたコードが全選択できるので、CTRL-Cでコピーします。

[{"id":"5f97541c.40220c","type":"tab","label":"フロー 2"},{"id":"aaa090b7.11c1c","type":"inject","z":"5f97541c.40220c","name":"get temp","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":103,"y":98,"wires":[["ca1c6cf.ded249"]]},{"id":"ca1c6cf.ded249","type":"function","z":"5f97541c.40220c","name":"Serial number","func":"buf = [0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00];\nmsg.payload  = new Buffer(buf);\nreturn msg;","outputs":1,"noerr":0,"x":234,"y":162,"wires":[["b31662b2.26573"]]},{"id":"b31662b2.26573","type":"tcp request","z":"5f97541c.40220c","server":"192.168.111.52","port":"57172","out":"time","splitc":"100","name":"","x":423,"y":226,"wires":[["ee2c564d.db2978"]]},{"id":"ee2c564d.db2978","type":"function","z":"5f97541c.40220c","name":"recv data to hex","func":"msg.payload= msg.payload.toString('hex');\nreturn msg;","outputs":1,"noerr":0,"x":536,"y":295,"wires":[["1002b720.2de519","ce7ad16b.1d7c6"]]},{"id":"1002b720.2de519","type":"function","z":"5f97541c.40220c","name":"temp1","func":"d = msg.payload;\nmsg.payload = d.substr(12,2) +d.substr(10,2) ;\nmsg.payload= (parseInt(msg.payload,16)-1000)/10.0;\nreturn msg;","outputs":1,"noerr":0,"x":590,"y":362,"wires":[["41d93e90.692c3"]]},{"id":"41d93e90.692c3","type":"debug","z":"5f97541c.40220c","name":"","active":true,"console":"false","complete":"payload","x":677,"y":451,"wires":[]},{"id":"ce7ad16b.1d7c6","type":"function","z":"5f97541c.40220c","name":"temp2","func":"d = msg.payload;\nmsg.payload = d.substr(16,2) +d.substr(14,2) ;\nmsg.payload= (parseInt(msg.payload,16)-1000)/10.0;\nreturn msg;","outputs":1,"noerr":0,"x":748,"y":322,"wires":[["3c666ecb.b0cea2"]]},{"id":"3c666ecb.b0cea2","type":"debug","z":"5f97541c.40220c","name":"","active":true,"console":"false","complete":"false","x":755,"y":405,"wires":[]}]

 パレットの上にマウスを持っていき、CTRL-Iを押すと、インポート画面が開きます。CTRL-Vでコピーします。読み込みボタンをクリックすると、プログラムが読み込まれます。

※ラズパイで動いているnode-REDは、バージョン0.16.0です。一部メニューが日本語になっています。その前の0.15.2はラズパイにインストールされているバージョンですが、メニューは英語です。

※プログラムをコピーしたとき、ゴミが混じることがあります。テキスト・エディタで打ち直したプログラムに差し替えてください。