Raspberry Piチュートリアル:KairosDBコネクタを介してGridDBに温度データを送信する

はじめに

このブログは、Raspberry Pi からGridDBサーバーに送られる温度データを送信して可視化する方法に関するチュートリアルです。 バックエンドデータベースとしてGridDBを使用し、次にデータを収集して可視化するために KairosDB  GridDB Connectorを使用します。 このチュートリアルでは、GridDBとKairosDBの両方のインストール方法と、温度データの自動送信方法について説明します。

以下のような温度データの例があります(温度は1分ごとに送信されました)。

このチュートリアルで最初にやること(温度センサの購入、構築、実装) については 参照ページ1 と、参照ページ2(ハリーのチュートリアル) を参考にしてください。参照ページ1では購入する必要のある部品や、物理的に温度センサーを組み立てる方法を説明しており、ハリーのチュートリアルではソフトウェアについて詳しく説明しています。 このGridDBのチュートリアルを実行する前に、ハリーのチュートリアルの最初にページに従い、Pythonスクリプトを使って温度センサーの読みを表示させる状態にしておきましょう。

このプロジェクトにはRaspberry Pi 3が使われましたが、他のものを使うこともできるでしょう。

GridDBをインストールする

Raspberry Piが温度を正しく読み取りプリントアウトするためにはGridDBサーバを構築する必要があります。 CentOS 6.7マシンを起動して(6.8以上でも可)、GridDBコミュニティ版の rpm をダウンロードしインストールしてください。

$ su
# rpm -ivh griddb_nosql-X.X.X-linux.x86_64.rpm
Preparing...                ########################################### [100%]

------------------------------------------------------------
Information:
  User gsadm and group gridstore have been registered.
  GridDB uses new user and group.
------------------------------------------------------------

   1:griddb_nosql           ########################################### [100%]

マシンにGridDBをインストールすると、いくつかのディレクトリと “admin”というユーザが作成されます。 GridDBコマンドを実行するには、 “admin”ユーザに切り替える必要があります。

  1. / var / lib / gridstore /
  2. /usr/griddb-X.X.X/

忘れずに”admin”ユーザーにパスワードを設定しておきましょう。

# gs_passwd admin
Password:(Input password)
Retype password:(Input password again)

次に、GridDBが適切に動作していることを確認するために、1ノードクラスタを起動しましょう。 まず、いくつかのパスを設定する必要があります。

# export GS_HOME=/var/lib/gridstore
# export GS_LOG=/var/lib/gridstore/log

Oracle JDK(Linux x64 RPMパッケージ)は、 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html からダウンロードしてください。

# export JAVA_HOME=/usr/java/default
# export CLASSPATH=${CLASSPATH}:/usr/griddb-3.0.0/bin/gridstore.jar
# export no_proxy=127.0.0.1
# service iptables stop

これらのコマンドを実行してから、最初のノードを起動しましょう。

# cd $GS_HOME
# nano conf/gs_cluster.conf
  #    "clusterName":"temperature" #

Ctrl + Xを押して変更を保存します。
これでコマンドを実行してノードを起動し、新しく名前を付けたクラスタに参加させることができます。

# su gsadm
$ /usr/bin/gs_startnode
$ /usr/bin/gs_joincluster -c your_clustername -u admin/your_password

GridDBの組み込みコマンドの1つを実行すると、クラスタのプロパティを表示できます。

$ /usr/bin/gs_stat

GridDBのgithubページからサンプルアプリケーションを実行して、GridDBが動作可能であることを確認することをお勧めします。
GridDBが動作することを確認したら、次にKairosDBのインストールと実装を行います。 KairosDBをインストールした後は、REST APIを使用してセンサデータをGridDBにPOSTすれば完了です。

KairosDBコネクタをインストールする

KairosDBとGridDB Connectorの両方をダウンロードしてインストールするには、root ユーザーに切り替えます。

KairosDB GridDB Connectorをダウンロードし, 次のコマンドを実行してKairosDBをホームディレクトリにダウンロードします。

# cd ~
# curl -O --location https://github.com/kairosdb/kairosdb/archive/v1.1.1.tar.gz
# tar xfvz v1.1.1.tar.gz
# cd kairosdb-1.1.1

GridDB ConnectorをKairosDB srcフォルダにコピーします。

# cp -r <src/main/java/org/kairosdb/datastore/griddb folder in GridDB connector> src/main/java/org/kairosdb/datastore/

ここで、KairosDBディレクトリのいくつかの設定ファイルを変更する必要があります。 まず、ivy.xmlファイルを編集します。 ファイルのどこかに次の行を貼り付けます。

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency org="org.apache.commons" name="commons-pool2" rev="2.0"/>

次に、logback.xmlファイルを編集し、以下の行を追加します。

# nano src/main/resources/logback.xml
<logger name="com.toshiba.mwcloud.gs.GridStoreLogger" level="INFO"/>

次に、KairosDBにGridDBをバックエンドとして使用することを定義するためファイルを以下のように変更します。

 

# nano src/main/resources/kairosdb.properties
#kairosdb.service.datastore=org.kairosdb.datastore.h2.H2Module
kairosdb.service.datastore=org.kairosdb.datastore.griddb.GriddbModule

デフォルトのバックエンドH2Moduleをコメントアウトして、コメントのないGridDBを追加してください。 次に、ファイルの一番下に以下の行を追加します。

