温度センサーデータをSORACOM Harvestで可視化する

 引き続きIoTエンジニア養成読本のハンズオンの内容を実践中です。今度は温度センサーのデータを読み取って、そのデータをSORACOM Harvestへ送って可視化する処理をRubyで実装してみます。

gihyo.jp

温度センサーの接続

 まずは下記のように温度センサー(DS18B20)を接続します。温度センサーの3本の端子はそれぞれ用途が決まってるので、向きを間違えないように注意です。抵抗は4.7kΩのものを使っています。

f:id:akanuma-hiroaki:20170518013514p:plain:w300

Raspbianの設定

 次に温度センサーの情報を読み取れるようにRaspbianを設定します。まずは /boot/config.txt に下記差分の内容を追記します。gpioponは温度センサーをどのGPIOに接続するかの指定です。デフォルトが4とのことです。ちなみにここの数字を変えて該当するGPIOに接続を変更してみましたがうまくいかなかったので、変更する場合は他にも変更が必要なのかもしれません。

pi@raspberrypi:~ $ diff /boot/config.txt.20170513 /boot/config.txt
56a57,59
> 
> # Enable thermo sensor (DS18B20+)
> dtoverlay=w1-gpio-pullup,gpiopin=4

 そして /etc/modules にも起動時にモジュールが有効になるように下記差分の内容を追記します。

pi@raspberrypi:~ $ diff /etc/modules.20170513 /etc/modules
5c5,6
< 
---
> w1-gpio
> w1-therm

 設定を有効にするために再起動します。

pi@raspberrypi:~ $ sudo shutdown -r now

温度センサーの計測値を読み出してみる

 Rubyでの処理を実装する前に、まずは直接温度センサーの計測値を表示してみます。ここまでの設定がうまくいっていれば、温度センサーは /sys/bus/w1/devices/28-XXXXXXXXXXXX というディレクトリができ、温度センサーにアクセスできます。XXXXXXXXXXXX の部分は個体によって変わります。

pi@raspberrypi:~ $ ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 May 13 04:33 28-01162e298eee -> ../../../devices/w1_bus_master1/28-01162e298eee
lrwxrwxrwx 1 root root 0 May 13 04:33 w1_bus_master1 -> ../../../devices/w1_bus_master1
pi@raspberrypi:~ $ 

 計測値を表示するにはデバイスのファイルをcatで開きます。

pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-*/w1_slave
7e 01 4b 46 7f ff 0c 10 f9 : crc=f9 YES
7e 01 4b 46 7f ff 0c 10 f9 t=23875
pi@raspberrypi:~ $ 

 t=XXXXX の部分が温度データで、摂氏を1,000倍したものが表示されています。

定期的な温度測定&Harvestへの送信処理

 それではこの温度センサーのデータを定期的に読み出して、SORACOM Harvestへデータを送信する処理を書いてみます。

require 'bundler/setup'
require 'httpclient'
require 'logger'

SENSOR_FILE_PATH = "/sys/bus/w1/devices/28-*/w1_slave"
HARVEST_URL = 'http://harvest.soracom.io/'

logger = Logger.new('temperature.log')

interval = 60.0
unless ARGV.empty?
  interval = ARGV.first.to_f
end

device_file_name = Dir.glob(SENSOR_FILE_PATH).first
http_client = HTTPClient.new
loop do
  sensor_data = File.read(device_file_name)
  temperature = sensor_data.match(/t=(.*$)/)[1].to_f / 1000
  payload = '{"temperature":"%.3f"}' % temperature
  res = http_client.post(HARVEST_URL, payload, 'Content-Type' => 'application/json')
  logger.info("PAYLOAD: #{payload} / HARVEST Response: #{res.status}")

  sleep(interval)
end

 Harvestへのデータの送信は、SORACOM Air SIMでネットワークに接続した上で、HarvestのエントリポイントへHTTP、TCPもしくはUDPでデータを送信するだけです。今回はHTTPでJSONデータをPOSTしていますので、Content-Typeには application/json を指定します。1分おきにセンサーデータを読み出し、温度データを1,000で割って摂氏の温度に変換し、Harvestに送信しています。データのPOSTにはhttpclientを使っていますので、gem install等でインストールしておきます。

SORACOM Harvest 使用設定

 Harvestでのデータ集計を利用するにはユーザコンソールで設定をしておく必要があります。SORACOMユーザコンソールの左上のメニューから「グループ」を選択し、該当のSimが所属するグループを開いたら、SORACOM Harvest設定を開き、スライドスイッチをONに切り替えます。

f:id:akanuma-hiroaki:20170518015451p:plain

 なお、Harvestを有効にすると、書き込み回数に応じて通信料とは別に料金が発生しますのでご注意ください。

soracom.jp

処理の実行

 それでは処理を実行します。SORACOM Harvestを利用するにはSoracom AIR Simからネットワークに接続している必要がありますので、接続した上で下記のように処理を実行します。

pi@raspberrypi:~ $ ruby temperature.rb &
[2] 2939

 ログファイルには下記のように出力されます。

pi@raspberrypi:~ $ tail -f temperature.log 
I, [2017-05-13T06:06:37.734748 #3352]  INFO -- : PAYLOAD: {"temperature":"24.062"} / HARVEST Response: 201
I, [2017-05-13T06:08:12.354801 #3419]  INFO -- : PAYLOAD: {"temperature":"23.875"} / HARVEST Response: 201
I, [2017-05-13T10:50:18.103700 #2915]  INFO -- : PAYLOAD: {"temperature":"26.500"} / HARVEST Response: 201
I, [2017-05-13T10:50:25.385651 #2939]  INFO -- : PAYLOAD: {"temperature":"26.562"} / HARVEST Response: 201
I, [2017-05-13T10:51:27.733886 #2939]  INFO -- : PAYLOAD: {"temperature":"26.375"} / HARVEST Response: 201
I, [2017-05-13T10:52:29.934142 #2939]  INFO -- : PAYLOAD: {"temperature":"26.437"} / HARVEST Response: 201
I, [2017-05-13T10:53:32.343927 #2939]  INFO -- : PAYLOAD: {"temperature":"26.375"} / HARVEST Response: 201
I, [2017-05-13T10:54:34.634204 #2939]  INFO -- : PAYLOAD: {"temperature":"26.625"} / HARVEST Response: 201
I, [2017-05-13T10:55:36.983980 #2939]  INFO -- : PAYLOAD: {"temperature":"26.625"} / HARVEST Response: 201
I, [2017-05-13T10:56:39.254179 #2939]  INFO -- : PAYLOAD: {"temperature":"26.687"} / HARVEST Response: 201

集計データの確認

 SORACOM Harvestで集計されたデータを見るには、ユーザコンソールのSIM Management画面から該当のSIMを選択し、ActionsからHarvest dataを選択します。

f:id:akanuma-hiroaki:20170518073208p:plain

 すると下記のように集計データがグラフで表示されます。

f:id:akanuma-hiroaki:20170518073321p:plain

 アップロードされたデータの保存期間は40日間ということなので、継続的にデータを保存する必要があるサービスを構築する場合には自前で環境を用意する必要がありますが、センサーで集めたデータをとりあえず集約してみてみたいというような場合には手軽に使えてとても便利だと思います。