nest開発環境構築

nestって「ねぐら」って意味なんですね。心地よいねぐらを作ってくれるって事か。
先日のnestお勉強編にて、アメリカのサーモスタットの必要性と、しかし文化の違い?からかnestは日本において出番が少ないという状態なのはよくわかりました。そもそも、日本で24VoltageACのサーモスタットなんて代物は存在しない??少なくとも我が家にはない。Googleが買収する前から、「自分の家ではつかえねぇなぁ・・・」てことでスルーしてたんですよね。でもなぜか今nestが会社にあってですね、ほんのちょっと触る機会がありまして、再びワクワクしております。数年ぶりに「自宅スマートホーム化計画」が自分の中で再燃中、是非とも使えるようにしてみたいわけですよ。
で、最終的にやりたいのは、「ベンツのように車が自宅に近づいたら暖房or冷房ON」をしてみたいという、それだけなのです。まあ、nestに対応した冷暖房があるわけではないので、実際に実現はできませんが。実際は我が家であれば「IRKit」のほうがやりたいことを実現できるのだけれど。
というわけでnestは持っていないし買っても設置出来ないわけですから、ここは実機無しで開発環境を構築して、サンプルアプリでも動かしてることとしましょう。
まずは、クロームプラグインを導入します。

https://home.nest.com/を開きます。
ロームのメニューより その他ツール>デベロッパーツール を開きます。

タブのNestを選択

Thermostatsの+ボタンを押してサーモスタットを追加します。

ではサンプルを動作させてみたいと思いますが、その前に、nestアプリで動作させてみましょうか。iPhoneApp Storeにてnestで検索するとすぐ見つかります。

すると何の事はない、単にWebと同じ画面が開くだけのアプリのようです。
気を取り直してサンプル動作です。さて、事前知識としてnest APIがどのように動作するか確認します。

  • サーモスタットからのデータはnestのサーバーにupされる。
  • Nest APIが提供されており、サーモスタットにはREST、Firebaseでアクセス可能。
  • Developer Serviceを介してNest APIにアクセスすることも、iPhoneなどから直接Nest APIを呼ぶことも可能。
  • OAuth2.0で認証するようだ。

ではSample Codeの一番上にあるThermostat Controlから試してみます。
control-jquery-master.zip をダウンロード、展開。
まずはツール類をダウンロード、インストール。
node.jsをインストールします。

$ brew uninstall node
$ brew update
$ brew install nodebrew
$ nodebrew install latest

ビルドにはそこそこ時間がかかります。次にバージョンを確認

$ nodebrew list
v0.11.14
current: none

上記バージョンを有効にする

$ nodebrew use v0.11.14
use v0.11.14

パスを設定する。

$ echo export PATH=\$PATH:/Users/$(whoami)/.nodebrew/current/bin >> ~/.bashrc

反映して、バージョン確認

$ source ~/.bashrc
$ node -v
v0.11.14

ちなみにyosemiteでbrew updateがうまう行かない場合、次の記事および次の記事で無事解決しました。

つぎにYeomanです。Yeomanについてはこちらの記事を参考。

Yeomanはnode.jsのパッケージ管理コマンドであるnpmコマンドを使用してインストールします。こちらのページを参考にインストールしましょう。

$ npm install -g yo bower grunt-cli gulp

展開したサンプルのフォルダに入ります。 例えば以下のように。

cd ~/Documents/Projects/nest/sample/control-jquery-master

次に、展開したサンプルの環境構築を行います。bower installを行うとbower.jsonに記載されているdependenciesのとおり、ライブラリが構築されます。

$ cat bower.json
{
"name": "Control",
"dependencies": {
"jquery": "= 2.1.1",
"jquery-cookie": "= 1.4.1",
"firebase": "= 1.0.15"
},
"private": true
}

jqueryjquerycookie、それにfirebaseが導入されるようですね。それではbower installしてみましょう。

$ bower install
[?] May bower anonymously report usage statistics to improve the tool over time? No/n) n
bower not-cached git://github.com/jquery/jquery.git#= 2.1.1
bower resolve git://github.com/jquery/jquery.git#= 2.1.1
bower not-cached git://github.com/carhartl/jquery-cookie.git#= 1.4.1
bower resolve git://github.com/carhartl/jquery-cookie.git#= 1.4.1
bower not-cached git://github.com/firebase/firebase-bower.git#= 1.0.15
bower resolve git://github.com/firebase/firebase-bower.git#= 1.0.15
bower download https://github.com/firebase/firebase-bower/archive/v1.0.15.tar.gz
bower download https://github.com/carhartl/jquery-cookie/archive/v1.4.1.tar.gz
bower download https://github.com/jquery/jquery/archive/2.1.1.tar.gz
bower extract jquery-cookie#= 1.4.1 archive.tar.gz
bower resolved git://github.com/carhartl/jquery-cookie.git#1.4.1
bower not-cached git://github.com/jquery/jquery.git#>=1.2
bower resolve git://github.com/jquery/jquery.git#>=1.2
bower download https://github.com/jquery/jquery/archive/2.1.3.tar.gz
bower extract firebase#= 1.0.15 archive.tar.gz
bower resolved git://github.com/firebase/firebase-bower.git#1.0.15
bower extract jquery#= 2.1.1 archive.tar.gz
bower resolved git://github.com/jquery/jquery.git#2.1.1
bower extract jquery#>=1.2 archive.tar.gz
bower resolved git://github.com/jquery/jquery.git#2.1.3
bower install jquery-cookie#1.4.1
bower install firebase#1.0.15
bower install jquery#2.1.1
jquery-cookie#1.4.1 bower_components/jquery-cookie
└── jquery#2.1.1
firebase#1.0.15 bower_components/firebase
jquery#2.1.1 bower_components/jquery

