サンプル1「Fitbit Charge HR + Ruby で歩数変化から家電制御」

#はじめに
本記事は[フィットネストラッカーのまとめと連携方法について](http://qiita.com/kamira0627/private/dd02c1cbee0ecf5c449b)のサンプルプログラム1です。
詳細については[フィットネストラッカーのまとめと連携方法について](http://qiita.com/kamira0627/private/dd02c1cbee0ecf5c449b)をご覧ください。
こちらでは Fitbit Charge HR + Ruby で歩数変化から家電制御を行います。

#Developer及びアプリ登録
[Fitbit Developer API](https://dev.fitbit.com/jp)にアプリを登録します。
Fitbit Dveloper アカウント は端末で登録したアカウントと同様です。
![スクリーンショット 2016-12-15 17.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/130337/88c102bf-8563-d514-7f49-537f107fa6e8.png)

**MANAGE MY APPS**をクリック
**Register a new app**をクリックすると以下のような登録フォームが出てくるので、
以下のように入力します（Callback URL 以外は適当で問題ありません）。
![スクリーンショット 2016-12-16 22.27.46.png](https://qiita-image-store.s3.amazonaws.com/0/130337/182c88de-0306-5511-ecc3-33266af0cb71.png)

Application Name : `Test`
Description : `Test application`
Application Website : `http://localhost.com/`
Organization : `Personal`
Organization Website : `http://localhost.com/`
OAuth 2.0 Application Type : `Server`
Callback URL : `http://localhost:3000/oauth2/callback`
Default Access Type : `Read-Only`
**I have read and agree to the terms of service**にチェックして登録


OAuth 2.0 Client ID、Client Secretを入手します。

#環境
Windows 7 64bit
Ruby 2.3.1
+ Sinatra 1.4.7
+ OAuth2 1.2.0
+ Faraday 0.10.0

##家電制御確認エミュレータ
Moekadenroom

#インストール方法
##Ruby
Rubyは、まつもとゆきひろ氏により開発されたオブジェクト指向スクリプト言語です。
インストールについては以下のリンクを参考に行ってください。
[WindowsにRubyをインストールする(初心者向け)](http://qiita.com/shimoju/items/41035b213ad0ac3a979e)

参考として本記事では以下のものをインストールしています。
`rubyinstaller-2.3.1-x64.exe`
`DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe`

###**Gemインストール時のSSLエラー対策**
https://rubygems.org/ の証明書が更新されたため、Gemのインストール関連でSSLのエラーを発生させないために、
以下のコマンドをRubyで必ず実行してください。
`gem install rubygems-update --source http://rubygems.org/`

##Sinatra
Sinatraは、Rubyで作成されたオープンソースのWebアプリケーションフレームワークです。
以下のコマンドをRubyで実行してインストールしてください。
`gem install sinatra`

詳細は以下のリンクを参考にしてください。
[WindowsのRubyにSinatraをインストールした話 - はしくれエンジニアもどきのメモ](http://cartman0.hatenablog.com/entry/2015/01/31/210637)
[Code of Resistance!!: sinatraを使ってみた。](https://daruiapprentice.blogspot.jp/2015/05/sinatra.html)

##OAuth2
このOAuth2は、RubyでOAuth2認証を行う際に使用するライブラリです。
以下のコマンドをRubyで実行してインストールしてください。
`gem install oauth2`

詳細は以下のリンクを参考にしてください。
[rubyのoauth2(gem)について](http://qiita.com/mm31/items/b2bfe8d43976fafd6a9b)

##Faraday
Faradayは、DigitalOceanの公式SDKも使っているライブラリです。
以下のコマンドをRubyで実行してインストールしてください。
`gem install faraday`

詳細は以下のリンクを参考にしてください。
[RubyからHTTP通信させたいときはFaradayを使うと便利だった話](http://qiita.com/srockstyle/items/111d25f44ef2cc51d9ac)

###**通信時のSSLエラー対策**
通信時のSSLエラーを発生させないために、以下の手順を必ず行ってください。
1. 証明書をCドライブにダウンロードする。 http://curl.haxx.se/ca/cacert.pem
2. 環境変数 SSL_CERT_FILE に cacert.pem のパスを設定する。
　2.1. windowsのスタートをクリックし、検索に「環境変数」と入力
　2.2. ユーザー環境変数の新規をクリック
　2.3. 変数名に「SSL_CERT_FILE」
　2.4. 変数値に「C:¥cacert.pem」とフルパスで設定

##Moekadenroom
Moekadenroomは、大和田茂氏により作られたECHONET Lite機器のエミュレータです。
インストールについては以下のリンクを参考に行ってください。
[Kadecot » MoekadenRoom:エアコン・照明・ブラインド・電子錠・温度計のエミュレータ](https://kadecot.net/blog/1479/)
[Moekadenroom](https://github.com/SonyCSL/MoekadenRoom)

###ECHONET Lite
ECHONET Lite（エコーネットライト）は、エコーネットコンソーシアムが策定した通信プロトコルです。
詳細については以下のリンクを参考にしてください。
[エコーネットとは？ | ECHONET](https://echonet.jp/about/)
[ 「ECHONET Lite」の基礎技術と認証プロセス：いまさら聞けない「ECHONET Lite」とその認証プロセス (1/4) - MONOist（モノイスト）](http://monoist.atmarkit.co.jp/mn/articles/1604/07/news040.html)

#サンプルプログラム
OAuth認証の1.code取得、2.access_token取得の流れで行います。
以下のOAuth1.rbに入手したClient IDを◯◯◯◯、Client Secretを××××に入力します。

```ruby:OAuth1.rb
require 'oauth2'

client_id = '○○○○'
client_secret = '××××'
redirect_uri = 'http://localhost:3000/oauth2/callback'

client = OAuth2::Client.new(client_id, client_secret,
    site: 'https://api.fitbit.com',
    authorize_url: 'https://www.fitbit.com/oauth2/authorize',
    token_url: 'https://api.fitbit.com/oauth2/token')

puts client.auth_code.authorize_url(redirect_uri: redirect_uri, scope: 'activity')
```
コマンドプロンプトで実行するとURLが返ってくるので、
コピーしてブラウザを起動してURLを入力します。

認証画面より**「許可」**をクリックし、URLのcodeをメモします。

`code=...#_=_` という形でURLに表示されるので...のcodeをメモします。

続いてcodeを以下の△△△△に入力し、実行します。

```ruby:OAuth2.rb
require 'oauth2'
require 'base64'

client_id = '○○○○'
client_secret = '××××'
redirect_uri = 'http://localhost:3000/oauth2/callback'

client = OAuth2::Client.new(client_id, client_secret,
    site: 'https://api.fitbit.com',
    authorize_url: 'https://www.fitbit.com/oauth2/authorize',
    token_url: 'https://api.fitbit.com/oauth2/token')

code = '△△△△'

bearer_token = "#{client_id}:#{client_secret}"
encoded_bearer_token = Base64.strict_encode64(bearer_token)
access_token = client.auth_code.get_token(code,
    grant_type: 'authorization_code',
    client_id: client_id,
    redirect_uri: redirect_uri,
    :headers => {'Authorization' => "Basic #{encoded_bearer_token}"})

p access_token.get('https://api.fitbit.com/1/user/-/activities/tracker/steps/date/today/1d.json')

```
するとAPIで取得したjsonとtokenなどが返ってきます。

`"Authorization"=>"Bearer ......"`

......の部分がtokenになります。この部分をメモします。

#動作確認
tokenを利用して家電と連携させましょう。
実際に歩数によって家電をON/OFFできるアプリを実装します。
具体的には[ECHONET Lite](https://echonet.jp/)という通信規格で家電制御を行います。
家電側に関しては動作確認が可能な[Moekadenroom](https://github.com/SonyCSL/MoekadenRoom)というエミュレータを利用します。
app.rbの□□□□に取得したtokenを入力します。

```ruby:app.rb
require 'uri'
require 'faraday'
require "socket"

droplet_ep = 'https://api.fitbit.com/1/user/-/activities/tracker/steps/date/today/1d.json'
token = '□□□□'

uri = URI.parse(droplet_ep)

http = Faraday.new(:url => "#{uri.scheme}://#{uri.host}")
res = http.get do |req|
  req.url uri.path
  req.headers['Authorization'] = "Bearer #{token}"

end

p res.body

  today_steps = res.body.delete("^0-9")
  today_steps[0..7] = ''

p today_steps

if today_steps > '1000'

  ip="224.0.23.0"

  #エアコンのON制御
  msg=[
  0x10,0x81,
  0x00,0x00,
  0x05,0xFF,0x01,
  0x01,0x30,0x01,
  0x61,0x01,
  0x80,0x01,
  0x30
  ].pack("C*")

  u = UDPSocket.new()
  u.connect(ip,3610)
  u.send(msg,0)
  u.close
  p 'air conditioner : ON'

else

  ip="224.0.23.0"

  #エアコンのOFF制御
  msg=[
  0x10,0x81,
  0x00,0x00,
  0x05,0xFF,0x01,
  0x01,0x30,0x01,
  0x61,0x01,
  0x80,0x01,
  0x31
  ].pack("C*")

  u = UDPSocket.new()
  u.connect(ip,3610)
  u.send(msg,0)
  u.close
  p 'air conditioner : OFF'

end
```

使い方はRuby実行端末内でMoekadenroom.exeを起動し、app.rbを実行します。
すると認証時よりもスッキリしたjsonと今日の歩数、エアコンに対する制御内容（ON/OFF）が返ってきます。
同時にMoekadenroomで起動していたエアコンがON/OFFされます。
Moekadenroomのエアコンはマウス操作でON/OFFできるので、動作確認時に調整してみてください。
サンプルでは歩数1000をしきい値としています。

##補足



#おわりに
本サンプルプログラムではFitbitとRubyでECHONET Liteによる家電制御まで行いました。
ウェアラブルデバイスと家電連携のサービス開発は投稿時点では少ないように感じます。
学習できる要素が多く、実用性もあると思いますので、
ぜひとも参考にしていただければと思います。

最後まで読んでいただきありがとうございました。

（作成：神奈川工科大学 杉村研究室）

##関連記事
[フィットネストラッカーのまとめと連携方法について](http://qiita.com/kamira0627/private/dd02c1cbee0ecf5c449b)
[サンプル2「Jawbone UP3 ＆ Node.jsで歩数をWebページに表示する」](http://qiita.com/MasaKanoMASA/private/55003453ef1f9cfcb658)

#参考

[Windows上のRubyでSSL接続時にcertificate verify failedが出る場合の対処]
(http://qiita.com/whiteleaf7@github/items/4504b208ad2eec1f9357)
[Fitbit APIにOAuth 2.0でアクセスして心拍データを取得する方法(Ruby)]
(http://kaorumori.hatenadiary.com/entry/2015/09/23/011006)
[RubyでAPIを叩く(#4 その他ライブラリ編)]
(http://qiita.com/kazuyat/items/e8a24c6d76e5c922f630)
[RubyでECHONET Lite家電を制御する]
(http://qiita.com/miyazawa_shi/items/4c645315262d5cf5b015)