#はじめに
スマートホームに欠かせないのが環境センサーのデータ収集です。自宅リビングの環境では、Project Linkingの環境センサーを設置して温湿度と照度のデータを収集しています。
今回は取得したデータをNode-REDからElasticsearchに登録する方法をご紹介します。
#前提環境
- 環境センサー
- Tukeru TH (温度、湿度)
- Sizuku Lux (照度)
- 収集機器
- Raspberry Pi 4B (RAM:4GB)
- ソフトウェア
- Raspbian (Buster)
- Node-RED v1.0.3 + node-red-contrib-linking-device
- Elasticsearch + Kibana (Raspbian buster でElastic Stack 7.5.1 を動かす)
#Node-REDで環境センサーの情報を受信する
Linkingデバイスの利点は場所の制約が緩いというところでしょう。他の環境センサーも試したのですが、USBのタイプだと熱を貰って正確な値が出なかったり、設置したい場所によっては本体も移動するなど、大掛かりな作業が発生します。USBケーブルの見栄えも良くないです。
電池駆動で電池切れをチェックする必要はありますが、メリットの部分が非常に大きいと感じています。
Linkingデバイスから情報を取得するノードのセットアップは「オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する」を参考にさせていただきました。
「linking-scanner」ノードは、インジェクトノードのように利用できるようです。
以下のように、30秒ごとにElasticsearchへデータ投入するフローを作成しました。
手前味噌ですが「Elasticsearch」サブフローは、別記事「Node-REDでのElasticsearch活用法」を参考にしてください。
書き出したフローのJSONは以下です。
[{"id":"3f7774f5.a6a20c","type":"subflow","name":"Elasticsearch","info":"","category":"","in":[{"x":50,"y":30,"wires":[{"id":"c5bb15c.4c10de8"}]}],"out":[{"x":580,"y":30,"wires":[{"id":"19d2a3b.d048a5c","port":0}]}],"env":[],"color":"#E6E0F8","icon":"font-awesome/fa-database"},{"id":"eeda88c1.f8b278","type":"http request","z":"3f7774f5.a6a20c","name":"Elasticsearch","method":"use","ret":"txt","paytoqs":false,"url":"","tls":"","persist":false,"proxy":"","authType":"basic","x":340,"y":30,"wires":[["19d2a3b.d048a5c"]]},{"id":"c5bb15c.4c10de8","type":"change","z":"3f7774f5.a6a20c","name":"msg.headers","rules":[{"t":"delete","p":"headers","pt":"msg"},{"t":"set","p":"headers","pt":"msg","to":"{\"Content-Type\":\"application/json\",\"Connection\":\"close\"}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":170,"y":30,"wires":[["eeda88c1.f8b278"]]},{"id":"19d2a3b.d048a5c","type":"json","z":"3f7774f5.a6a20c","name":"","property":"payload","action":"","pretty":false,"x":490,"y":30,"wires":[[]]},{"id":"e6695b94.08cca8","type":"subflow:3f7774f5.a6a20c","z":"f4557e75.b0f3f","x":890,"y":140,"wires":[[]]},{"id":"7108220c.1b5d9c","type":"change","z":"f4557e75.b0f3f","name":"POST _doc","rules":[{"t":"set","p":"method","pt":"msg","to":"POST","tot":"str"},{"t":"set","p":"url","pt":"msg","to":"http://localhost:9200/sensor-","tot":"str"},{"t":"change","p":"url","pt":"msg","from":"$","fromt":"re","to":"payload.service","tot":"msg"},{"t":"change","p":"url","pt":"msg","from":"$","fromt":"re","to":"/_doc","tot":"str"},{"t":"set","p":"date","pt":"msg","to":"$now()","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":140,"wires":[["d5659d6d.da1df"]]},{"id":"69e18d2a.9e18d4","type":"template","z":"f4557e75.b0f3f","name":"ES Query JSON","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"date\": \"{{{date}}}\",\n \"device\": \"{{{payload.device}}}\",\n \"{{payload.service}}\": {{{payload.data}}}\n}","output":"str","x":710,"y":140,"wires":[["e6695b94.08cca8"]]},{"id":"d541687c.a302d8","type":"linking-scanner","z":"f4557e75.b0f3f","name":"","autostart":true,"duration":"","interval":"30","x":100,"y":140,"wires":[["7108220c.1b5d9c"]]},{"id":"d5659d6d.da1df","type":"function","z":"f4557e75.b0f3f","name":"payload.dataを文字列に","func":"\nmsg.payload.data = JSON.stringify(msg.payload.data);\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":140,"wires":[["69e18d2a.9e18d4"]]}]
事前のindex作成やsetting/mappingはしていません。
宣伝するわけではないですが、Elasticsearchのデータ操作にNode-REDは非常に相性が良いです。
#Kibanaで可視化する
データが蓄積されていくと、Kibanaでの可視化もできます。
#おわりに
今回は環境センサーからのBLE BeaconのデータをRaspberry Pi 4B上のElasticsearchへ格納するまでを記事にしました。温度湿度照度が取れれば、完全自動の家電制御も夢ではないですね!
Elasticsearchにデータを入れるメリットとしては、時系列クエリが多様である事です。
照度は変化のあるもので、特定期間の平均値が欲しいですし、エアコン制御も室温が上がってきているのか、下がってきているのかの判断ができれば、もっと賢い制御ができると思います。
例えば、日没後に室温が下がってきているのであれば、閾値を少し超えていても冷房を入れないなど。人間のような判断がしやすいと思います。