電池や電源を使わず、環境からエネルギーを得ることをエナジーハーベストと言いますが、今回、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のフローはこんな感じ。ちなみに、ラズパイ3で作っています。
順番としては、
1. BLE Beacon Scannerでデータを受信。
2. Switchノードで該当するBLEデータだけを選別
機器個別のID番号でフィルター
3. delayノードで重複データを削除
(同じデータが3回送信されるため)
4. functionノード(GetValue)で受信データをCSV用に整形
となっています。
受け取るデータ
debugノードで受け取るデータはこちら
後半の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進数に変換
このうち、0〜5bitまでがDataTypeIDとなる。
3. 2のデータのうち6bit分を切り取る
4. 3を16進数に変換。これがDataTypeID。
これで、どのデータがどのセンサーなのかがわかる。
データ
結果
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のサンプルと解析方法がのってました。
Node-REDでの使い方
var Packet = msg.payload.other; Packet[i]
このようにすれば、rawデータのi番目を取り出すことができるので、あとはデータに応じて再計算することになる。
↓ 購入はこちらから