ラズパイ+Node-REDでオムロン製「環境センサ」(USB型)のデータをBLE経由で取得して可視化する
Raspberry PiのNode-REDを利用して、オムロン製「環境センサ」(USB型)「2JCIE-BU」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。
オムロン製の環境センサ(USB型)とは
USBまたはBLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、光、音など7種類の環境情報を取得することができます。
環境センサ単体で動作するように、IoT機器対応のモバイルバッテリーを使用して、電源を給電しています。
環境センサは、スマートフォンのアプリで簡単にデータを取得・閲覧することができます。
また、BLE通信でデータが測定できる場合、ユーザーマニュアル等で、保存されるデータのフォーマットが公開されています。今回の環境センサは、下表のようにメモリに配列として保存されます。
Raspberry Piでの接続確認
Raspberry PiでBLE経由で環境センサが接続できているか確認します。
LXTerminalで次のコマンドを実行して、環境センサが接続されているか確認します。
$ sudo hciconfig hci0 down
$ sudo hciconfig hci0 up
$ sudo hcitool lescan
LE Scan ...
:
C5:CA:AD:02:1A:DC Rbt
C5:CA:AD:02:1A:DC (unknown)
:
^C
「Rbt」と表示されていれば、Raspberry Piと環境センサがBLEで接続されています。
また、左側のアドレスが、環境センサを識別するMACアドレスになります。
Node-REDによるフローの作成
Node-REDで、BLE経由で環境センサの計測データを取得するフローを作成します。
モジュールとドライバのインストール
LXTerminalでBluetoothのモジュールやドライバをインストールします。
$ sudo apt install libbluetooth-dev libudev-dev pi-bluetooth
$ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
$ cd
$ cd .node-red
$ npm install @abandonware/noble
$ npm list
$ sudo reboot
Node-REDを再起動します。
node-red-contrib-blebeacon-scannerのインストール
Node-REDでBLE対応デバイスに接続するためのノードをインストールします。
-
Node-REDをWebブラウザで開きます。
-
右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。
-
「ノードの追加」タブを選択して、検索のテキストボックスに「
blebeacon
」と入力します。
検索されたノードから「node-red-contrib-blebeacon-scanner」の「ノードを追加」ボタンをクリックします。
-
パレットの「機能」グループにBLE Beacon Scannerノードが追加されます。
node-red-contrib-buffer-parserのインストール
環境センサで測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。
-
Node-REDをWebブラウザで開きます。
-
右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。
-
「ノードの追加」タブを選択して、検索のテキストボックスに「
buffer-parser
」と入力します。
検索されたノードから「node-red-contrib-buffer-parser」の「ノードを追加」ボタンをクリックします。
-
パレットの「機能」グループにBLE Beacon Scannerノードが追加されます。
ノードの設定
- Node-REDのワークスペースに以下のノードを追加し、図のように配置します。
- BLE Beacon Scannerノード
- switchノード
- changeノード
- delayノード
- buffer parserノード
- debugノード x 4
-
「デプロイ」ボタンをクリックします。
-
debug 1ノードをデバッグウィンドウで確認すると、BLE接続している様々なデバイスの情報が取得されています。その中で、localNameプロパティが「Rbt」になっているデバイスが、環境センサになります。idプロパティに固有のMACアドレスが設定されているので、switchノードでその情報だけを出力するように設定します。
-
switchノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。
- 名前: 「環境センサを取得」と入力
- プロパティ: 「msg.」を選択, 「payload.id」と入力
- 条件: 「==」を選択, 「文字列」を選択, MACアドレスを入力
-
「デプロイ」ボタンをクリックします。
-
debug 2ノードをデバッグウィンドウで確認すると、指定したMACアドレスの環境センサの情報が取得されています。実際のデータはotherプロパティに保存されているので、changeノードでotherプロパティの情報をpayloadプロパティの情報に変換します。
-
changeノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。
- 名前: 「データ部分を取出」と入力
- 対象の値: 「msg.」を選択, 「payload.other」と入力
-
今回はデータを10秒に1回だけ取得するように、データの流量制限をします。
delayノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。- 動作: 「メッセージの流量制限」を選択
- 流量: 「10」秒と入力, 「中間メッセージを削除」を選択
-
「デプロイ」ボタンをクリックします。
-
debug 3ノードをデバッグウィンドウで確認すると、payloadプロパティに環境情報が保存されています。
-
配列に保存されているデータを各センサーの測定値に変換します。
buffer parserノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。-
Output options: 「multipul result」,「set topic」,「fan out」をチェック
-
Output: 「key/value」を選択
-
「追加」ボタンをクリックして、配列から取得する値の設定をする
データ型 名前 長さ オフセット マスク スケール値 Type int16(le) temperature 1 4 No mask 0.01 Type int16(le) relativeHumidity 1 6 No mask 0.01 Type int16(le) ambientLight 1 8 No mask 1 Type int32(le) pressure 1 10 No mask 0.001 Type int16(le) noise 1 14 No mask 0.01
-
- 「デプロイ」ボタンをクリックします。
- 完成したフローです。
作成したフローのJSONを以下に貼っておきます。
Node-REDのメニューから「読み出し」->「クリップボード」で配置することができます。
[{"id":"f753cb2c72846c3b","type":"tab","label":"環境センサ","disabled":false,"info":"","env":[]},{"id":"3efb6641971fae5c","type":"BLE Beacon Scanner","z":"f753cb2c72846c3b","name":"","x":140,"y":60,"wires":[["1c4927a338c41d19","2de030db97882a07"]]},{"id":"accb87396d9f8338","type":"debug","z":"f753cb2c72846c3b","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":980,"y":60,"wires":[]},{"id":"1c4927a338c41d19","type":"switch","z":"f753cb2c72846c3b","name":"環境センサを取得","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"c5caad021adc","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":60,"wires":[["1282c5afc94f7d02","5b69e071e01b8fdb"]]},{"id":"1282c5afc94f7d02","type":"change","z":"f753cb2c72846c3b","name":"データ部分を取出","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.other","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":60,"wires":[["7c38592a4ddbccfd"]]},{"id":"7c38592a4ddbccfd","type":"delay","z":"f753cb2c72846c3b","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":800,"y":60,"wires":[["accb87396d9f8338","0d82addebe8d5029"]]},{"id":"2de030db97882a07","type":"debug","z":"f753cb2c72846c3b","name":"debug 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":340,"y":120,"wires":[]},{"id":"5b69e071e01b8fdb","type":"debug","z":"f753cb2c72846c3b","name":"debug 2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":540,"y":120,"wires":[]},{"id":"c2be2561a2994e7e","type":"debug","z":"f753cb2c72846c3b","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":960,"y":160,"wires":[]},{"id":"0d82addebe8d5029","type":"buffer-parser","z":"f753cb2c72846c3b","name":"","data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"int16le","name":"temperature","offset":4,"length":1,"offsetbit":0,"scale":"0.01","mask":""},{"type":"int16le","name":"relativeHumidity","offset":6,"length":1,"offsetbit":0,"scale":"0.01","mask":""},{"type":"int16le","name":"ambientLight","offset":8,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"int32le","name":"pressure","offset":10,"length":1,"offsetbit":0,"scale":"0.001","mask":""},{"type":"int16le","name":"noise","offset":14,"length":1,"offsetbit":0,"scale":"0.01","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str","resultType":"value","resultTypeType":"return","multipleResult":true,"fanOutMultipleResult":true,"setTopic":true,"outputs":5,"x":770,"y":180,"wires":[["c2be2561a2994e7e"],["c2be2561a2994e7e"],["c2be2561a2994e7e"],["c2be2561a2994e7e"],["c2be2561a2994e7e"]]}]
フローの動作確認
デバッグウィンドウに、環境センサの温度、湿度、照度、気圧、騒音の測定値が表示されます。
Node-REDによるダッシュボードの作成
Node-REDのダッシュボードを使用して、取得したデータを可視化します。
node-red-dashboardのインストール
環境センサで測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。
-
Node-REDをWebブラウザで開きます。
-
右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。
-
「ノードの追加」タブを選択して、検索のテキストボックスに「
node-red-dashboard
」と入力します。
検索されたノードから「node-red-dashboard」の「ノードを追加」ボタンをクリックします。
-
パレットの「dashboard」グループにノードが追加されます。
ノードの配置
Node-REDのワークスペースに以下のノードを追加し、図のように配置します。
- 温度:textノード, gaugeノード, chartノード
- 湿度:textノード, gaugeノード, chartノード
- 照度:textノード, gaugeノード, chartノード
- 気圧:textノード
- 騒音:textノード
ダッシュボードの設定
-
textノードをダブルクリックして、タブとグループを設定します。
ペンのマークをクリックして、新規にグループを追加します。
グループ名「計測データ」と入力します。次に、タブのペンマークをクリックして、新規にタブを追加します。
タブ名「ダッシュボード」と入力して、「追加」ボタンをクリックします。
「追加」ボタンをクリックして、グループを追加します。
同じように、Groupの「新規にdashboard groupを追加...」を選択後、ペンマークをクリックして、次のグループを追加します。
温度グループ 湿度グループ 照度グループ -
textノードを上から順番に次のように設定します。
温度 湿度 照度 気圧 騒音 -
gaugeノードを上から順番に次のように設定します。
温度 湿度 照度 -
chartノードを上から順番に次のように設定します。
温度 湿度 照度 -
ダッシュボードのレイアウトを確認します。
サイドバーからダッシュボードウインドウを表示します。
「配置」タブの「ダッシュボード」グループにマウスをポイントして、「レイアウト」ボタンをクリックします。
配置したグループのレイアウトを確認します。
-
「デプロイ」ボタンをクリックします。
-
完成したフローです。
ダッシュボードの動作確認
ダッシュボード切り替えボタンを押すと、別ウィンドウにダッシュボードが表示されます。
計測したデータの数値やゲージ、チャートが表示されます。
まとめ
BLE通信を介してデータが取得できるセンサーは、Node-REDを利用することで、ノーコードでデータを可視化することができます。ただし、このままですとアプリで見るのと変わりませんので、ラズパイでの使い方としては、パトライトなどに環境センサを設置して、点灯を検知した場合にSNSなどで通知するという方法があります。
次の記事を参考にしてください。
Discussion