RaspberryPiとセンサーでデータ受信
RaspberryPiを活用する事例として、これまでモーターやカメラを使用したロボットやマニュピレーションを注意に勉強をしてきました。掌握とはいかないまでも、いくつかのプラットフォームやH/W制御を理解し、制御できるようになってきました。
しかし、一般的な産業用IoTとしてはセンターデータ収集(ビッグデータ)と活用も重要では?と思い、今回は温湿度センサー(DTH11)からの受信データの可視化を試してみたいと思います。
ソフトウェア(データの可視化)
受信した温度・湿度データの可視化には、全文検索エンジンである「ElasticSearch」とBIツールの「Kibana」を使用します。このあたりは流行り廃りがありますが、割とメジャーどころを選んでみました。AWSにも同様のサービスがありますが、EC2前提のため費用がかかると思い、一旦オンプレで実践することにしました。
最終的に、表示されたイメージは以下のようになります。tempertureが温度、Humidityが湿度です。線がいびつなのは、途中でセンサーを手でつまんで、無理に温湿度を上げたためです。
用意するもの
事前に準備するハードウェアは、以下の2つです。
- Windows PC
- RaspberryPi3 Model B+
- 温湿度センサー DHT11
ちなみに、私はDHT11の導入で少しハマりまして、最初に購入したHiLetgoさんのセンサーキットでは、うまく動作しませんでした。詳しくは調べていませんが、ハンダの問題による初期不良かもしれません。上のリンクの製品を買いなおしたところ、簡単に接続できました。また(写真のような接続ボードがない)センサー部品だけのものも販売されており、この場合は、接続過程でプルアップ抵抗を付与する必要があるそうです。以下を参考にしてください。
システム構成
今回の構成は以下の通り、比較的シンプルです。RaspberryPiに接続した、センサーDHT11から温湿度データをPythonで読み取り、ElasticSearchClientライブラリを介してHTTP RequestでElasticSearchのデータベース(index)にデータを格納します。格納されたデータはブラウザ経由でKibanaのポートにアクセスし、画面に表示します。
ElasticSearchセットアップ
環境構築
WindowsPCから、以下のElasticSearchページにアクセスします。
Download Elasticsearch Free | Get Started Now | Elastic | Elastic遷移したページで、以下のリンクをクリックしてzipファイルをダウンロードします。
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)に対する接続許可を設定します。
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ファイルをダウンロードします。
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です。
RaspberryPiセットアップ
センサー接続
以下の図を参考に配線してください。
プログラム作成 on Python
今回のプログラムはPythonで開発しています。以下に開発の流れを示しますが、開発したプログラムはGitHubにも上げていますのでご確認ください。
- 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
Kibanaグラフ設定
登録されたデータを可視化するため、WindowsPCでKibanaのページにアクセスし、グラフビューを設定します。 最初に、ブラウザから、アドレスhttp://localhost:5601
にアクセスします。
左のメニューバーの上から3つ目あたりにある「visualize」を選択します。
「+Create New Visualization」ボタンをクリックします。
今回は、一番左列にある「Line」アイコンをクリックします。
画面右に「Create Index pattern」が表示されます。ここで受信データ(index)から、データパターンを作成します。
「index pattern」に「raspi*」と入力し、RaspberryPiのPythonプログラムから登録したindex「raspi_accel_meter」が表示されることを確認し、「Next step」ボタンをクリックします。
「Time Filter field name Refresh」には、「I don't want to use Time Filter」を選択して、「Create index pattern」ボタンをクリックします。
以上でindex patternデータが作成されます。再度、左のメニューから「visualize」を選択し、「Line」をクリックしてください。
先ほど作成したindex patternが表示されますので、このリンクをクリックします。
index patternをベースにした、グラフ設定画面が表示されます。
最初に、X軸に「時間」経過を指定していきます。画面左側の「Buckets」の「+Add」をクリックし、「X-axis」を選択します。
追加した「X-axis」には、以下のとおり設定します。
- Aggregation : Date Histogram
- Field : @timestamp
- Minimum interval : Second
次に、Y軸に「温度」(Temperture)を指定していきます。画面左側の「Metrics」の「Y-axis」に、以下の通り設定します。
- Aggregation : Max
- Field : temperture
ここまでの登録が済んだら、「Metrics」エリアの上にある▶マーク(Apply)をクリックしてください。登録しt温度の内容がグラフ表示されるはずです。
「Y-axis」で「+Add」をクリックして、表示内容に「湿度」(Humadity)を追加します。設定後、▶マークをクリックしてApplyすると、湿度グラフが表示されます。
- Aggregation : Max
- Field : humadity
最初の表示のままでは、累積したindexデータをすべて横軸に表示してしまうため、時間の経過とともに見づらくなっていきます。今回は設定を変更し、直近3分間だけを表示することにします。
- 画面上部にある「Add Filter」をクリックし、ウィンドウに次のとおり設定して、「Save」ボタンをクリックします。
- Field : @timestamp
- operator : is between
- range : now+9h-3m → now+9h
上の「now+9h」は、UTCから日本の時差9時間を加算しています。そこから、3m(3分)前までの間(between)を表示するという指定になります。
上記の設定により、グラフのX軸の間隔が3分分になるはずです。なお、グラフの表記を日本時間に変更するには、左のメニューからManagement - Advanced Settings - TimeZone~ を設定する必要があります。
今回はさらに、定期的に画面を更新させましょう。上部の時計アイコン(Quick select)をクリックし、下部の「Refresh every」に「1 seconds」を指定して、右の「□ Start」ボタンをクリックします。
以上で、1秒ごとにセンサーデータをグラフ表示する画面が作成できました。
所感
Kibana環境の構築が思ったより簡単で、データ可視化は簡単に行えました。最近ですと、Kibana Canvasを使用した素敵な表示画面が今度挑戦したいと思っています。
課題
最後に実施した画面更新ですが、秒単位の周期しか指定できませんでした。温湿度変化程度であればこれで問題なさそうですが、よりリアルタイムなセンサーデータの表示(たとえば加速度センサによる振動計のプロッタのようなもの)には、向かないような気がします。こちらはMQTTによるインプットから、Chart.jsとかで作った方がいいのかもと思いました。