Elastic Stackで室内環境センサーのデータを管理

#はじめに
スマートホームに欠かせないのが環境センサーのデータ収集です。自宅リビングの環境では、[Project Linking](https://linkingiot.com/)の環境センサーを設置して温湿度と照度のデータを収集しています。
今回は取得したデータをNode-REDからElasticsearchに登録する方法をご紹介します。

#前提環境
- 環境センサー
 - Tukeru TH (温度、湿度)
 - Sizuku Lux (照度)
- 収集機器
 - Raspberry Pi 4B (RAM:4GB)
- ソフトウェア
 - Raspbian (Buster)
 - Node-RED v1.0.3 + [node-red-contrib-linking-device](https://flows.nodered.org/node/node-red-contrib-linking-device)
 - Elasticsearch + Kibana ([Raspbian buster でElastic Stack 7.5.1 を動かす](https://qiita.com/Y-Shikase/items/7e6025855454c443f620))

#Node-REDで環境センサーの情報を受信する

Linkingデバイスの利点は場所の制約が緩いというところでしょう。他の環境センサーも試したのですが、USBのタイプだと熱を貰って正確な値が出なかったり、設置したい場所によっては本体も移動するなど、大掛かりな作業が発生します。USBケーブルの見栄えも良くないです。

電池駆動で電池切れをチェックする必要はありますが、メリットの部分が非常に大きいと感じています。
Linkingデバイスから情報を取得するノードのセットアップは「[オススメ！1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する](https://qiita.com/tinoue@github/items/be50b80c7d6bb107a00c)」を参考にさせていただきました。

「linking-scanner」ノードは、インジェクトノードのように利用できるようです。
以下のように、30秒ごとにElasticsearchへデータ投入するフローを作成しました。

![スクリーンショット 2020-01-12 23.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/130d5b00-f82e-ef66-92ea-850fd1618774.png)

手前味噌ですが「Elasticsearch」サブフローは、別記事「[Node-REDでのElasticsearch活用法](https://qiita.com/Y-Shikase/items/92dc1f2d51adfacd9764)」を参考にしてください。
書き出したフローのJSONは以下です。

```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での可視化もできます。

![スクリーンショット 2019-06-16 18.17.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/775f7366-e577-5679-b424-379d64ef9cfc.png)

#おわりに
今回は環境センサーからのBLE BeaconのデータをRaspberry Pi 4B上のElasticsearchへ格納するまでを記事にしました。温度湿度照度が取れれば、完全自動の家電制御も夢ではないですね！

Elasticsearchにデータを入れるメリットとしては、時系列クエリが多様である事です。
照度は変化のあるもので、特定期間の平均値が欲しいですし、エアコン制御も室温が上がってきているのか、下がってきているのかの判断ができれば、もっと賢い制御ができると思います。
例えば、日没後に室温が下がってきているのであれば、閾値を少し超えていても冷房を入れないなど。人間のような判断がしやすいと思います。