LoginSignup
3
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-16

はじめに

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

前提環境

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

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

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

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

スクリーンショット 2020-01-12 23.57.57.png

手前味噌ですが「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での可視化もできます。

スクリーンショット 2019-06-16 18.17.23.png

おわりに

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

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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4