📊

ラズパイ+Node-REDでラトックシステム製「環境センサー」のデータをBLE経由で取得して可視化する

2024/02/22に公開

Raspberry PiのNode-REDを利用して、ラトックシステム製「環境センサー」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。

ラトックシステム製「環境センサー」とは

USBまたはBLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、CO2、PM2.5などの環境情報を取得することができます。電源は、Micro-USBポートから供給します。

https://www.ratocsystems.com/products/sensor/airco2/rsbtevs1/

環境センサーは、スマートフォンのアプリで簡単にデータを取得・閲覧することができます。

また、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対応デバイスに接続するためのノードをインストールします。

  1. Node-REDをWebブラウザで開きます。

  2. 右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。

  3. 「ノードの追加」タブを選択して、検索のテキストボックスに「blebeacon」と入力します。
    検索されたノードから「node-red-contrib-blebeacon-scanner」の「ノードを追加」ボタンをクリックします。

  4. パレットの「機能」グループにBLE Beacon Scannerノードが追加されます。

node-red-contrib-buffer-parserのインストール

環境センサーで測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。

  1. Node-REDをWebブラウザで開きます。

  2. 右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。

  3. 「ノードの追加」タブを選択して、検索のテキストボックスに「buffer-parser」と入力します。
    検索されたノードから「node-red-contrib-buffer-parser」の「ノードを追加」ボタンをクリックします。

  4. パレットの「機能」グループにBLE Beacon Scannerノードが追加されます。

ノードの設定

  1. Node-REDのワークスペースに以下のノードを追加し、図のように配置します。
    • BLE Beacon Scannerノード
    • switchノード
    • changeノード
    • delayノード
    • buffer parserノード
    • debugノード x 4
  1. 「デプロイ」ボタンをクリックします。

  2. debug 1ノードをデバッグウィンドウで確認すると、BLE接続している様々なデバイスの情報が取得されています。その中で、localNameプロパティが「EVS」になっているデバイスが、環境センサーになります。idプロパティに固有のMACアドレスが設定されているので、switchノードでその情報だけを出力するように設定します。

  3. switchノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。

    • 名前: 「環境センサーを取得」と入力
    • プロパティ: 「msg.」を選択, 「payload.id」と入力
    • 条件: 「==」を選択, 「文字列」を選択, MACアドレスを入力
  4. 「デプロイ」ボタンをクリックします。

  5. debug 2ノードをデバッグウィンドウで確認すると、指定したMACアドレスの環境センサーの情報が取得されています。実際のデータはotherプロパティに保存されているので、changeノードでotherプロパティの情報をpayloadプロパティの情報に変換します。

  6. changeノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。

    • 名前: 「データ部分を取出」と入力
    • 対象の値: 「msg.」を選択, 「payload.other」と入力
  7. 今回はデータを10秒に1回だけ取得するように、データの流量制限をします。
    delayノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。

    • 動作: 「メッセージの流量制限」を選択
    • 流量: 「10」秒と入力, 「中間メッセージを削除」を選択
  8. 「デプロイ」ボタンをクリックします。

  9. debug 3ノードをデバッグウィンドウで確認すると、payloadプロパティに環境情報が保存されています。

  10. 配列に保存されているデータを各センサーの測定値に変換します。
    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

  1. 「デプロイ」ボタンをクリックします。
  2. 完成したフローです。

作成したフローの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のインストール

環境センサーで測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。

  1. Node-REDをWebブラウザで開きます。

  2. 右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。

  3. 「ノードの追加」タブを選択して、検索のテキストボックスに「node-red-dashboard」と入力します。
    検索されたノードから「node-red-dashboard」の「ノードを追加」ボタンをクリックします。

  4. パレットの「dashboard」グループにノードが追加されます。

ノードの配置

Node-REDのワークスペースに以下のノードを追加し、図のように配置します。

  • 温度:textノード, gaugeノード, chartノード
  • 湿度:textノード, gaugeノード, chartノード
  • CO2:textノード, gaugeノード, chartノード
  • PM1.0:textノード
  • PM2.5:textノード

ダッシュボードの設定

  1. textノードをダブルクリックして、タブとグループを設定します。

    ペンのマークをクリックして、新規にグループを追加します。

    グループ名「計測データ」と入力します。次に、タブのペンマークをクリックして、新規にタブを追加します。

    タブ名「ダッシュボード3」と入力して、「追加」ボタンをクリックします。

    「追加」ボタンをクリックして、グループを追加します。

    同じように、Groupの「新規にdashboard groupを追加...」を選択後、ペンマークをクリックして、次のグループを追加します。

    温度グループ 湿度グループ CO2グループ
  2. textノードを上から順番に次のように設定します。

    温度 湿度 CO2
    PM1.0 PM2.5
  3. gaugeノードを上から順番に次のように設定します。

    温度 湿度 CO2
  4. chartノードを上から順番に次のように設定します。

    温度 湿度 CO2
  5. ダッシュボードのレイアウトを確認します。
    サイドバーからダッシュボードウインドウを表示します。

    「配置」タブの「ダッシュボード3」グループにマウスをポイントして、「レイアウト」ボタンをクリックします。

    配置したグループのレイアウトを確認します。

  6. 「デプロイ」ボタンをクリックします。

  7. 完成したフローです。

ダッシュボードの動作確認

ダッシュボード切り替えボタンを押すと、別ウィンドウにダッシュボードが表示されます。

計測したデータの数値やゲージ、チャートが表示されます。

まとめ

BLE通信を介してデータが取得できるセンサーは、Node-REDを利用することで、ノーコードでデータを可視化することができます。ただし、このままですとアプリで見るのと変わりませんので、ラズパイでの使い方としては、事務所や工場などに環境センサーを設置して、CO2濃度が高くなった場合にSNSなどで通知するという方法があります。

Discussion