ラズパイとconect+をWebAPIでつなげてみた

[conect+](https://www.conect.plus/)というIoTデータを可視化するツールが使いやすそうだったので、試しに使ってみることにしました。
![IMG_0554 - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/b22939b2-e745-f667-a305-375ddd013697.png)

# conect+とは
[conect+](https://www.conect.plus/)は、IoTデータの表示、デバイス制御をするアプリケーションを簡単操作で作成できる可視化ツールです。
月額 9,980円の[conect+ Studio](https://www.conect.plus/studio)と、無料から使える[conect+ Lite](https://www.conect.plus/lite)があります。
今回は無料のconect+で可視化してみることにしました。
（conect+ Studioとconect+ Liteのサービスの差分はリンク先にてご確認ください）

#構成
![cl2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/8042e0a3-81ec-abd4-8f0f-90bba53bda2d.png)
構成は上図の通り。
Raspberry PiにつないだDHT11（温湿度センサー）のセンシングデータをWebAPIでconect+ Liteに接続します。

#conect+ Liteでの設定

conect+ Liteにログインし、クリエイト画面にてプロジェクトの編集をします。
![clcreate.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/9869d750-433c-bef4-0e61-10e131df6dac.png)

###基本情報の設定

基本情報タブで、接続方法（WebAPI）と製品名（rasp_dht11とします）を設定します。
![cl1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/8e0fb589-31de-565a-ea1c-63477f47ca57.png)

画像タブで、アイコン画像とサムネイル画像を設定します。
![cl3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/425ae25f-c836-6bc4-6cf4-ea141eb12cef.png)

センサータブで、センサー名称（気温、湿度）、キー（temperature、humidity）を設定します。
![cl4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/40fd5fcd-5188-3505-148f-8a0248ae947c.png)

###アプリウィジェットの設定
用意されたウィジェットからアプリの画面をレイアウトします。
![widget.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/6aaf2e01-576c-3231-f175-d2a5226d8819.png)

###WebAPIの設定
APIキー生成ボタンを押すと、APIキーが生成されます。APIキーはRaspberry Piのスクリプトで使用します。
![key.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/5d85f42d-2a59-4721-f114-6de7fce7a7d4.png)


#Raspberry Piの設定

###DHT11とRaspberry Piの接続
はじめに、DHT温湿度センサー（DHT11）とRaspberry Piを以下の通りに接続します。

| DHT11 | Raspberry Pi |
|:------------:|:------------:|
| VCC       | 3.3V        | 
| GND     | GND      | 
| DATA       | GPIO4        |


###スクリプトの作成
DHT11のセンサデータを取得するPythonのライブラリをGitHubからクローンします。

```terminal
git clone https://github.com/szazo/DHT11_python.git
```

クローンが完了すると「DHT11_python」というフォルダが作成されます。
そのフォルダにある「dht11_example.py」というサンプルスクリプトで温度、湿度データを取得します。
デフォルトでは、Pin番号が14番になっているため、4番に修正します。

```dht11_example.py
import RPi.GPIO as GPIO
import dht11
import time
import datetime

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

# read data using pin 4
instance = dht11.DHT11(pin=4) #pin番号を4(GPIO4)に修正

while True:
    result = instance.read()
    if result.is_valid():
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)
        print("Humidity: %d %%" % result.humidity)

    time.sleep(1)
```
このサンプルスクリプトに、conect+にデータ保存処理を追加します。

```dht11_cp.py
import RPi.GPIO as GPIO
import dht11
import pprint
import json
import requests
from pytz import timezone
from datetime import datetime

# json.dumps
def post_data(api_key,device_id,data_key,sensing_at,value):
    url = "https://api.conect.plus/v1/(APIキー)/data" %{'api_key':api_key}
    response = requests.post(
        url,
        json.dumps({
            'deviceUuid' : device_id,
            'key' : data_key,
            'sensingAt' : sensing_at,
            'value1' : value}),
        headers = {'Content-Type' : 'application/json'})
    pprint.pprint(response.json())

# now
def now_utc_str():
    return datetime.now(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")

# initialize GPIO
GPIO.setwarnings(False) #警告を無視する
GPIO.setmode(GPIO.BCM) #GPIOを役割ピン番号で指定する
GPIO.cleanup() #スクリプト終了時にGPIO設定をリセットする

API_KEY = '(APIキー)'
DEVICE_ID =  'SINWSSS'
DATA_KEY_TEMPERATURE = 'temperature'
DATA_KEY_HUMIDITY = 'humidity'

# read data using pin 4
instance = dht11.DHT11(pin=4) #GPIO4のデータを読み込む

while True:
    result = instance.read()
    if result.is_valid():
        break #有効なデータが取得できたら終了（無効なら繰り返し）

temp = result.temperature
hum = result.humidity
print(temp,hum)

# post data
now = now_utc_str()
post_data(API_KEY,DEVICE_ID,DATA_KEY_TEMPERATURE,now,temp)
post_data(API_KEY,DEVICE_ID,DATA_KEY_HUMIDITY,now,hum)
```
※(APIキー)には、conect+で発行したAPIキーを入力してください。

dht11_cp.pyを実行し、以下のようなレスポンスが返ってきたら成功です。

```
$ python dht11_cp.py
23 36　
{'message': 'Success.', 'status': 'SUCCESS'}
{'message': 'Success.', 'status': 'SUCCESS'}
```

###conect+のデータ画面で確認
実行結果をconect+のデータ画面で、クラウド上にデータが保存されているかどうか確認してみましょう。
![cldata.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/65d3159e-3103-0129-dc34-c8a8c938a467.png)

###定期実行の設定
Raspberry Piを操作しなくても、定期的にスクリプトを実行するように、Raspbianのcronという機能を使います。
ここでは1時間に一度、dht11_cp.pyを実行するようにします。

LX Terminalで以下のコマンドを実行します。

```
crontab -e
```
「Select an editor」と表示されたら、「2」の/bin/nanoを選択します。
「nano」が開いたら、カーソルをがメインの一番下に移動し、以下のコマンドを入力します。


```
00 * * * * /usr/bin/python3 /home/pi/DHT11_python/dht11_cp.py
```
* Ctrl + X で終了します。
* 「変更されたバッファを保存しますか？」と表示されたら、「Y」キーを押します。
* 「書き込むファイル～」と表示されたら、「Enter」キーを押します。
* 以下の表示がされたら書き込み終了です。

```
crontab: installing new crontab
```
これで毎時00分に気温、湿度のデータが保存されます。

#アプリの設定
最後にアプリの設定をしましょう。

アプリをダウンロードし、起動します。
↓
画面右上の「＋」をタップ
![IMG_0549 - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/0973692b-eaf3-21c4-8fc5-7dc5acc394ad.png)
↓
表示させたいプロジェクトを選択して追加
![IMG_0551.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/657537e3-534d-1778-284d-c0a14b6b0e7d.png)
↓
追加したデバイスを紐付け
![IMG_0552.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/804f097a-380e-dede-8616-51dd79e4f7f1.png)
![IMG_0553.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/04596828-584d-8c7e-a244-87e2aa127579.png)
↓
データを取得すると、センシングしたデータが表示されます。
![IMG_0554.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353289/18449f04-939d-a1c7-d252-41b52552e673.png)

その後は、新しいセンシングデータを受信する度に（1時間毎）更新されます。

以上。