SORACOM Harvestと3GPiでセンサーデータ可視化

# 始めに
前回までのテストで温度情報は取れるようになったので、これをクラウドに上げたいと思います。
使用するのはSORACOM社のAir SIMとメカトラックス社製3G通信基盤の3GPiです。
Air SIMでは、アップロードした情報を簡単にグラフ化するSORACOM Harvestというサービスを提供しています。
そして3GPiはSIMを挿すだけで3G回線に接続できてしまうという優れもの。
今回メカトラックスさんから3GPiを提供頂くことが出来ました。

# Air SIM準備
まずはSORACOM社のAir SIMを用意します。
SIMの用意については別途記事を設けたいと思います。
[こちら](https://qiita.com/twinoze/private/60b9d2520c852df89285)を参照ください。

# 3GPiパッケージ
3GPiには下記内容が同梱されていました。
まずはパッケージ
![CIMG5662A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/fa9df09b-a433-688c-b9c5-8a5f0b139f2d.png)
開けたらこんな感じ
![CIMG5663C.png](https://qiita-image-store.s3.amazonaws.com/0/248779/c6aaab79-6f2a-2433-3946-232a3467a994.png)

箱の左側に見えるカードにログイン用のIDとパスワードが書かれています。
起動後のRasbianへのログインで使用します。

3GPi本体です
![CIMG5666B.png](https://qiita-image-store.s3.amazonaws.com/0/248779/561cf286-c50a-0453-bc58-db35ab03bbb8.png)

付属品です。
![CIMG5664A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/94b25e9e-d0a4-9156-e2b6-754488e35365.png)
左が電源用のACアダプタ
上段左にあるのがACアダプタと3GPi本体接続用ケーブル
その右が3GPi本体とラズパイ本体を接続するためのUSBケーブル
中段中央がスペーサーおよびネジ・ナットの小袋。
その右がマイクロSDカード、カスタムされたRaspbianがセットアップされています。
そして右下の長い棒がアンテナです。

3G回線接続に必要な物は一通り入っています。
足りないのはSIMとラズパイ本体のみです。
SDカードも入ってる！

# 3GPiをラズパイに接続
3GPiを手元のラズパイに接続していきます。
まずは3GPi付属のスペーサ4個を、付属のナットを使用してラズパイ本体に固定。
![CIMG5673A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/527a3bbd-b0c5-c6de-6ca4-f93969996411.png)

次に3GPiをラズパイに接続します。GPIOピンがずれない様に注意。
（ピンがずれていた場合、信号が正しく取れない事はもちろん、ラズパイや3GPiを故障させる可能性があります）
そして付属のネジ４本で3GPiをスペーサーに固定します。
![CIMG5689B.png](https://qiita-image-store.s3.amazonaws.com/0/248779/2bd22d02-f17a-587a-1703-428129052848.png)

これで、ラズパイ本体と3GPiがしっかりと固定されます。
3GPiのミニUSB端子とラズパイのUSB端子を接続します。
これで3GPiがラズパイのUSBデバイスとして認識されます。
さらに、3GPiの3Gアンテナコネクタにアンテナを接続します。
画像にあるもう一つのアンテナ用コネクタはGPS用です。基盤にも記載されていますので、間違わない様に注意してください。
![CIMG5692B.png](https://qiita-image-store.s3.amazonaws.com/0/248779/4a8e62d0-6e35-4abd-c0c2-13a8d67888a9.png)

3GPiに同梱のSDカードをラズパイに挿入。（カスタムRasbianがセットアップされています）
SORACOMのAir SIMを3GPiに挿入します。
![CIMG5690B.png](https://qiita-image-store.s3.amazonaws.com/0/248779/7a280cf9-02b0-8ede-5c87-7733d9056eba.png)
SIMはホルダをスライドさせて開きます。ホルダ側にSIMを装着後閉じてください。

最後に3GPiのDCジャックに3GPi同梱のACアダプタを接続し、電源を投入します。
3GPi付属のACアダプタは丸端子なので、ラズパイ用の物と間違う危険はない様です。

# 電源投入
3GPiにはラズパイへの給電機能があるそうです。
3GPiの電源を入れるとピンヘッダ経由でラズパイの電源も入りRaspbianが起動します。

CUI(コマンド入力のみの)画面が表示されます。
![CIMG5672A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/0ca5328e-6d5d-2297-b468-f9cdc722da86.png)
ここで、3GPiに入っていたカードに書かれているIDとパスワードでログインします。
ログイン後、コマンド

```
$startx
```
でX-Windowを起動することが出来ます。
こちらの方が設定作業などはやりやすいと思います。

# IPアドレス確認
ローカルのIPアドレス確認
![Screenshot_20180503_220130A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/a4167a87-8cd4-af77-cce0-26785397c8d8.png)
ppp0 というインターフェース名の部分が3GPiのIPアドレスその他の情報です。

グローバルIPの確認
![Screenshot_20180503_220156A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/0ca304d8-296d-8f68-232f-592387b299ba.png)
こちらは3GPiのグローバルのIPアドレスです。
何れも、SORACOM AirのSIMが「使用中」の状態になっていなければ正しく表示されません。
SORACOM Airの詳細は[こちらの記事](https://qiita.com/twinoze/private/60b9d2520c852df89285)を参照いただくとして、参考画像を上げておきます。
![SORACOM_001A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/eb515d4e-a548-9355-d713-6cdaf5ee7bfd.png)

# センサー回路
今回は以前のDS18B20を使用した回路をそのまま流用します。
回路図は割愛しますので、[以前の記事](https://qiita.com/twinoze/items/c346387d8b072a2f9b61)を参照下さい。
1-Wireを使用するための設定も行う必要がありますので合わせて参考にして下さい。

# プログラム
以前のDS18B20の回路そのままのため、プログラムもそれを活用しています。
加えてSORACOM Harvestにデータをアップロードするコードが追加されています。
以下使用するコードの全てを掲載しています。

```python:ds18b20_3gpi_main.py
#!/usr/bin/python
# coding: utf-8
import time
from ds18b20_sub import get_temp

print ("DS18B20 to SORACOM Harvest over 3GPi test Start!")
try:
    while 1:
        temp0=get_temp(0)
        temp1=get_temp(1)       
        print('temp0:{0:3.3f} degC\ttemp1:{1:3.3f} degC'.format(temp0, temp1))
        put_temp(temp0, temp1)    # 今回追加したコード!!
        time.sleep(30)            # 更新周期を1秒から30秒に変更しています。
except:
    pass
print ("DS18B20 to SORACOM Harvest over 3GPi test End!")
```

```python:ds18b20_3gpi_sub.py
#!/usr/bin/python
# coding: utf-8
# モジュールをimport
import os
import glob
import datetime

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
path = '/sys/bus/w1/devices/'

# センサー入力
def get_w1_slave(id):
    device = glob.glob(path + '28*')[id] + '/w1_slave'
    file = open(device, 'r')
    lines = file.readlines()
    file.close()
    return lines

# 温度データ
def get_temp(id):
    cnt = 0
    lines = get_w1_slave(id)
    while lines[0].strip()[-3:] != 'YES':
        sleep(0.1)
        if cnt > 3 :
            return -1
        cnt = cnt + 1
        lines = get_w1_slave(id)
    pos = lines[1].find('t=')
    if pos != -1:
        strtemp = lines[1][pos + 2:]
        temp_c = float(strtemp) / 1000.0
        return temp_c

# SORACOM Harvestへアップロード
def put_temp(temp0, temp1):
    json = {"temp0": temp0, "temp1": temp1}
    sndjson = json.dumps(json_data)
    # SORACOM Harvestに送信
    print requests.post('http://harvest.soracom.io', data=sndjson, headers={'Content-Type': 'application/json'})
```

# SORACOM Harvest有効化
SORACOM Harvestでは、使用時のみ機能有効／無効を切り替えができます。
必要な時だけ有効にすることで、費用を抑制することが出来るようです。
（こちらも、詳細は[別記事](https://qiita.com/twinoze/private/60b9d2520c852df89285)に譲ります）

で、プログラムを動かしたのですが、ここで躓く。。。
上記プログラムの

```
def put_temp(temp0, temp1):
    ...
    print requests.post('http://harvest.soracom.io', data=sndjson, headers={'Content-Type': 
```

の部分で止まりエラーとなりました。
大分悩みました。眠たくなっちゃったので、ちょいと一晩寝かすことにしました。
じっくり味がしみ込んで・・・おいしくなーれ(;^_^A

たーらーらーらーらったったー。（DQの音・・・のつもり）
で、仕切り直したら無事解決！
どうやらラズパイのWiFiを有効にしていたのがいけなかった様です。
と言うのも、こちらをご覧ください。
![Screenshot_20180507_220644A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/5b392658-d663-3308-91e4-18ee88cf7264.png)
上段はWiFi有効時、下段は無効時。
そして Metric で示される値が小さい方のGatewayが優先されるとの事。
この為WiFi有効時にはppp0よりもwlan0の回線が優先された様です。

Metricについて変更する事もできる様です。
メンドー避けるなら、3G回線を使用するときは皆様、WiFi使っちゃダメな様です。
メンドーwelcomな場合は、どうぞご注意下さい。
という訳で、しっかりデータが上がるようになりました。

# SORACOM Harvestグラフ確認
一定時間データをアップロードした結果のグラフです。
（作業の邪魔にならずに一定の温度が安定して測れる気温と違うもの・・・）
参考までに私のひざ裏の温度を測ってみました(^^ゞ
ここで使用しているセンサーでは、温度がある程度安定するために
相当な時間がかかりました。
2次曲線のグラフになってますね。
赤い線が室温から36℃まで上昇するのに20分近くかかりました(;´･ω･)
![SORACOM_030A.png](https://qiita-image-store.s3.amazonaws.com/0/248779/ac9ab319-0c98-6695-e14d-7878c4907f2d.png)
（青い線は、このスクショをとる前にテストしていた方の温度センサー。）
日時に関する情報はSORACOM Harvestが自動でつけてくれます。
グラフに関してもデータを上げるだけで自動で作ってくれました。

# 感想
SORACOM Airの準備には若干戸惑う所もありましたが、3GPiに関してはあまり戸惑う所がありませんでした。
私がWiFiにつないで遊んだりしなければ、まったく迷わなかっただろうと思います。

3GPiにはGPS機能もあるため、いつかこちらも試してみたいと思います。
では今回はここまでとします。