Edited at

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

More than 1 year has passed since last update.


はじめに

本記事はフィットネストラッカーのまとめと連携方法についてのサンプルプログラム1です。

詳細についてはフィットネストラッカーのまとめと連携方法についてをご覧ください。

こちらでは Fitbit Charge HR + Ruby で歩数変化から家電制御を行います。


Developer及びアプリ登録

Fitbit Developer APIにアプリを登録します。

Fitbit Dveloper アカウント は端末で登録したアカウントと同様です。

スクリーンショット 2016-12-15 17.33.20.png

MANAGE MY APPSをクリック

Register a new appをクリックすると以下のような登録フォームが出てくるので、

以下のように入力します(Callback URL 以外は適当で問題ありません)。

スクリーンショット 2016-12-16 22.27.46.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をインストールする(初心者向け)

参考として本記事では以下のものをインストールしています。

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をインストールした話 - はしくれエンジニアもどきのメモ

Code of Resistance!!: sinatraを使ってみた。


OAuth2

このOAuth2は、RubyでOAuth2認証を行う際に使用するライブラリです。

以下のコマンドをRubyで実行してインストールしてください。

gem install oauth2

詳細は以下のリンクを参考にしてください。

rubyのoauth2(gem)について


Faraday

Faradayは、DigitalOceanの公式SDKも使っているライブラリです。

以下のコマンドをRubyで実行してインストールしてください。

gem install faraday

詳細は以下のリンクを参考にしてください。

RubyからHTTP通信させたいときはFaradayを使うと便利だった話


通信時の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:エアコン・照明・ブラインド・電子錠・温度計のエミュレータ

Moekadenroom


ECHONET Lite

ECHONET Lite(エコーネットライト)は、エコーネットコンソーシアムが策定した通信プロトコルです。

詳細については以下のリンクを参考にしてください。

エコーネットとは? | ECHONET

「ECHONET Lite」の基礎技術と認証プロセス:いまさら聞けない「ECHONET Lite」とその認証プロセス (1/4) - MONOist(モノイスト)


サンプルプログラム

OAuth認証の1.code取得、2.access_token取得の流れで行います。

以下のOAuth1.rbに入手したClient IDを◯◯◯◯、Client Secretを××××に入力します。


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を以下の△△△△に入力し、実行します。


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という通信規格で家電制御を行います。

家電側に関しては動作確認が可能なMoekadenroomというエミュレータを利用します。

app.rbの□□□□に取得したtokenを入力します。


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による家電制御まで行いました。

ウェアラブルデバイスと家電連携のサービス開発は投稿時点では少ないように感じます。

学習できる要素が多く、実用性もあると思いますので、

ぜひとも参考にしていただければと思います。

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

(作成:神奈川工科大学 杉村研究室)


関連記事

フィットネストラッカーのまとめと連携方法について

サンプル2「Jawbone UP3 & Node.jsで歩数をWebページに表示する」


参考

Windows上のRubyでSSL接続時にcertificate verify failedが出る場合の対処

Fitbit APIにOAuth 2.0でアクセスして心拍データを取得する方法(Ruby)

RubyでAPIを叩く(#4 その他ライブラリ編)

RubyでECHONET Lite家電を制御する