部屋の温度を取得してブラウザから確認できるようにしてみた話を書く。

使ったもの

センサー

センサーから得られる値の精度は一切気にしないので一番簡単に温度が取得できるpcsensor社製のTEMPerという温度計を使うことにした。Amazonに売ってます。

モバイル

SORACOMとFS01BUを使います。

構成

取得した温度データをRaspberry PiからSORACOM Funnelを使ってKinesis Firehose経由でS3に保存する。EC2でS3からデータを取得しMySQLに保存するスクリプトをCronで動作させ、MySQLに保存されたデータをSinatraとD3.jsを使って可視化します。

S3からデータを取得するスクリプトは特にリアルタイム性は必要ないので1時間に一回動作させてます。SORACOM FunnelのKinesis Firehose Adapterを使うと5分に1回くらいしかデータが送られてこないので、リアルタイムで対応したい人はKinesis Streamを使うなど別の仕組みを作る必要があります。

ここではやりませんが、Lambdaでスクリプトを実行してRDSにデータを保存する構成も良さそうです。

作ったもの

Raspberry Piでrubyを使ってTEMPerから取得した値をSORACOM funnel adapter (funnel.soracom.io)に送ります。

TEMPerの設定

TEMPerはUSBに接続したあとRaspberry Piで使えるように設定します。

$ sudo apt-get install gcc libusb-dev
$ git clone https://github.com/bitplane/temper.git
$ cd temper
$ sudo make
$ sudo cp ./temper /usr/bin/temper
$ sudo temper
温度が取得できればOK

データを送る

SORACOM funnelの設定は公式ドキュメントを見ることで簡単にできるので省きます。

TEMPerから取得したデータをfunnel.soracom.ioに送る適当なスクリプトを書きます。

rubyで書くのでインストールする。

$ sudo apt-get install ruby
$ ruby -v
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf]

データ送信スクリプトです。sensor固有のIDは設定しません。funnelでSIMの情報を付与してくれるのでそちらを使うとRapsberry Pi側で設定しなくてもよくなります。Rapsberry Piに固有の設定をしなくて良くなるため大量にセンサーがある場合で楽ができそうです。

send_data.rb
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("http://funnel.soracom.io")

loop {
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri)

req["Content-Type"] = "application/json"

payload = {
send_time: `echo $(date +%s%3N)`.chomp,
temp: `/usr/bin/temper`.split(",")[1].chomp
}.to_json

req.body = payload
res = http.request(req)
sleep 30
}

スクリプトを実行してS3を見るとおおよそ5分後にデータの入ったファイルが置かれているのが確認できます。

$ nohap ruby send_data.rb &

続き=>部屋の温度を可視化するアプリを作ってみた(2/3)

参考

  1. https://dev.soracom.io/jp/start/funnel/