ElasticSearch+Kibana と DHT11で温湿度をグラフ表示する

RaspberryPiとセンサーでデータ受信

RaspberryPiを活用する事例として、これまでモーターやカメラを使用したロボットやマニュピレーションを注意に勉強をしてきました。掌握とはいかないまでも、いくつかのプラットフォームやH/W制御を理解し、制御できるようになってきました。
しかし、一般的な産業用IoTとしてはセンターデータ収集(ビッグデータ)と活用も重要では?と思い、今回は温湿度センサー(DTH11)からの受信データの可視化を試してみたいと思います。

f:id:camelrush:20200512200557p:plain

ソフトウェア(データの可視化)

受信した温度・湿度データの可視化には、全文検索エンジンである「ElasticSearch」とBIツールの「Kibana」を使用します。このあたりは流行り廃りがありますが、割とメジャーどころを選んでみました。AWSにも同様のサービスがありますが、EC2前提のため費用がかかると思い、一旦オンプレで実践することにしました。

f:id:camelrush:20200512202930p:plain

最終的に、表示されたイメージは以下のようになります。tempertureが温度、Humidityが湿度です。線がいびつなのは、途中でセンサーを手でつまんで、無理に温湿度を上げたためです。

f:id:camelrush:20200513234925g:plain

用意するもの

事前に準備するハードウェアは、以下の2つです。

  • Windows PC
  • RaspberryPi3 Model B+
  • 温湿度センサー DHT11

  

ちなみに、私はDHT11の導入で少しハマりまして、最初に購入したHiLetgoさんのセンサーキットでは、うまく動作しませんでした。詳しくは調べていませんが、ハンダの問題による初期不良かもしれません。上のリンクの製品を買いなおしたところ、簡単に接続できました。また(写真のような接続ボードがない)センサー部品だけのものも販売されており、この場合は、接続過程でプルアップ抵抗を付与する必要があるそうです。以下を参考にしてください。

iot.keicode.com

システム構成

今回の構成は以下の通り、比較的シンプルです。RaspberryPiに接続した、センサーDHT11から温湿度データをPythonで読み取り、ElasticSearchClientライブラリを介してHTTP RequestでElasticSearchのデータベース(index)にデータを格納します。格納されたデータはブラウザ経由でKibanaのポートにアクセスし、画面に表示します。
f:id:camelrush:20200512210401p:plain

ElasticSearchセットアップ

環境構築

  • WindowsPCから、以下のElasticSearchページにアクセスします。
    Download Elasticsearch Free | Get Started Now | Elastic | Elastic

  • 遷移したページで、以下のリンクをクリックしてzipファイルをダウンロードします。
    f:id:camelrush:20200512211049p:plain

  • zipファイルをダウンロードしたら、適当なフォルダに解凍・展開します(ex. C:\ElasticSearch)

  • RaspberryPiからのリクエストデータを受信するため、解凍したフォルダにある「/config/elasticsearch.yml」ファイルを開き、以下の箇所を修正します。

# ---------------------------------- Network -----------------------------------
 :
#network.host: 192.168.0.1
network.host: 0.0.0.0
 :

# --------------------------------- Discovery ----------------------------------
 :
#discovery.seed_hosts: ["host1", "host2"]
discovery.seed_hosts: ["127.0.0.1"]
 :
  • 同様の目的で、ファイアウォールに、ElasticSearchの受信ポート(デフォルトは9200)に対する接続許可を設定します。

    • 「受信の規則の例外」に「新しい規則」を指定します。
      f:id:camelrush:20200513053650p:plain

    • 「規則の種類」に「ポート」を指定します。
      f:id:camelrush:20200513053802p:plain

    • プロトコルおよびポート」で「TCP」「9200」を指定します。
      f:id:camelrush:20200513053906p:plain

    • 「操作」に「接続を許可する」を指定します。
      f:id:camelrush:20200513053951p:plain

    • 「名前」に「ElasticSearch」と指定します(任意)
      f:id:camelrush:20200513054045p:plain

  • ElasticSearchの環境構築は以上です。

実行方法

PowerShellを起動し、次のコマンドでElasticSearchサービスを開始します。

start (Install Folder)\bin\ElasticSearch.bat

起動にはしばらく時間がかかります。最後に以下のような表示が出ればOKです。

