複数のセンサを搭載したsensorTAGを使おう (2) node-REDプログラムの作成
■プログラムの作成の前にJSON形式のデータを確認
最初に、センサの値がJSON形式のオブジェクトでどのような形で送られているかを確認します。ラズパイでnode-REDを起動後、PCのWebブラウザでアクセスします。
前回インストールしたsensorTagノードを左のノード・パレットから、マウスで、中央のキャンパスへドロップします(1)。ドロップしたsensorTagをダブルクリックすると(2)、設定画面が出ます。明るさのLuminosity(CC2650 only)にチェックを入れて(3)、完了します。
sensorTAGから受け取るデータを見たいので、debugノードをドロップします(1)。すべてのデータを表示したいので、debugノードをダブルクリックして(2)、設定画面を出します。msgをcomplate msg objectに変更して(3)、完了します。
二つのノードをマウスで結びます。ノードの右上には青色の点が付いています。これは、変更が行われたことを示し、変更内容は文法的に正しいときに青色、問題があれば赤色になります。
画面の右上にデプロイをクリックすると、プログラムが有効になります。
画面は3分割されていて、右のブロックのタブにdebugがあるので、これを選択します。このエリアには、sensorTAGから送られてくる情報が表示されます。sensorTagの下には、discovering...が最初表示されていているので、sensorTAG本体の電源スイッチを3秒押して少し経過すると、connectに変わります。
数十秒経過後データがdebug欄に表示され始めます。
このように、sensorTAGからデータが送られてこない場合があります。対処方法は2通りあります。
一つは、ラズパイの画面右上にあるBlueToothのアイコンをクリックしてAdd Deviceをクリックすると、データが送られてくる場合があります。
もう一つは、node-REDを起動する前に、 BlueToothのアイコンをクリックしてMake Discoverable 、そのあとAdd Deviceをクリックし、接続を完了しておくことです。そして、接続を切ります。node-REDで通信できるのは一つだけなので、別のところとすでに通信が確立しているとデータが取得できません。
debugの右にベロのようなボタンがあります。濃い緑は有効、1回クリックして薄い色に変わると、debug出力を停止します。一度、出力を停止し、三角マークをクリックして、送られてくるデータを表示します。
●センサ情報のフォーマット
node-red-node-sensortagの説明ページに、フォーマットが書かれています。
- Humidity - { topic: [topic_prefix]/humidity , payload: { temp: 21.2, humidity: 88} }
- Temperature - { topic: [topic_prefix]/temperature, payload: { ambient: 21.2, object: 33.0 } }
- Barometric Pressure - { topic: [topic_prefix]/pressure, payload: { pres: 1000 } }
- Accelerometer - { topic: [topic_prefix]/accelerometer , payload: { x:0.0, y:9.8, z:0.0 } }
- Magnetometer - { topic: [topic_prefix]/magnetometer , payload: { x:0.0, y:0.0, z:0.0 } }
- Gyroscope - { topic: [topic_prefix]/gyroscope , payload: { x:0.0, y:0.0, z:0.0 } }
- Luxometer - { topic: [topic_prefix]/luxometer , payload: { lux: 212 } }
- Buttons - { topic: [topic_prefix]/keys , payload: { left: true, right: false} }
debug欄に出力されたものを上記の温度センサに当てはめると、メッセージmsgは、次の構造をしていると思われます。topicとpayloadはキー、コロン:の右側が値です。
msg = {
"topic": "sensorTag/temperature",
"payload": {
"ambient": "21.2",
"object": "33.0"
};
};
ambientというのは環境という意味なので、21.2℃は周辺温度と思われます。温度はもう一つデバイス自身のデータが別のtopicにあります。
●温度データを取り出すためのfunctionノードのプログラム
functionノードは、メッセージを加工するのに使われます。左のノード・パレットから、sensorTagとdebugノードを結んでいる線の上にドラッグします。
数秒たって実線が破線になったらマウスのボタンを離してドロップします。functionノードをダブルクリックして、プログラムを書き込むエディタを表示します。
もともと書かれているjavascriptのプログラムは、送られてきたメッセージをそのまま次のノードへ送るための「return msg;」です。
このエリアに、
if (msg.topic === 'sensorTag/temperature') {
msg.payload = msg.payload.ambient;
return msg;
} else {
return null;
}
を記述します。つまり、メッセージmsgの中のpayloadに含まれるambientの値を、メッセージmsgの中のpayloadに代入するという意味です。温度や湿度などたくさんのデータが送られてきていますが、それらは捨て去り(null)、周辺温度だけを次のノードへ送り出します。
文法が間違っていると、行番号の部分にアラートが出ます。Nameの項目には、わかりやすい名称を付けます。ここでは「周辺温度を抽出」としました。
なおエディタの画面で、筆者のWindows 10では画面の文字送りと表示位置がずれるので、メモ帳などのテキスト・エディタで書いたプログラムをコピーしています。
完了を押し、デプロイをクリックします。温度だけが表示されます。