📉

ラズパイ+Node-REDでエレックス工業製「μPRISM」のデータをBLE経由で取得して可視化する

2024/02/22に公開

Raspberry PiのNode-REDを利用して、エレックス工業製「μPRISM」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。

エレックス工業製「μPRISM」(電池内蔵タイプ)とは

BLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、光、加速度など7種類の環境情報を取得することができます。ボタン型電池「CR2032」を使用します。

https://www.elecs.co.jp/microprism/series/edamp-2ba101/

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

また、BLE通信でデータが測定できる場合、ユーザーマニュアル等で、保存されるデータのフォーマットが公開されています。μPRISMは、下表のようにメモリに配列として保存されます。

Raspberry Piでの接続確認

Raspberry PiでBLE経由でμPRISMが接続できているか確認します。

LXTerminalで次のコマンドを実行して、μPRISMが接続されているか確認します。

$ sudo hciconfig hci0 down
$ sudo hciconfig hci0 up
$ sudo hcitool lescan
LE Scan ...
 :
00:08:9C:00:28:78 uPrism_002878
C5:CA:AD:02:1A:DC (unknown)
 :
^C

uPrism」と表示されていれば、Raspberry PiとμPRISMがBLEで接続されています。
また、左側のアドレスが、μPRISMを識別するMACアドレスになります。

μPRISMの計測モードの設定

Node-REDで利用するBLE用のノードでデータを取得するには、計測モードを「センサービーコンモード」に設定する必要があります。ここでは、アプリから計測モードを変更する手順について説明します。

1.アプリを起動して、接続ボタンを押します 2.モードが「記録モード」になっています。Settingをタップします 3.モード設定をタップして、センサービーコンモードを選択します
4.OKボタンを押して、Listをタップします 5.モードが「センサービーコンモード」になっています 6.切断ボタンを押します

Node-REDによるフローの作成

Node-REDで、BLE経由でμPRISMの計測データを取得するフローを作成します。

モジュールとドライバのインストール

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のインストール

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

  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プロパティが「uPrism」になっているデバイスが、μPRISMになります。idプロパティに固有のMACアドレスが設定されているので、switchノードでその情報だけを出力するように設定します。

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

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

  5. debug 2ノードをデバッグウィンドウで確認すると、指定したMACアドレスのμPRISMの情報が取得されています。実際のデータは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 12 No mask 0.01
      Type uint16(le) humidity 1 14 No mask 0.01
      Type uint16(le) ambientLight 1 16 No mask 2
      Type uint32(le) pressure 1 19 0x00ffffff 0.01
      Type uint8 battery 1 24 No mask 0.0141

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

作成したフローのJSONを以下に貼っておきます。
Node-REDのメニューから「読み出し」->「クリップボード」で配置することができます。

[{"id":"3a79a91b412fe6e8","type":"tab","label":"μPRISMデモ","disabled":false,"info":"","env":[]},{"id":"4915f9abcbeb0c10","type":"BLE Beacon Scanner","z":"3a79a91b412fe6e8","name":"","x":140,"y":60,"wires":[["73e41ece382aec4a","8fb10b1f280d6c0c"]]},{"id":"87a29694c23612c3","type":"debug","z":"3a79a91b412fe6e8","name":"debug 3","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":940,"y":60,"wires":[]},{"id":"73e41ece382aec4a","type":"switch","z":"3a79a91b412fe6e8","name":"μPRISMを取得","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"00089c002864","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":360,"y":60,"wires":[["e29da934db28f294","c941550cc65e9f49"]]},{"id":"e29da934db28f294","type":"change","z":"3a79a91b412fe6e8","name":"データ部分取出","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.other","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":60,"wires":[["aec35a49cd8cc657"]]},{"id":"e99985fb0ff8dcce","type":"buffer-parser","z":"3a79a91b412fe6e8","name":"","data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"int16le","name":"temparature","offset":12,"length":1,"offsetbit":0,"scale":"0.01","mask":""},{"type":"uint16le","name":"humidity","offset":14,"length":1,"offsetbit":0,"scale":"0.01","mask":""},{"type":"uint16le","name":"ambient_light","offset":16,"length":1,"offsetbit":0,"scale":"2","mask":""},{"type":"uint32le","name":"pressure","offset":19,"length":1,"offsetbit":0,"scale":"0.01","mask":"0x00ffffff"},{"type":"uint8","name":"battery","offset":24,"length":1,"offsetbit":0,"scale":"0.0141","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":730,"y":180,"wires":[["e96dfda248a40867"],["e96dfda248a40867"],["e96dfda248a40867"],["e96dfda248a40867"],["e96dfda248a40867"]]},{"id":"e96dfda248a40867","type":"debug","z":"3a79a91b412fe6e8","name":"debug 4","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":160,"wires":[]},{"id":"aec35a49cd8cc657","type":"delay","z":"3a79a91b412fe6e8","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":760,"y":60,"wires":[["87a29694c23612c3","e99985fb0ff8dcce"]]},{"id":"8fb10b1f280d6c0c","type":"debug","z":"3a79a91b412fe6e8","name":"debug 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":340,"y":120,"wires":[]},{"id":"c941550cc65e9f49","type":"debug","z":"3a79a91b412fe6e8","name":"debug 2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":520,"y":120,"wires":[]}]

フローの動作確認

デバッグウィンドウに、μPRISMの温度、湿度、照度、気圧、電池残量の測定値が表示されます。

Node-REDによるダッシュボードの作成

Node-REDのダッシュボードを使用して、取得したデータを可視化します。

node-red-dashboardのインストール

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

  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ノードをダブルクリックして、タブとグループを設定します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

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

Discussion