SORACOM Harvestにラズパイのセンシングデータを送信して、そしてLagoonで表示してみる

今回は、実際にラズパイに取り付けたセンサーから取得したデータをSORACOM Harvestに送信してデータを蓄積したいと思います。

そして、そのデータをSORACOM Lagoonで参照したいと思います。

テストコードをまとめる

それぞれのセンサーのテストの際に作成したjupyter notebookのソースコードを一つにまとめます。

それぞれのテストの際のコードの詳細は、DHT22LM393GY-30のそれぞれを参照してください。

まずは、必要パッケージのインポートをまとめます。

import time
import os

import RPi.GPIO as GPIO

import smbus2 as sambas

import Adafruit_DHT as DHT
import datetime

import requests
import json

次に、土壌水分量を取得する関数を定義します。

def readadc(adcnum, clockpin, mosipin, misopin, cspin):
    if ((adcnum > 7) or (adcnum < 0)):
        return -1
    GPIO.output(cspin, True)


    GPIO.output(clockpin, False)  # start clock low
    GPIO.output(cspin, False)   # bring CS low


    commandout = adcnum
    commandout |= 0x18  # start bit + single-ended bit
    commandout <<= 3  # we only need to send 5 bits here
    for i in range(5):
        if (commandout & 0x80):
            GPIO.output(mosipin, True)
        else:
            GPIO.output(mosipin, False)
        commandout <<= 1
        GPIO.output(clockpin, True)
        GPIO.output(clockpin, False)


    adcout = 0
    # read in one empty bit, one null bit and 10 ADC bits
    for i in range(12):
        GPIO.output(clockpin, True)
        GPIO.output(clockpin, False)
        adcout <<= 1
        if (GPIO.input(misopin)):
            adcout |= 0x1


    GPIO.output(cspin, True)


    adcout >>= 1     # first bit is 'null' so drop it
    return adcout

土壌水分量センサー値取得で使用するパラメータおよびGPIOを初期化します。

GPIO.setmode(GPIO.BCM)


SPICLK = 11
SPIMISO = 9
SPIMOSI = 10
SPICS = 22


# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)


# adc #0
adc_pin = 0;

温湿度センサー値取得で使用するパラメータを初期化します。

SENSOR_TYPE = DHT.DHT22


DHT_GPIO = 4
INTERVAL = 5

日照センサー値取得で使用するパラメータを初期化します。

bus = sambas.SMBus(1)
addr = 0x23

全ての初期化が終わったので、実際にセンサーからそれぞれの値を取得して、SORACOM HarvestにPOSTします。POSTは3600秒に1回しています。

try:
    while True:
        h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)


        # read the analog pin
        moisture = readadc(adc_pin, SPICLK, SPIMOSI, SPIMISO, SPICS)
                
        luxRead = bus.read_i2c_block_data(addr, 0x11, 4)
        
        try:
            data = {'temp': t, 'humid': h, "lux": luxRead[1]* 10, "moist" : moisture}
            response = requests.post(
                    'http://harvest.soracom.io',
                    json.dumps(data),
                    headers={'Content-Type': 'application/json'})


            print("\r" +  "{0:%Y-%m-%d %H:%M:%S}".format(datetime.datetime.now()) +  " 温度:{0:0.1f} ℃". format(t) + " 湿度:{0:0.1f} %".format(h) + " 照度:" + str(luxRead[1]* 10) + " 水分量:{0}  ".format(moisture), end='')
            time.sleep(3600)
        except KeyboardInterrupt:
            print("interrupt")    
            break
        except:
                    print("request error")
                    continue
except KeyboardInterrupt:
    print("interrupt")    

データの送信は、以下の部分でやっています。それぞれの値のマップを作成し、requestsのpostでharvest.soracom.ioにポストしています。

            data = {'temp': t, 'humid': h, "lux": luxRead[1]* 10, "moist" : moisture}
            response = requests.post(
                    'http://harvest.soracom.io',
                    json.dumps(data),
                    headers={'Content-Type': 'application/json'})

ポストの際、データはJsonに変換しています。たったこれだけでHarvestに値が送信できます。

KeyboardInterruptされたら、GPIOをクリーンアップします。

GPIO.cleanup()

これで、ほぼ1時間ごとに処理が実行され、Harvestに値が送信されます。

SORACOM Harvestでデータを確認

実際に、SORACOM Harvestにデータが送信されているかを参照してみます。

SORACOMユーザーコンソールにログインして、「操作」ー「データの確認」を選択します。

以下は、一晩動作させてみた結果です。きちんと値がJson形式で保存されています。

引用元:SORACOMユーザーコンソールのデータ確認画面

折れ線グラフはこんな感じです。

夜明けとともに照度が上がってますね。そして、土壌水分量も少しだけ減ってきています。ただこのグラフだとY軸が全値で共通なのでみにくいです。

SORACOMの機能を調査した時に、SORACOM LagoonというHarvestの見える化ツールがあったことを思い出しましたので、それを試してみます。

SORACOM Lagoonを試す

SORACOM Lagoonに行くには、SORACOMユーザーコンソールのMenuから「データ収集・蓄積・可視化」を選択します。

引用元:SORACOMユーザーコンソール

さらにそのメニューから「SORACOM Lagoon」を選択します。すると以下のような画面に遷移するので、「SORACOM Lagoonの利用を開始する」をクリックします。

引用元:SORACOMユーザーコンソール

プランの選択画面が表示されるので、今回はFreeを選択します。

引用元:SORACOMユーザーコンソール

パスワードの入力を求められるので、パスワードを入力して「利用開始」をクリックします。「SORACOM Lagoon コンソールにアクセス」というところをクリックすると、Lagoonへのログインが求められるので、先ほど入力したパスワードでログインすると、下のような画面が表示されます。

引用元:SORACOM Lagoonコンソール

何やらよくわかりませんが、とりあえず「+」をクリックしてみます。するとメニューが出てくるので、「ダッシュボード」を選択します。

引用元:SORACOM Lagoonコンソール

ダッシュボードに色々と設定ができるんですね。今回はセンサーの値をグラフ表示したいので、「Graph」をクリックします。

「Panel Title」から「編集」を選ぶと、各種設定ができる画面になります。下記のようにクエリを指定すると、Tempつまり気温だけのグラフが表示できます。

引用元:SORACOM Lagoonコンソール

この調子で色々とグラフをダッシュボードに追加してみます。

引用元:SORACOM Lagoonコンソール

おおー!それっぽい。

これ、色変えれないのかなぁ。探してみたけど見当たらないのでググってみます。

ここに公式のパネルの作り方の説明が載ってました。

表示タブの「系列のオーバーライド」から変更するそうです。

オーバーライドを追加して、そのColorを選択したら変更できました。

引用元:SORACOM Lagoonコンソール

この調子で別のグラフも色などを変えると・・・

引用元:SORACOM Lagoonコンソール

こんな感じになりました。ウンウン、いい感じです。

おわりに

SORACOM Lagoonの可視化ツールは、簡易的な設定から、JSONやクエリを使ってのマニアックな設定までを網羅したツールでした。

自由度も高く、さんぷりにあるようにグラフに文字を載せたり、ヒートマップを描いたりと色々できそうでした。

現在要件だと、SORACOMのサービスで十分まかなえています。今後、センシングデータを使ったAI分析とかをするときは、クラウド等の利用が必要になってくるのではないかと思います。そのあたりもSORACOMさんのサービスでできるといいですね。

コメント

タイトルとURLをコピーしました