RaspberryPiのCPUクロックや温度をSORACOM Harvestで可視化する

#**概要**
本コンテンツは、[**JAWS DAYS 2017**](http://jawsdays2017.jaws-ug.jp)の[**IoTハンズオン**](https://jaws-days.doorkeeper.jp/events/57016)向けに作成したものです。
RaspberryPiに3Gドングルを接続し、[SORACOM Harvest](https://soracom.jp/services/harvest/)でRaspberryPiのCPU温度やクロックの変化を可視化します。RaspberryPi以外にセンサー類を必要としませんので、手軽に試すことができます。
![SORACOM ユーザーコンソール 2017-01-29 13-11-27b.png](https://qiita-image-store.s3.amazonaws.com/0/80392/e7966569-876c-02b2-45cd-bff6149fbbd1.png)


##[SORACOM Harvest](https://soracom.jp/services/harvest/)とは
SORACOM Harvest(以下、Harvest) とは、IoT デバイスからのデータ収集および可視化サービスです。SORACOM Air が提供するセルラー通信を使って、IoT デバイスのセンサーデータ等を手間なくクラウドにアップロードすることができます。アップロードされたデータは、SORACOMプラットフォーム上に 40 日間に渡って保存されます。お客様は、保存されたデータを SORACOM のユーザーコンソールでグラフ化することができます。([公式サイト](https://dev.soracom.io/jp/start/harvest)より引用)
![Harvest](https://dev.soracom.io/jp/img/gs_harvest/fig_harvest.png)
[**SORACOM Harvest Getting Started**](https://dev.soracom.io/jp/start/harvest)
###使い方は簡単、HTTP(またはUDP/TCP)でPOSTするだけ
IoTデバイスからのデータをクラウドにアップロードする場合、通常は暗号化して認証情報をつける必要があります。SORACOM Harvestの場合、SORACOMのエンドポイントにJSON形式のデータをcurlコマンドなどでHTTP POSTするだけと非常にお手軽です。SIM自体が認証キーとなるので認証情報は不要で、暗号化しないためCPUリソースをあまり消費しません。しかもキャリア閉域網内で処理されるため、非常にセキュアです。当然ながら、SORACOM Airで接続していない場合はHarvestを利用することはできません。

#**必要な機材**
* PC
* RaspberryPi 2または3
* micro USB電源
* micro SDカード (8GB以上)
* SORACOM Air SIM
* 3G USBドングル (本手順ではFS01BUまたはAK-020を使用)

#**前提条件**
* SORACOMアカウントをもっていること。アカウント開設手順は[**こちら**](https://soracom.jp/start/)
* RaspberryPiに[Raspbian](https://www.raspberrypi.org/downloads/raspbian/)がインストール済みで、PCからSSHでログインまたはHDMI接続のモニタでターミナル操作ができること。手順は[**こちら**](http://qiita.com/Ichiro_Tsuji/items/e7ff30f0ec0b7d0ceed5)。Raspbianは[**Release date:2017-01-11**]で動作確認しています

#**[ToDo 1] RaspberryPiをSORACOM Airでインターネット接続する**
RaspberryPiにSORACOM Air SIMの入った3G USBドングルを接続し、インターネットに接続します。手順は**SORACOM公式ハンズオン用テキスト**を参照します。テキスト内の1章と3章のみ使用しますので注意して下さい。
[**1章 ユーザーコンソールを使用してAir SIMを管理する**](https://github.com/soracom/handson/blob/master/setup/setup.md#1-0)
[**3章 Air SIMを使って、インターネットに接続する**](https://github.com/soracom/handson/blob/master/setup/setup.md#3-0)
※`connect_air.sh`を実行してインターネット接続が完了したらその画面はそのままにし、別ウインドウでSSH接続して続きを進めてください。

##3章中の`$ curl ifconfig.io`でIPv6アドレスが返ってきたら
以下のコマンドを試してみてください。

```bash
$ curl globalip.me
54.250.252.xx (IPアドレスが表示されます)
```

##アップデートとvimのインストール
SORACOMによるインターネット接続が確立したら、RaspberryPiのターミナル画面で下記を実行します。

```bash
$ sudo apt-get update
$ sudo apt-get install -y vim
```

#**[ToDo 2] SORACOMユーザーコンソールでHarvestの設定をする**
グループを作成してHarvest機能をONに設定し、SIMをグループに追加します。[**SORACOM Harvestは有料サービス**](https://soracom.jp/services/harvest/price/)です。利用していなくても毎日課金されますので、使わなくなったら機能をOFFにしましょう。

* [SORACOMユーザーコンソール](https://console.soracom.io)にログインする
* 右上のMENUボタン -> [SIMグループ]の順にクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-10 21-38-32.png](https://qiita-image-store.s3.amazonaws.com/0/80392/fe4f254d-4fad-41cf-5420-a42f730aea8d.png)<BR><BR>
* [＋追加]をクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 21-56-46.png](https://qiita-image-store.s3.amazonaws.com/0/80392/9e76302c-ab48-e163-0d29-8c164ae4fde6.png)<BR><BR>
* 任意のグループ名を入力し[グループ作成]をクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 21-57-30.png](https://qiita-image-store.s3.amazonaws.com/0/80392/f1f999fd-7730-b9c9-5b3c-d577a63f6dda.png)<BR><BR>
* 作成したグループをクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 21-58-54.png](https://qiita-image-store.s3.amazonaws.com/0/80392/c0016d48-15c4-51cd-1f5d-4afe2178b993.png)<BR><BR>
* [SORACOM Harvest 設定]を展開し[ON]に変更する
* [保存]をクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 22-00-00.png](https://qiita-image-store.s3.amazonaws.com/0/80392/6c6efd60-65b8-8b56-96ba-8a731f46c506.png)<BR><BR>
* 注意を読み[OK]をクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 22-02-46.png](https://qiita-image-store.s3.amazonaws.com/0/80392/9e21086a-b693-57f2-93f5-2f267311795f.png)<BR><BR>
* 右上のMENUボタン -> [SIM 管理]の順にクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-10 21-47-03.png](https://qiita-image-store.s3.amazonaws.com/0/80392/6c88f4c6-7871-eceb-e7cf-1e0d4735f309.png)
<BR><BR>
* 使用中のSIMを選択し、[操作] -> [所属グループ変更]の順にクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 22-03-53.png](https://qiita-image-store.s3.amazonaws.com/0/80392/5dbd1a12-eaa5-5a08-35b7-20681c18d49c.png)<BR><BR>
* 先ほど作成したグループを選択し[グループ変更]をクリックする<BR>
![SORACOM ユーザーコンソール 2017-02-04 22-06-23.png](https://qiita-image-store.s3.amazonaws.com/0/80392/0dc391a8-dc5c-f7b8-489b-dd3a18ee7eb1.png)<BR><BR>
* グループが変更されたことを確認する

#**[ToDo 3] RaspberryPiのCPU情報を表示させる**
RaspberryPiにはじめから入っているvcgencmdというコマンドを使ってCPUの情報を取得します。以下、RaspberryPiにSSH接続して実行して下さい。
##CPUクロックを取得
```bash
$ vcgencmd measure_clock arm
frequency(45)=600062000
```
##CPU温度を取得
```bash
$ vcgencmd measure_temp
temp=41.2'C
```
##CPU電圧を取得
```bash
$ vcgencmd measure_volts
volt=1.2000V
```

#**[ToDo 4] CPUクロック／温度のデータをSORACOM HarvestにPOSTする**
PythonでCPUクロック／温度のデータをSORACOM Harvestに3秒に1回POSTします。CPUクロックは数値が大きいので10M(10,000,000)で割った値を使用します。

```bash
$ vim cpu-harvest.py
```
```py:cpu-harvest.py
#coding: utf-8

import commands
import time
import json
import requests

try:
	while 1:
		# 開始時刻を記録
		start_time = time.time()
		# Raspbianの制御コマンド（vcgencmd）を実行
		# CPU温度を取得
		temp = commands.getoutput("vcgencmd measure_temp").split('=')
		# CPUクロックを取得
		clock = commands.getoutput("vcgencmd measure_clock arm").split('=')
		# 温度とクロックを表示
		print temp[1] ,
		print clock[1]
		# 数値型に変換(温度とクロックのレンジを合わせるために、クロックは10Mで割る)
		temp_n = float(temp[1][0:-2])
		clock_n = int(clock[1]) / 10000000
		# JSONを整形
		json_data = {"clock/10M": clock_n, "temp": temp_n}
		encode_json_data = json.dumps(json_data)
		# SORACOM Harvestに送信
		print requests.post('http://harvest.soracom.io', data=encode_json_data, headers={'Content-Type': 'application/json'})
		# 終了時刻を記録
		stop_time = time.time()
		# (3 - 送信にかかった時間)秒待ってループ
		wait = start_time - stop_time + 3
		if wait > 0:
			time.sleep(wait)
# キーボード例外を検出
except KeyboardInterrupt:
	# 何も処理をしない
	pass
```
Pythonコードを実行します。停止する場合は**`ctrl + C`**。
`<Response [201]>`が表示されない場合は、「[[ToDo 2] SORACOMユーザーコンソールでHarvestの設定をする](http://qiita.com/Ichiro_Tsuji/items/1aeb8afd6d6fe4405722#todo-2-soracom%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7harvest%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B)」で設定が誤っていないか確認して下さい。

```
$ python cpu-harvest.py
43.3'C 900000000
<Response [201]>
42.8'C 900000000
<Response [201]>
42.2'C 600000000
<Response [201]>

```

#**[ToDo 5] SORACOM Harvestでグラフ表示させる**
* [SORACOMユーザーコンソール](https://console.soracom.io)にログインする
* 使用中のSIMを選択し、[操作] -> [データを確認]の順にクリックする<BR>
![SORACOM ユーザーコンソール 2017-03-30 01-06-17.png](https://qiita-image-store.s3.amazonaws.com/0/80392/e316f0dc-df8a-d87f-4799-0f8d9951447f.png)<BR><BR>
* 自動更新を[ON]に変更する<BR>
![SORACOM ユーザーコンソール 2017-03-30 01-09-47.png](https://qiita-image-store.s3.amazonaws.com/0/80392/674793f1-30cd-c397-8878-7619ea5d8885.png)<BR><BR>
* しばらく待つとグラフが表示される<BR>
![SORACOM ユーザーコンソール 2017-02-04 23-55-01.png](https://qiita-image-store.s3.amazonaws.com/0/80392/9a1f4e26-5035-21d0-2a15-000591689f66.png)<BR><BR>

#**[ToDo 6] UnixBenchを実行してCPUクロック／温度を変化させる**
UnixBenchというGoogleが配布しているベンチマークツールを実行することで、CPUに負荷をかけてクロックや温度を変化させることができます。**[ToDo 4]とは別のウインドウで実行**(ターミナルを複数立ち上げる)することで、グラフ表示を続けながらCPUに負荷をかけることができます。

##UnixBenchをダウンロードしてコンパイルする
```bash
$ wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz
$ tar zxvf UnixBench5.1.3.tgz
$ cd UnixBench
$ make
```
##UnixBenchを実行する
`-c 4`は4コアで実行の意味。

```bash
$ ./Run -c 4

   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

```
##SORACOM Harvestで変化を見る
![SORACOM ユーザーコンソール 2017-01-29 13-11-27.png](https://qiita-image-store.s3.amazonaws.com/0/80392/1753e2d0-396a-082f-5c3c-a9b41248b02e.png)

#**あとかたづけ**
##SORACOM Air SIMは使うけどHarvestは使わない
[ToDo 2]を参考に[SORACOM Harvest 設定]をOFFにしてください。
##SORACOM Air自体使わない
###利用中断
SIMを「利用中断中」状態にすると基本料金の課金が1日5円に減額されます。ただし、「利用中断中」状態への変更1回につきSIM 1枚あたり300円の設定変更料金が発生します。
###解約
解約するとそのSIMは一切利用できなくなりますが、料金はかからなくなります。
![SORACOM ユーザーコンソール 2017-03-02 23-18-52.png](https://qiita-image-store.s3.amazonaws.com/0/80392/524ca2b2-84f9-c8ee-2a8e-67d11764ae13.png)
![SORACOM ユーザーコンソール 2017-03-02 23-20-08.png](https://qiita-image-store.s3.amazonaws.com/0/80392/51f1901c-d458-c577-7eba-6b87ab2d608b.png)