📈

ラズパイ+Node-REDでオムロン製「環境センサ」(USB型)のデータをBLE経由で取得して可視化する

2024/02/22に公開

Raspberry PiのNode-REDを利用して、オムロン製「環境センサ」(USB型)「2JCIE-BU」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。

オムロン製の環境センサ(USB型)とは

USBまたはBLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、光、音など7種類の環境情報を取得することができます。
https://components.omron.com/jp-ja/products/sensors/2JCIE-BU

環境センサ単体で動作するように、IoT機器対応のモバイルバッテリーを使用して、電源を給電しています。
https://cheero.shop/products/che-104

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

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

  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プロパティが「Rbt」になっているデバイスが、環境センサになります。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 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

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

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

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

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

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

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

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

ノードの配置

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

  • 温度:textノード, gaugeノード, chartノード
  • 湿度:textノード, gaugeノード, chartノード
  • 照度:textノード, gaugeノード, chartノード
  • 気圧:textノード
  • 騒音:textノード

ダッシュボードの設定

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

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

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

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

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

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

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

    温度 湿度 照度
    気圧 騒音
  3. gaugeノードを上から順番に次のように設定します。

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

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

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

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

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

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

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

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

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

まとめ

BLE通信を介してデータが取得できるセンサーは、Node-REDを利用することで、ノーコードでデータを可視化することができます。ただし、このままですとアプリで見るのと変わりませんので、ラズパイでの使い方としては、パトライトなどに環境センサを設置して、点灯を検知した場合にSNSなどで通知するという方法があります。
次の記事を参考にしてください。
https://zenn.dev/dsl_gunma/articles/a88259f859f046

Discussion