引き続きIoTエンジニア養成読本のハンズオンの内容を実践中です。今度は温度センサーのデータを読み取って、そのデータをSORACOM Harvestへ送って可視化する処理をRubyで実装してみます。
温度センサーの接続
まずは下記のように温度センサー(DS18B20)を接続します。温度センサーの3本の端子はそれぞれ用途が決まってるので、向きを間違えないように注意です。抵抗は4.7kΩのものを使っています。
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に切り替えます。
なお、Harvestを有効にすると、書き込み回数に応じて通信料とは別に料金が発生しますのでご注意ください。
処理の実行
それでは処理を実行します。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を選択します。
すると下記のように集計データがグラフで表示されます。
アップロードされたデータの保存期間は40日間ということなので、継続的にデータを保存する必要があるサービスを構築する場合には自前で環境を用意する必要がありますが、センサーで集めたデータをとりあえず集約してみてみたいというような場合には手軽に使えてとても便利だと思います。