ラズベリーパイに繋いだ温度・湿度センサー(DHT11)の情報をElasticsearch & Kibanaでリアルタイム可視化した
ラズベリーパイに繋いだ温度・湿度センサーの情報をElasticsearchに投入して、Kibanaで可視化してみたので、手順を残しておきます。
Elasticsearch & KibanaはAmazon EC2にインストールして実行しています。
インストールなどの手順は以下をご参照ください。
mamelog.hatenablog.jp
温度・湿度センサー(DHT11)をラズベリーパイに接続する
以下の写真のように、センサーセットの中にあるケーブルを使って接続します。
温度・湿度を取得し表示する
DHT11はGitHubに取得用のコードを公開してる人がいるので、それを使います。
github.com
ラズパイ上でgit cloneしましょう
$ git clone https://github.com/szazo/DHT11_Python
dht11_example.pyを実行すると、温度・湿度が取得できます。
Elasticsearchにデータを送信する
Elasticsearchにデータを送るために、コードを読み解きます。
サンプルコードについて
dht11_example.pyを見ると、以下のコードでセンサーデータを取得していることが分かります。
instance = dht11.DHT11(pin=14) result = instance.read() result.temperature result.humidity
単純なコードを埋め込むだけで、温度・湿度が取れそうです。
Elasticsearchに外部からアクセス可能にする
Elasticsearchはデフォルトの設定では外部からアクセスが出来ないので、
外部からのアクセスを許可する設定を入れる必要があります。
具体的には/etc/elasticsearch/elasticsearch.ymlを編集します。
$ sudo vi /etc/elasticsearch/elasticsearch.yml
以下の設定を入れて保存します。
networkhost: "0.0.0.0"
Elasticsearch用のコードの編集
取り敢えず、コードを貼り付けちゃいます。
温度・湿度を取り敢えず可視化するだけならこれで可能です。
#!/usr/bin/env python3 import RPi.GPIO as GPIO import dht11 import time import datetime import socket from elasticsearch import Elasticsearch GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.cleanup() es = Elasticsearch('<Elasticsearch IP Address>:9200') instance = dht11.DHT11(pin=14) while True: sensorData = instance.read() timestamp = datetime.datetime.now() if sensorData.is_valid(): es_body = { '@timestamp' : timestamp.isoformat(), 'temperture' : sensorData.temperature, 'humidity' : sensorData.humidity } response = es.index(index='rspi',doc_type='doc',body=es_body) print(response) time.sleep(5)
このコードを適当なファイル名で保存して、dht11.pyと同じフォルダに置き、バックグラウンド実行しておけば5秒おきにセンサーデータが送られます。
Kibanaでこのようなグラフを作って、可視化することが出来ます。
SSH接続やElasticsearchのインデックスの作成など、いくつか粗はありますが、取り敢えずの実践ということで。
Kibanaでの画面自動更新設定方法
V7から?かな今まで画面右上部にあった自動更新設定が見当たらず、
自動更新が出来てなかったんで調べたら、以下の画像のように、期間設定のところに融合していました。
時差問題
タイムゾーン問題でこのコードだとKibanaでの表示が9時間ずれてしまいます。
解決策があれば教えていただきたく。