kintoneを使ってIoTデバイスのデータを収集する（温度編）

# はじめに

サイボウズさんの中の人から「使ってみられませんか？」とお誘いを受け、試しに使ってみたので知見を共有します。

とても簡単にできたので、自社のIoT関連サービスに利用することを視野に入れつつ、顧客にも紹介してみたいと思っているところです。

[kintone](https://kintone.cybozu.co.jp/)

- 収集したデータでグラフを描画してみた
![スクリーンショット 2018-01-11 9.18.10.png](https://qiita-image-store.s3.amazonaws.com/0/114240/cde4a511-cd56-25e5-3967-4eb6298dfdf2.png)


# 材料

- [Raspberry PI 3 model B](http://amzn.to/2D22NnQ)
- [温湿度センサ(DTH11)](http://amzn.to/2mjcSCL)
- [kintone](https://kintone.cybozu.co.jp/)

# Raspberry PIのセットアップ

「raspberry セットアップ」で検索すると山ほど情報が出てくるので、そちらに任せることにして、ここでは割愛します(^_^;)

# 温湿度センサの接続

これもたくさん情報があるので、ここでは割愛(^_^;)
ちなみに、検索すると以下のサイトが見つかりました。

[Raspberry Piと温度・湿度・光センサーでオフィスの状況を可視化する](http://tech.toreta.in/entry/2016/02/15/153203)

# センサ情報の取得

前述の記事とは別のライブラリを使ってデータを取得します。

以下のURLからライブラリを取得。

[szazo/DHT11_Python](https://github.com/szazo/DHT11_Python)

ラズパイにログインして、以下のコマンドを実行。

```
$ git clone https://github.com/szazo/DHT11_Python.git
```

ダウンロードしたライブラリから「dht11.py」を取り出し、以下のスクリプトと同じ場所に保存。

```py3:sample.py
import RPi.GPIO as GPIO
import dht11

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

# read data using pin 4
instance = dht11.DHT11(pin = 4)
result = instance.read()

if result.is_valid():
    print("Temperature: %d C" % result.temperature)
    print("Humidity: %d %%" % result.humidity)
else:
    print("Error: %d" % result.error_code)
```

以下のコマンドを実行してデータを計測できていたら接続成功！

```
$ python sample.py
```

# kintoneのアプリ作成

ログインして、ポータルの「アプリ」右側にある「+」をクリック。

![スクリーンショット 2018-01-11 10.33.30.png](https://qiita-image-store.s3.amazonaws.com/0/114240/58041125-8db9-5569-e166-60d49f12f0d5.png)

「あたらしくアプリをつくる」から「はじめから作成」をクリック。

![スクリーンショット 2018-01-11 10.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/114240/c4e0e817-10d5-8fb8-e302-353c586a1e4a.png)

作成画面で、「日時」と「数値」のフォームをドラッグ。

![スクリーンショット 2018-01-11 10.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/114240/1131018c-fe5c-3a0d-923f-a45c1eb0f652.png)

フォームの完成図。

![スクリーンショット 2018-01-11 10.34.18.png](https://qiita-image-store.s3.amazonaws.com/0/114240/c025c87c-3a58-6dc1-eb8d-b616aea39d36.png)

数値の「設定」を変更。

![スクリーンショット 2018-01-11 10.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/114240/e2a8e09b-9a13-48db-6ba0-89f09c75ea1b.png)

![スクリーンショット 2018-01-11 10.34.48.png](https://qiita-image-store.s3.amazonaws.com/0/114240/8677f2a2-0ffb-fa0b-3d7c-21f2d29a960a.png)

フィールドコードを「temp」にして保存。

![スクリーンショット 2018-01-11 10.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/114240/b43cc704-0766-c710-643c-59b34e94d0df.png)

アプリ名を「温度監視」に変更して「アプリを公開」をクリック。

# APIトークンの作成

「温度監視」の設定変更画面を表示させる。

![スクリーンショット 2018-01-11 10.35.51.png](https://qiita-image-store.s3.amazonaws.com/0/114240/bbaae03a-67c1-23cb-7316-937c9087e257.png)

「APIトークン」をクリックし、「生成する」ボタンをクリック。

![スクリーンショット 2018-01-11 10.36.09.png](https://qiita-image-store.s3.amazonaws.com/0/114240/25392ee6-d1ec-b144-a8b9-4ba213a1bf42.png)

スクリーンショットでは表示していませんが、APIトークンの列に英数の文字列が表示されますので、こちらをどこかに転記し、アクセス権を「レコード追加」のみにして「保存」をクリック。最後に『アプリを更新』をクリックし、設定を反映させます。

# スクリプトの修正

以下のとおり修正します。

```py3:sample.py
#!/usr/bin/env python3

import RPi.GPIO as GPIO
import dht11
import requests

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

# read data using pin 4
instance = dht11.DHT11(pin = 4)
result = instance.read()

if result.is_valid():
    
    print("Temperature: %d C" % result.temperature)
    print("Humidity: %d %%" % result.humidity)
    
    url = "https://xxxx.cybozu.com:443" # アプリのURL
    appId = "1" # アプリID
    apiToken = "xxxxxxxxxxxxxxxxxxx" # APIトークン

    record = {'temp':{'value' : str(value)}}
    data   = {'app':appId,'record':record}
    
    headers = {"X-Cybozu-API-Token": apiToken, "Content-Type" : "application/json"}
    resp = requests.post(url+'/k/v1/record.json',json = data,headers = headers)
    
    print(resp)
    
else:
    print("Error: %d" % result.error_code)
```

以下のコマンドで実行し、データが追加されれば成功。

```
$ python sample.py
```

# 自動起動

スクリプトに実行権限を付与し、cronに登録する。

```
$ chmod a+x sample.py
$ crontab -e
```

5分ごとにデータを送信するため、以下の行を追加。

```
*/5 * * * * /home/pi/sample.py
```

完成！