まめログ

Javaプログラマの歩み

ラズベリーパイに繋いだ温度・湿度センサー(DHT11)の情報をElasticsearch & Kibanaでリアルタイム可視化した

ラズベリーパイに繋いだ温度・湿度センサーの情報をElasticsearchに投入して、Kibanaで可視化してみたので、手順を残しておきます。
f:id:mamepika:20190730014501j:plain

Elasticsearch & KibanaはAmazon EC2にインストールして実行しています。
インストールなどの手順は以下をご参照ください。
mamelog.hatenablog.jp

ラズベリーパイについて

ラズベリーパイとセンサー類はAmazonで購入しました。
Amazon CAPTCHA

Amazon CAPTCHA

ラズベリーパイの準備

USBマウスとUSBキーボード、HDMI入力を受け付けるディスプレイが必要です。*1
OSに関しては画面の指示に従っていけば、特に問題なくインストールできると思います。
f:id:mamepika:20190730014944j:plain

温度・湿度センサー(DHT11)をラズベリーパイに接続する

以下の写真のように、センサーセットの中にあるケーブルを使って接続します。
f:id:mamepika:20190730015106j:plain

温度・湿度を取得し表示する

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のPythonクライアントをダウンロードします。*2

$ sudo pip3 install elasticsearch

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でこのようなグラフを作って、可視化することが出来ます。
f:id:mamepika:20190730022754j:plain

SSH接続やElasticsearchのインデックスの作成など、いくつか粗はありますが、取り敢えずの実践ということで。

Kibanaでの画面自動更新設定方法

V7から?かな今まで画面右上部にあった自動更新設定が見当たらず、
自動更新が出来てなかったんで調べたら、以下の画像のように、期間設定のところに融合していました。
f:id:mamepika:20190730023748p:plain

時差問題

タイムゾーン問題でこのコードだとKibanaでの表示が9時間ずれてしまいます。
解決策があれば教えていただきたく。

*1:ディスプレイはTVでも代用可能

*2:pip3の実行にはroot権限が必要のようでした