ラズパイ+Node-REDでラトックシステム製「環境センサー」のデータをBLE経由で取得して可視化する
Raspberry PiのNode-REDを利用して、ラトックシステム製「環境センサー」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。
ラトックシステム製「環境センサー」とは
USBまたはBLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、CO2、PM2.5などの環境情報を取得することができます。電源は、Micro-USBポートから供給します。
環境センサーは、スマートフォンのアプリで簡単にデータを取得・閲覧することができます。
また、BLE通信でデータが測定できる場合、ユーザーマニュアル等で、保存されるデータのフォーマットが公開されています。環境センサーは、下表のようにメモリに配列として保存されます。
Raspberry Piでの接続確認
Raspberry PiでBLE経由で環境センサーが接続できているか確認します。
LXTerminalで次のコマンドを実行して、環境センサーが接続されているか確認します。
$ sudo hciconfig hci0 down
$ sudo hciconfig hci0 up
$ sudo hcitool lescan
LE Scan ...
:
F7:3A:ED:0C:7F:28 EVS-7F28
C5:CA:AD:02:1A:DC (unknown)
:
^C
「EVS」と表示されていれば、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プロパティが「EVS」になっているデバイスが、環境センサーになります。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 8 No mask 0.1 Type uint8 humidity 1 10 No mask 1 Type int16(le) co2 1 2 No mask 1 Type uint8 pm10 1 4 No mask 1 Type uint8 pm25 1 5 No mask 1
-
- 「デプロイ」ボタンをクリックします。
- 完成したフローです。
作成したフローのJSONを以下に貼っておきます。
Node-REDのメニューから「読み出し」->「クリップボード」で配置することができます。
[{"id":"ad8561cacb373dec","type":"tab","label":"環境センサーデモ","disabled":false,"info":"","env":[]},{"id":"75de4eeb5ba0a0ea","type":"BLE Beacon Scanner","z":"ad8561cacb373dec","name":"","x":140,"y":40,"wires":[["a3f9673a53fe357f","82c2fc9de777e4e4"]]},{"id":"a3f9673a53fe357f","type":"switch","z":"ad8561cacb373dec","name":"環境センサーを取得","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"f73aed0c7f28","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":380,"y":40,"wires":[["8646910f5f0ab36b","4636ead2770588b9"]]},{"id":"82c2fc9de777e4e4","type":"debug","z":"ad8561cacb373dec","name":"debug 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":340,"y":100,"wires":[]},{"id":"8646910f5f0ab36b","type":"change","z":"ad8561cacb373dec","name":"データ部分を取出","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.other","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":40,"wires":[["c966a7862dcdee18"]]},{"id":"c966a7862dcdee18","type":"delay","z":"ad8561cacb373dec","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":820,"y":40,"wires":[["090d2010aeab9284","e0dd12209f510d33"]]},{"id":"090d2010aeab9284","type":"debug","z":"ad8561cacb373dec","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1000,"y":40,"wires":[]},{"id":"e0dd12209f510d33","type":"buffer-parser","z":"ad8561cacb373dec","name":"","data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"int16le","name":"temparature","offset":8,"length":1,"offsetbit":0,"scale":"0.1","mask":""},{"type":"uint8","name":"humidity","offset":10,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16le","name":"co2","offset":2,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint8","name":"pm10","offset":4,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint8","name":"pm25","offset":5,"length":1,"offsetbit":0,"scale":"1","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":790,"y":160,"wires":[["caee16ec9f33c089"],["caee16ec9f33c089"],["caee16ec9f33c089"],["caee16ec9f33c089"],["caee16ec9f33c089"]]},{"id":"4636ead2770588b9","type":"debug","z":"ad8561cacb373dec","name":"debug 2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":560,"y":100,"wires":[]},{"id":"caee16ec9f33c089","type":"debug","z":"ad8561cacb373dec","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":980,"y":140,"wires":[]}]
フローの動作確認
デバッグウィンドウに、環境センサーの温度、湿度、CO2、PM1.0、PM2.5の測定値が表示されます。
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ノード
- CO2:textノード, gaugeノード, chartノード
- PM1.0:textノード
- PM2.5:textノード
ダッシュボードの設定
-
textノードをダブルクリックして、タブとグループを設定します。
ペンのマークをクリックして、新規にグループを追加します。
グループ名「計測データ」と入力します。次に、タブのペンマークをクリックして、新規にタブを追加します。
タブ名「ダッシュボード3」と入力して、「追加」ボタンをクリックします。
「追加」ボタンをクリックして、グループを追加します。
同じように、Groupの「新規にdashboard groupを追加...」を選択後、ペンマークをクリックして、次のグループを追加します。
温度グループ 湿度グループ CO2グループ -
textノードを上から順番に次のように設定します。
温度 湿度 CO2 PM1.0 PM2.5 -
gaugeノードを上から順番に次のように設定します。
温度 湿度 CO2 -
chartノードを上から順番に次のように設定します。
温度 湿度 CO2 -
ダッシュボードのレイアウトを確認します。
サイドバーからダッシュボードウインドウを表示します。
「配置」タブの「ダッシュボード3」グループにマウスをポイントして、「レイアウト」ボタンをクリックします。
配置したグループのレイアウトを確認します。
-
「デプロイ」ボタンをクリックします。
-
完成したフローです。
ダッシュボードの動作確認
ダッシュボード切り替えボタンを押すと、別ウィンドウにダッシュボードが表示されます。
計測したデータの数値やゲージ、チャートが表示されます。
まとめ
BLE通信を介してデータが取得できるセンサーは、Node-REDを利用することで、ノーコードでデータを可視化することができます。ただし、このままですとアプリで見るのと変わりませんので、ラズパイでの使い方としては、事務所や工場などに環境センサーを設置して、CO2濃度が高くなった場合にSNSなどで通知するという方法があります。
Discussion