EnOcean

EnOceanのBLE環境センサー「STM550B」をNode-REDで受信して解析した話

電池や電源を使わず、環境からエネルギーを得ることをエナジーハーベストと言いますが、今回、EnOceanのBLEを使った環境センサー「STM550B」について、Node-REDで受信して、受信データを解析する方法を調べたのでメモしておきます。

↓商品の購入はこちらから

また、2020/8/5にオンラインで開催された”Node-RED UG Japan 「実践Node-RED活用マニュアル」書籍出版記念イベント”にて、このSTM550Bについて紹介した動画です。

↓ 資料

EnOcean STM550Bとは?

ドイツEnOcean社が製造販売する無線型の環境センサーです。BLE(2.4GHz)タイプとEnOcean(928MHz)タイプの2種類あり、私が試したのはBLEタイプです。

どちらも技適が取れているすぐれものです。

Node-REDのフロー

node-red

Node-REDのフローはこんな感じ。ちなみに、ラズパイ3で作っています。

順番としては、

1. BLE Beacon Scannerでデータを受信。

2. Switchノードで該当するBLEデータだけを選別
機器個別のID番号でフィルター

3. delayノードで重複データを削除
(同じデータが3回送信されるため)

4. functionノード(GetValue)で受信データをCSV用に整形

となっています。

受け取るデータ

debugノードで受け取るデータはこちら

nodered node

後半のrawデータの中にセンサーで取得したデータが入っています。

データの解析

受信したデータが何のデータなのかを調べる為、functionノードで整形し、fileノードでcsvファイルとして保存しています。

[{"id":"b5227952.5cd848","type":"BLE Beacon Scanner","z":"5a214363.2cbb5c","name":"","x":180,"y":140,"wires":[["f52caee7.baf71"]]},{"id":"f52caee7.baf71","type":"switch","z":"5a214363.2cbb5c","name":"","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"e50010000eea","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":170,"y":220,"wires":[["ed5ca42f.25f318"],[]]},{"id":"ed5ca42f.25f318","type":"delay","z":"5a214363.2cbb5c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"0.1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":350,"y":200,"wires":[["49e446d5.1b34b8","9e800f37.2bf6"]]},{"id":"49e446d5.1b34b8","type":"function","z":"5a214363.2cbb5c","name":"GetValue","func":"var Packet = msg.payload.other;\nvar data;\nvar hex;\nvar results = [];\nvar csvdata = \"\";\n\nfor ( let i=0; i<27; i++)\n{\n    hex = Packet[i].toString(16);\n    //data = \"Data\"+i+\":\"+hex+\":\"+Packet[i];\n    data = Packet[i];\n    \n    \n    results[i] = data;\n    csvdata = csvdata +\",\"+data;\n    \n    \n   \n}\nmsg.payload = csvdata;\nreturn msg;","outputs":1,"noerr":0,"x":560,"y":220,"wires":[["30368faa.5e2b4"]]},{"id":"9e800f37.2bf6","type":"debug","z":"5a214363.2cbb5c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":570,"y":140,"wires":[]},{"id":"30368faa.5e2b4","type":"file","z":"5a214363.2cbb5c","name":"file","filename":"data-csv.csv","appendNewline":true,"createDir":false,"overwriteFile":"false","encoding":"none","x":750,"y":220,"wires":[[]]}]

解析の為にやったこと

1. CSVデータ作成

2. データを2進数に変換

STM 550B

このうち、0〜5bitまでがDataTypeIDとなる。

3. 2のデータのうち6bit分を切り取る

4. 3を16進数に変換。これがDataTypeID。

STM 550B

これで、どのデータがどのセンサーなのかがわかる。

データ

結果

6: 0x40 → Temperature
raw[7]と[8]がデータ

9: 0x6 → Relative Humidity
raw[10]がデータ

11: 0x45 → Illumination(Sensor)
raw[12]にraw[13]×256をあわせたものが照度になる。

14: 0x8a → Acceleration Vector
raw[15]〜raw[18]までの32bitがデータになり、ちょっと特殊

19: 0x23 → Magnet Contact
raw[20]が、0x01 = Open, 0x02 = Closed

21: 0x2 → Energy Level
raw[22]がデータ

今気づいたけど、STM550Bのマニュアルの最後にtelegramのサンプルと解析方法がのってました。

STM550Bマニュアル

Node-REDでの使い方

var Packet = msg.payload.other;

Packet[i]

このようにすれば、rawデータのi番目を取り出すことができるので、あとはデータに応じて再計算することになる。

↓ 購入はこちらから

ABOUT ME
中畑 隆拓
スマートライト㈱ 代表取締役。DALIやKNX導入のコンサルティング・コンフィグレーション・機器の販売、AI-IoTを組み合わせたシステムの提案を行っています。