LittleBitsを使ったIoTをつくり、家の室温変化のグラフをインターネットから見る（前編）

![cloudbit2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/36b49863-4995-055b-17c1-949571e8f2d9.jpeg)

![Untitled (Network diagram)1.png](https://qiita-image-store.s3.amazonaws.com/0/12939/5f6a4627-3813-c5e7-30e4-635ae84bf983.png)

本記事のGitHubのリポジトリ：

[weed/cloudbit-webapi-p150705](https://github.com/weed/thermometer-cloudbit-p150705)

### やりたいこと

これから暑い夏がやってくる！冷房をつけてもしばらくは暑い。そこで、[littleBits](http://littlebits.cc/)を使って部屋の室温をインターネットから見れるようにして、暑いならインターネットから冷房のスイッチをオンにできるようにします。

[littleBitsとは？ - littleBits](http://jp.littlebits.com/about/)から引用させて頂くと、以下のようなものです。

    littleBits（リトルビッツ）とは、磁石で電子回路をつないで電子工作を行うことを通して、電子回路を楽しく学べるオープンソースのライブラリー（引用者注：ハードウェア含む。というかほとんどがハードウェア）です。

    littleBitsのライブラリーは、磁石で接続できる単機能の小さな電子回路基板で構成されています。面倒なハンダ付けや配線、専門知識を要するプログラミングは不要で、基板同士をつなげるだけで電子工作を行え、電子回路を楽しく学べます。

    各Bit（ビット）にはそれぞれ決まった機能（光るもの、音を出すもの、センサー、ボタン、一定の条件でスイッチが入るもの、連続的にスイッチ信号を出すもの、モーターなど）があり、各Bitをつなげていくことで規模の大きな電子回路を組み立てることができます。

    技術的な専門知識をそれほど必要とせずに、複雑な電子/電気工作が行えるLEGO™と同様、littleBitsではよりシンプルで自由度が高く、磁石で基板同士を接続できるという新しい発想による電子工作を行える点に特長があります。

<a href="http://www.amazon.co.jp/gp/product/B00L9WFI5A/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=B00L9WFI5A&linkCode=as2&tag=theuntitled-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00L9WFI5A&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=theuntitled-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=theuntitled-22&l=as2&o=9&a=B00L9WFI5A" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<a target="_blank" href="http://www.amazon.co.jp/s/ref=as_li_ss_tl?_encoding=UTF8&camp=247&creative=7399&field-keywords=Littlebits&linkCode=ur2&tag=theuntitled-22&url=search-alias%3Daps">AmazonのLittleBitsのページ</a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=theuntitled-22&l=ur2&o=9" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
なお、冷房のスイッチのコントロールは**IRKit**をそのまま使います。UIやリモコン学習のやり方がわかりやすいので使いやすいです。

<a href="http://www.amazon.co.jp/gp/product/B00H91KK26/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=B00H91KK26&linkCode=as2&tag=theuntitled-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00H91KK26&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=theuntitled-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=theuntitled-22&l=as2&o=9&a=B00H91KK26" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

（画像をクリックするとAmazonに飛びます）

### ハードウェアを組む

まず装置を組みます・・・といっても、磁石の力で3つの部品をくっつけるだけですが。

![thermometer.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/65f7885b-7f8f-8bd4-27d5-a096c01eaace.jpeg)

上から順に、

- USB Power
- Temperature Sensor
- CloudBit

です。発熱するUSB Wi-Fiドングルと温度センサのあいだが近いのが少し気になりますが・・・

CloudBitはマニュアルにしたがってアクティベートしておきます。

ちなみに即時的な温度を見るだけであれば、何もコーディングしなくてもOKです。CloudBitをアクティベートすると、以下のようなページがLittleBitsのホームページにつくられます。

![cloudbit1.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/bf593585-6ae6-6cf7-5772-07377689a9ec.jpeg)

![cloudbit2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/fef4b463-5283-0c25-ccbc-ae1db2247a94.jpeg)

おお、つなぐだけでできちゃったよ！SUGEEEE！

でも妻にグラフで見せたい（じゃないと使ってくれなさそう）なので、コーディングすることにします。

### curlで温度を取得

次に、**curl**で温度をとってみましょう。

```shell-session
$ curl -i -H "Authorization: Bearer ACCESS_TOKEN" -H "Accept: application/vnd.littlebits.v2+json" https://api-http.littlebitscloud.cc/devices/DEVICE_ID/input
```

すると以下のようなレスポンスが返ってきます。

```
data:{"type":"input","timestamp":1436265799248,"from":{"socket":{"remotePort":54479,"remoteAddress":"125.30.76.200","localAddress":"172.17.0.4","localPort":9000,"id":"EySesDNO"},"server":{"id":"4yRl0U4_"},"user":{"id":xxxxx},"device":{"id":"xxxxxxxxxxx","device":"littlebits-module-cloud","setup_version":"1.1.0","protocol_version":"1.1.0","firmware_version":"1.0.150603a","mac":"00e04c032d62","hash":"18CCD9A21A3F3E428CF055097180D524","ap":{"ssid":"LB-HAVENT-READ-SSID","mac":"00:00:00:00:00:00","strength":82},"settings":{"label":"thermometer","input_interval_ms":750}},"is_identified":true},"percent":31,"absolute":319,"name":"amplitude","payload":{"percent":31,"absolute":319}}
```

最後の`"percent":31`が温度です。

### Web API サーバをつくる

それでは、室温グラフを描く前に、HTTP GETで温度を返すようなWeb APIサーバをつくりましょう。**Sinatra**でつくります。

```rb:app.rb
require 'sinatra/base'
require 'net/http'

class Server < Sinatra::Base
  uri = URI(
    "https://api-http.littlebitscloud.cc/devices/#{ENV['THERMO_CLOUDBIT_DEVICE_ID']}/input"
  )

  request = Net::HTTP::Get.new uri
  request['Accept'] = "application/vnd.littlebits.v2+json"
  request['Authorization'] = "Bearer #{ENV['THERMO_CLOUDBIT_TOKEN']}"

  get '/' do
    Net::HTTP.start(uri.host, uri.port,
      :use_ssl => uri.scheme == 'https') do |http|
      http.request request do |response|
        response.read_body do |chunk|
          return chunk
        end
      end
    end
  end 
end
```

デバイスIDとアクセストークンは環境変数に入れておきます。

```shell-session
$ export THERMO_CLOUDBIT_DEVICE_ID=xxxxxxx
$ export THERMO_CLOUDBIT_ACCESS_TOKEN=xxxxxxxxxxxxxx
```

データはストリームで返ってくるので、最初の`chunk`をとって出力したら`return`しちゃいます。

```:config.ru
root = ::File.dirname(__FILE__)
require ::File.join(root, 'app')

run Server
```

```:Gemfile
source "https://rubygems.org"

gem 'sinatra'

group :development do
  gem 'shotgun'
end

ruby '2.2.0'
```

ここでローカルでサーバを起ち上げてみましょう。先ほど**curl**で取得したJSONが表示されればOKです。

```shell-session
$ rbenv exec bundle exec shotgun
```

なお、gemの管理は以下の記事のようにやっています。適宜読み替えて下さい。

[Rubyのプロジェクト毎のモジュール管理、バージョン管理 - Qiita](http://qiita.com/weed/items/0a18098584b410fd4351)

### Herokuにプッシュ

あとはこのサーバをHerokuに上げましょう。

```:Procfile
web: bundle exec rackup config.ru -p $PORT
```

うまくいきましたでしょうか。とりあえず今日はここまでです。

なお、コーディングに当たって[Ayumu AIZAWA(@ayumin)さん](https://twitter.com/ayumin)に多大なヘルプをしていただきました。厚く感謝いたします。

続きます：

[JavaScript - IoTをつくり、Googleスプレッドシートで家の室温変化のグラフを公開する（後編） - Qiita](http://qiita.com/weed/items/7ff7185ad76e591e684b)

---
ブログやっています：http://weed.nagoya