ラズパイ+Node-REDでエレックス工業製「μPRISM」のデータをBLE経由で取得して可視化する
Raspberry PiのNode-REDを利用して、エレックス工業製「μPRISM」で測定した温度、湿度などのデータをBLE(Bluetooth Low Energy)経由で取得する方法について説明します。
エレックス工業製「μPRISM」(電池内蔵タイプ)とは
BLE通信を介してネットワークに接続し、測定データの送信が可能なセンサーです。
温度や湿度、光、加速度など7種類の環境情報を取得することができます。ボタン型電池「CR2032」を使用します。
μ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対応デバイスに接続するためのノードをインストールします。
-
Node-REDをWebブラウザで開きます。
-
右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。
-
「ノードの追加」タブを選択して、検索のテキストボックスに「
blebeacon
」と入力します。
検索されたノードから「node-red-contrib-blebeacon-scanner」の「ノードを追加」ボタンをクリックします。
-
パレットの「機能」グループにBLE Beacon Scannerノードが追加されます。
node-red-contrib-buffer-parserのインストール
μPRISMで測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。
-
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プロパティが「uPrism」になっているデバイスが、μPRISMになります。idプロパティに固有のMACアドレスが設定されているので、switchノードでその情報だけを出力するように設定します。
-
switchノードをダブルクリックし、以下の設定をして「完了」ボタンをクリックします。
- 名前: 「μPRISMを取得」と入力
- プロパティ: 「msg.」を選択, 「payload.id」と入力
- 条件: 「==」を選択, 「文字列」を選択, MACアドレスを入力
-
「デプロイ」ボタンをクリックします。
-
debug 2ノードをデバッグウィンドウで確認すると、指定したMACアドレスのμPRISMの情報が取得されています。実際のデータは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 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
-
- 「デプロイ」ボタンをクリックします。
- 完成したフローです。
作成したフローの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で測定した複数の環境情報は、配列に保存されます。配列に保存された情報を各測定値に変換するノードをインストールします。
-
Node-REDをWebブラウザで開きます。
-
右上にある「三」のボタンをクリックしてメニューを開き、「パレットの管理」をクリックします。
-
「ノードの追加」タブを選択して、検索のテキストボックスに「
node-red-dashboard
」と入力します。
検索されたノードから「node-red-dashboard」の「ノードを追加」ボタンをクリックします。
-
パレットの「dashboard」グループにノードが追加されます。
ノードの配置
Node-REDのワークスペースに以下のノードを追加し、図のように配置します。
- 温度:textノード, gaugeノード, chartノード
- 湿度:textノード, gaugeノード, chartノード
- 照度:textノード, gaugeノード, chartノード
- 気圧:textノード
- 電池残量:textノード
ダッシュボードの設定
-
textノードをダブルクリックして、タブとグループを設定します。
ペンのマークをクリックして、新規にグループを追加します。
グループ名「計測データ」と入力します。次に、タブのペンマークをクリックして、新規にタブを追加します。
タブ名「ダッシュボード2」と入力して、「追加」ボタンをクリックします。
「追加」ボタンをクリックして、グループを追加します。
同じように、Groupの「新規にdashboard groupを追加...」を選択後、ペンマークをクリックして、次のグループを追加します。
気温グループ 湿度グループ 照度グループ -
textノードを上から順番に次のように設定します。
気温 湿度 照度 気圧 電池残量 -
gaugeノードを上から順番に次のように設定します。
気温 湿度 照度 -
chartノードを上から順番に次のように設定します。
気温 湿度 照度 -
ダッシュボードのレイアウトを確認します。
サイドバーからダッシュボードウインドウを表示します。
「配置」タブの「ダッシュボード2」グループにマウスをポイントして、「レイアウト」ボタンをクリックします。
配置したグループのレイアウトを確認します。
-
「デプロイ」ボタンをクリックします。
-
完成したフローです。
ダッシュボードの動作確認
ダッシュボード切り替えボタンを押すと、別ウィンドウにダッシュボードが表示されます。
計測したデータの数値やゲージ、チャートが表示されます。
まとめ
BLE通信を介してデータが取得できるセンサーは、Node-REDを利用することで、ノーコードでデータを可視化することができます。ただし、このままですとアプリで見るのと変わりませんので、ラズパイでの使い方としては、パトライトなどにμPRISMを設置して、点灯を検知した場合にSNSなどで通知するという方法があります。
次の記事を参考にしてください。
Discussion