[2020-05-12T19:47:57,614][INFO ][o.e.n.Node               ] [DESKTOP-L0AQN2J] started

動作確認

RaspberryPi側で、以下のコマンドを実行します。

$ sudo curl https://(WindowsPC IPAddress):9200/

次のような結果が表示されれば、OKです。

{
  "name" : "DESKTOP-L0AQN2J",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Yl0C61rVSV6qCa4Q294O6A",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Kibanaセットアップ

環境構築

  • WindowsPCから、以下のKibanaページにアクセスします。
    https://www.elastic.co/jp/downloads/kibana

  • 遷移したページで、以下のリンクをクリックしてzipファイルをダウンロードします。
    f:id:camelrush:20200513055817p:plain

  • zipファイルをダウンロードしたら、適当なフォルダに解凍・展開します(ex. C:\Kibana)

  • (任意)外部からKibanaページを参照させたい場合は、解凍したフォルダにある「/config/kibana.yml」ファイルを開き、以下の箇所を修正します。

#server.host: "localhost"
server.host: "0.0.0.0"
  • (任意)外部からKibanaページを参照させたい場合、ファイアウォールに、Kibanaの受信ポート(デフォルトは5601)に対する接続許可を設定します。
    ※この手順の記載は省略します。ElasticSearchの手順を参考に、ポートを追加してください。

実行方法

PowerShellを起動し、次のコマンドでKibanaサービスを開始します。

start (Install Folder)\bin\Kibana.bat

こちらの起動には、ElasticSearchよりも、さらに時間がかかります。最後に以下のような表示が出ればOKです。

log   [10:52:22.688] [info][server][Kibana][http] http server running at http://0.0.0.0:5601

動作確認

WindowsPCで、ブラウザから以下のページへアクセスします。

http://localhost:5601

次のような結果が表示されれば、OKです。 f:id:camelrush:20200513232310p:plain

f:id:camelrush:20200513060647p:plain

RaspberryPiセットアップ

センサー接続

以下の図を参考に配線してください。
f:id:camelrush:20200514000722p:plain

プログラム作成 on Python

今回のプログラムはPythonで開発しています。以下に開発の流れを示しますが、開発したプログラムはGitHubにも上げていますのでご確認ください。

github.com

  • RaspberryPiにログインし、最初に、ElasticSearchClientのライブラリをpipコマンドでインストールします。
$ sudo pip3 install elasticsearch
  • DHT11はGitHubにセンサー制御用のライブラリが公開されています。プログラムを配置するフォルダを作成し、CDコマンドでフォルダに移動したら、git cloneコマンドでライブラリを取得します。
$ sudo git clone https://github.com/szazo/DHT11_Python.git
  • プログラムフォルダに、以下の内容でプログラム「elasticThermoHygroMeter.py」ファイルを作成します。
import RPi.GPIO as GPIO
from DHT11_Python import dht11
import datetime
import time
from elasticsearch import Elasticsearch

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# ElasticSearch Client作成(引数はWindowsPCのIPアドレス)
es = Elasticsearch('192.168.3.11:9200')

# DHT11センサーのインスタンス作成
instance = dht11.DHT11(pin=14)

# ポーリング(1秒間隔)
while True:

    # センサーからデータ取得
    sensorData = instance.read()
    timestamp = datetime.datetime.now()

    if sensorData.is_valid():
        es_body = {
            '@timestamp' : timestamp.isoformat(),
            'temperture' : sensorData.temperature,
            'humidity' : sensorData.humidity,
        }

    # ElasticSearchのデータ(index'raspi_accel_meter')に対して、
    # センサーから取得したデータを登録
    response = es.index(index='raspi_accel_meter',doc_type='doc',body=es_body)

    # 1秒ウエイトして次のループへ
    time.sleep(1)
    print(es_body)
  • 次のコマンドでプログラムを開始してください。センサーが正しく接続されていれば、データがWindowsPC上のElasticSearchに登録されていきます。
$ sudo python3 elasticThermoHygroMeter.py

f:id:camelrush:20200514002305p:plain

Kibanaグラフ設定

登録されたデータを可視化するため、WindowsPCでKibanaのページにアクセスし、グラフビューを設定します。 最初に、ブラウザから、アドレスhttp://localhost:5601にアクセスします。

  • 左のメニューバーの上から3つ目あたりにある「visualize」を選択します。
    f:id:camelrush:20200513063326p:plain

  • 「+Create New Visualization」ボタンをクリックします。 f:id:camelrush:20200513063434p:plain

  • 今回は、一番左列にある「Line」アイコンをクリックします。 f:id:camelrush:20200513230112p:plain

  • 画面右に「Create Index pattern」が表示されます。ここで受信データ(index)から、データパターンを作成します。 f:id:camelrush:20200513232734p:plain

  • 「index pattern」に「raspi*」と入力し、RaspberryPiのPythonプログラムから登録したindex「raspi_accel_meter」が表示されることを確認し、「Next step」ボタンをクリックします。 f:id:camelrush:20200513232807p:plain

  • 「Time Filter field name Refresh」には、「I don't want to use Time Filter」を選択して、「Create index pattern」ボタンをクリックします。 f:id:camelrush:20200513232848p:plain

  • 以上でindex patternデータが作成されます。再度、左のメニューから「visualize」を選択し、「Line」をクリックしてください。 f:id:camelrush:20200513232918p:plain

  • 先ほど作成したindex patternが表示されますので、このリンクをクリックします。 f:id:camelrush:20200513233023p:plain

  • index patternをベースにした、グラフ設定画面が表示されます。 f:id:camelrush:20200513230215p:plain

  • 最初に、X軸に「時間」経過を指定していきます。画面左側の「Buckets」の「+Add」をクリックし、「X-axis」を選択します。
    f:id:camelrush:20200513230300p:plain

  • 追加した「X-axis」には、以下のとおり設定します。

    • Aggregation : Date Histogram
    • Field : @timestamp
    • Minimum interval : Second f:id:camelrush:20200513230350p:plain
  • 次に、Y軸に「温度」(Temperture)を指定していきます。画面左側の「Metrics」の「Y-axis」に、以下の通り設定します。

    • Aggregation : Max
    • Field : temperture f:id:camelrush:20200513230446p:plain
  • ここまでの登録が済んだら、「Metrics」エリアの上にある▶マーク(Apply)をクリックしてください。登録しt温度の内容がグラフ表示されるはずです。 f:id:camelrush:20200513233138p:plain

  • 「Y-axis」で「+Add」をクリックして、表示内容に「湿度」(Humadity)を追加します。設定後、▶マークをクリックしてApplyすると、湿度グラフが表示されます。

    • Aggregation : Max
    • Field : humadity f:id:camelrush:20200513233352p:plain
  • 最初の表示のままでは、累積したindexデータをすべて横軸に表示してしまうため、時間の経過とともに見づらくなっていきます。今回は設定を変更し、直近3分間だけを表示することにします。

  • 画面上部にある「Add Filter」をクリックし、ウィンドウに次のとおり設定して、「Save」ボタンをクリックします。
    • Field : @timestamp
    • operator : is between
    • range : now+9h-3m → now+9h
  • 上の「now+9h」は、UTCから日本の時差9時間を加算しています。そこから、3m(3分)前までの間(between)を表示するという指定になります。
    f:id:camelrush:20200513233444p:plain

  • 上記の設定により、グラフのX軸の間隔が3分分になるはずです。なお、グラフの表記を日本時間に変更するには、左のメニューからManagement - Advanced Settings - TimeZone~ を設定する必要があります。 f:id:camelrush:20200513233505p:plain

  • 今回はさらに、定期的に画面を更新させましょう。上部の時計アイコン(Quick select)をクリックし、下部の「Refresh every」に「1 seconds」を指定して、右の「□ Start」ボタンをクリックします。 f:id:camelrush:20200513233658p:plain

  • 以上で、1秒ごとにセンサーデータをグラフ表示する画面が作成できました。 f:id:camelrush:20200513234925g:plain

所感

Kibana環境の構築が思ったより簡単で、データ可視化は簡単に行えました。最近ですと、Kibana Canvasを使用した素敵な表示画面が今度挑戦したいと思っています。

www.elastic.co

課題

最後に実施した画面更新ですが、秒単位の周期しか指定できませんでした。温湿度変化程度であればこれで問題なさそうですが、よりリアルタイムなセンサーデータの表示(たとえば加速度センサによる振動計のプロッタのようなもの)には、向かないような気がします。こちらはMQTTによるインプットから、Chart.jsとかで作った方がいいのかもと思いました。