次にnpm installします。npm installをオプション無しで実行すると、package.jsonの内容に従って、packageをインストールします。

$ cat package.json
{
"dependencies": {
"body-parser": "latest",
"cookie-parser": "latest",
"express": "latest",
"express-session": "latest",
"passport": "latest",
"passport-nest": "latest"
}
}

ではインストールします。

$ npm install
npm WARN package.json @ No repository field.
cookie-parser@1.3.3 node_modules/cookie-parser
├── cookie@0.1.2
└── cookie-signature@1.0.5
passport@0.2.1 node_modules/passport
├── pause@0.0.1
└── passport-strategy@1.0.0
express-session@1.10.1 node_modules/express-session
├── cookie@0.1.2
├── utils-merge@1.0.0
├── cookie-signature@1.0.5
├── on-headers@1.0.0
├── parseurl@1.3.0
├── crc@3.2.1
├── depd@1.0.0
├── uid-safe@1.0.2 (native-or-bluebird@1.1.2, base64-url@1.1.0)
└── debug@2.1.1 (ms@0.6.2)
body-parser@1.10.1 node_modules/body-parser
├── media-typer@0.3.0
├── bytes@1.0.0
├── raw-body@1.3.1
├── depd@1.0.0
├── qs@2.3.3
├── on-finished@2.2.0 (ee-first@1.1.0)
├── iconv-lite@0.4.5
└── type-is@1.5.5 (mime-types@2.0.7)
express@4.11.0 node_modules/express
├── utils-merge@1.0.0
├── cookie@0.1.2
├── merge-descriptors@0.0.2
├── methods@1.1.1
├── cookie-signature@1.0.5
├── fresh@0.2.4
├── escape-html@1.0.1
├── range-parser@1.0.2
├── media-typer@0.3.0
├── finalhandler@0.3.3
├── vary@1.0.0
├── serve-static@1.8.0
├── content-disposition@0.5.0
├── parseurl@1.3.0
├── path-to-regexp@0.1.3
├── etag@1.5.1 (crc@3.2.1)
├── on-finished@2.2.0 (ee-first@1.1.0)
├── depd@1.0.0
├── debug@2.1.1 (ms@0.6.2)
├── qs@2.3.3
├── proxy-addr@1.0.5 (forwarded@0.1.0, ipaddr.js@0.1.6)
├── send@0.11.0 (destroy@1.0.3, ms@0.7.0, mime@1.2.11)
├── type-is@1.5.5 (mime-types@2.0.7)
└── accepts@1.2.2 (negotiator@0.5.0, mime-types@2.0.7)
passport-nest@1.0.0 node_modules/passport-nest
├── pkginfo@0.3.0
└── passport-oauth@1.0.0 (passport-oauth1@1.0.1, passport-oauth2@1.1.2)

次に、https://developer.nest.com/clients/より環境変数を取得します。

空っぽなので作成します。

Clientの説明とパーミッションを設定。* の欄は必須なのでここだけ埋めていきます。今のところ個人用なのでIndivisualで設定。Select up two categoriesも適当に選択。Support URLは適当に記載。

テストなのでパーミッションはすべてONのread/writeにしていきます。説明も適当に記載。

作成されたCliantのCliant IDとClient Selectを環境変数にセットします。

 $ export NEST_ID=<CLIENT ID>
$ export NEST_SECRET=<CLIENT SECRET>

では、サンプルを実行してみましよう。

$ grunt
grunt-cli: The grunt command line interface. (v0.1.13)
Fatal error: Unable to find local grunt.
If you're seeing this message, either a Gruntfile wasn't found or grunt
hasn't been installed locally to your project. For more information about
installing and configuring grunt, please see the Getting Started guide:
http://gruntjs.com/getting-started

エラーが出ます。プロジェクトにgruntがインストールされていない?下のコマンドを打ち込みます。

$ npm install grunt
npm WARN package.json @ No repository field.
npm WARN package.json passport-nest@1.0.0 No repository field.
grunt@0.4.5 node_modules/grunt
├── which@1.0.8
├── dateformat@1.0.2-1.2.3
├── eventemitter2@0.4.14
├── getobject@0.1.0
├── rimraf@2.2.8
├── colors@0.6.2
├── async@0.1.22
├── grunt-legacy-util@0.2.0
├── hooker@0.2.3
├── exit@0.1.2
├── nopt@1.0.10 (abbrev@1.0.5)
├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.5.0)
├── lodash@0.9.2
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── iconv-lite@0.2.11
├── findup-sync@0.1.3 (glob@3.2.11, lodash@2.4.1)
├── grunt-legacy-log@0.1.1 (underscore.string@2.3.3, lodash@2.4.1)
└── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)

再度サンプルを実行してみましょう。

$ grunt
>> Local Npm module "grunt-wiredep" not found. Is it installed?
Running "server" task
body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:58:9
body-parser deprecated undefined extended: provide extended option node_modules/body-parser/index.js:85:29
express-session deprecated undefined resave option; provide resave option server.js:59:9
express-session deprecated undefined saveUninitialized option; provide saveUninitialized option server.js:59:9
Web server running at http://localhost:8080.

こんどはうまく動きました。でも上記の通りエラーが出ています。

>> Local Npm module "grunt-wiredep" not found. Is it installed?

足りないモジュールをインストールして再度gruntを実行します。

npm install grunt-wirede

gruntを実行してlocalhostを開くと、認証プロセスに遷移します。

ログインするとPincodeが表示されます。しかし、ここから、どうすればいいのかわかりません。

どうすればいいんだ!そうこうしているとそろそ出勤時間です。続きはまた明日。

上部へスクロール