#===============================================================================
 #GridDB properties
 kairosdb.datastore.griddb.cluster_name=<GridDB cluster name>
 kairosdb.datastore.griddb.user=<GridDB user name>
 kairosdb.datastore.griddb.password=<GridDB password>
 #Define address and port for multicast method, leave it blank if using other method
 kairosdb.datastore.griddb.notification_address=239.0.0.1
 kairosdb.datastore.griddb.notification_port=31999
 #Define nodes fixed list method, leave it blank if using other method, node list is in the form> 1.1.1.1:10001,1.1.1.2:10001
 kairosdb.datastore.griddb.notification_member=
 #Define url for provider method, leave it blank if using other method
 kairosdb.datastore.griddb.notification_provider_url=
 kairosdb.datastore.griddb.consistency=
 kairosdb.datastore.griddb.container_cache_size=
 kairosdb.datastore.griddb.data_affinity_pattern=
 kairosdb.datastore.griddb.failover_timeout=
 kairosdb.datastore.griddb.transaction_timeout=
 kairosdb.datastore.griddb.datapoint_ttl=0
 kairosdb.datastore.griddb.max_data_cache_size=50000
 kairosdb.datastore.griddb.max_write_buffer_size=500000
 kairosdb.datastore.griddb.number_request_concurrency=100
 kairosdb.datastore.griddb.write_delay=1000
 kairosdb.datastore.griddb.write_buffer_datapoint=8

記入する必要のあるパラメータ(クラスタ名、ユーザ、パスワード)を記入し、残りのGridDBプロパティについてはこちら を参照してください。

このチュートリアルでは、すべての値をデフォルトに保ちます。 最後に、gridstore.fileをlib /ディレクトリにコピーしてください。

 

# cp /usr/share/java/gridstore.jar $PWD/lib/

これで、KairosDBコネクタを実行できるようになりました。

GridDB + The KairosDB コネクタを実行する

設定が正しくできていれば、GridDBクラスタはすでに実行されているはずです。 これからKairosDBを稼働させてみましょう。KairosDBディレクトリで次のコマンドを実行します。

# java -cp tools/tablesaw-1.2.2.jar make run

KairosDBが起動したことを示すメッセージが端末内に表示されます。この端末はKairosDBを実行するために開いたままになっているので、コマンドラインを引き続き使用するには新しい端末を開く必要があります。

上のスクリーンショットは、KairosDBが私のCentOS仮想マシンで正常に動作している様子です。

これで、すべてのバックエンドの作業が完了しました。 最後に、ハリーのpythonスクリプトをREST APIを介してPOSTに変更し、ハリーのcron jobを使用して5分ごとにサーバーに新しい熱読み取り値をPOSTします。

Raspberry Piを設定する

Pythonスクリプトを修正する前に、まずはrequests python libraryをインストールして、HTTPリクエストを送信します。Raspbianの最新リリースではpipがインストールされているので、SSHをあなたのPiに戻して実行してください。

# pip install requests

次に、temperature_sensor_code.pyファイルを編集します。 KairosDBはUnix Epochからのミリ秒単位の時間データを扱うので、スクリプトは時間データをミリ秒単位に変換し、スクリプトでHTTP POSTを実行します。

#!/usr/bin/env python

import os

import glob

import time

import requests
os.system('modprobe w1-gpio')

os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'

device_folder = glob.glob(base_dir + '28*')[0]

device_file = device_folder + '/w1_slave'

millis = int(round(time.time() * 1000))

url = 'http://<your_CentOS_IP>:8080/api/v1/datapoints'

def read_temp_raw():
    f = open(device_file, 'r')

    lines = f.readlines()

    f.close()

    return lines

def read_temp():

    lines = read_temp_raw()

    while lines[0].strip()[-3:] != 'YES':

        time.sleep(0.2)
        lines = read_temp_raw()

    equals_pos = lines[1].find('t=')

    if equals_pos != -1:

        temp_string = lines[1][equals_pos+2:]

        temp_c = float(temp_string) / 1000.0

        temp_f = temp_c * 9.0 / 5.0 + 32.0

        payload = {'name':'temperature', 'timestamp':millis, 'value':temp_f, 'tags':{'sensorNo':'1'}}

        return requests.post(url, json = payload)
while True:

        print(read_temp())

        break

CentOSマシンのIPアドレスと一致するようにurl変数を変更してください。 残りのURLは、KairosDBがデータ要求を受け入れる場所です。 ペイロードに関しては、必要に応じてパラメータを変更することができます。 たとえば、気温を華氏から摂氏に変更することができます。 KairosDBはデータセットに少なくとも1つの「タグ」を必要としますが、何でも構いません。

スクリプトの最初の行は、このコードがPythonスクリプトであることをPiに伝えます。 実行可能にするためにいくつかの権限を変更する必要があります。

# chmod +x temperature_sensor_code.py

スクリプトが実際に実行可能であることを確認しましょう。

# ./temperature_sensor_code.py
(Response [204])

204のHTTPレスポンスが良好であれば、POSTが成功したことを意味します。 ブラウザを開き、次のリンクhttp:<your_CentOS_IP>:8080にアクセスして、データがサーバーに正しく送信されていることを確認することができます。データセット(以下の例ではtemperature)を入力すると結果が表示されます。

自動POSTをスケジュールする

次に、 Harry’s Tutorial part 3 にある、UNIXの組み込みタスクスケジューラ:cronを使用します。

# crontab -e

ファイルの一番下に以下の行を追加します。

*/5 * * * * /home/pi/tempLog/temperature_sensor_code.py

今回ご紹介した例では、5分ごとにPythonスクリプトを実行するよう設定しましたが、タスクを実行するタイミングは、自由にスケジュール設定することができます。

これで完了です。GridDBサーバに最新の温度データが保存されました。データを引用して結果を分かりやすく表にしてもよいでしょう。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *