研究室にPhilipsのhueが来たので使ってみた。amazonでも売ってるけど3万円ぐらいする高級品だったのでおそるおそる扱った。


hueの仕様

bridgeと呼ばれる円盤型の母艦に、15個のhue電球が無線接続(zigbee?)される。
bridgeは有線LANケーブルで接続され、HTTPのAPIを持つ。
OSはFreeRTOSで、lwIPでTCP/IPを実装している。

bridgeにはボタン1つとステータスLEDしか付いていないが、ローカルIPアドレスが http://www.meethue.com/api/nupnp で確認できて、あとはwebブラウザから見れる。

電球部分はごく普通のE26口金なので、家の天井や電気スタンドで使えるはず。


API

http://developers.meethue.com/にドキュメントがある。

HTTPのAPIなので、同じLANの中からならどのマシンからでもAPIが使える。
jsonでやりとりする。
HTTPヘッダにAccess-Control-Allow-Origin=*が付いているのでブラウザ上のJavaScriptからもクロスドメイン制限なしにAPIが使える。

最初にAPIを使ってユーザー登録をしなければならないのだが、”1234567890″というユーザーがデフォルトで使えるようになっている・・気がする。

hue Rubygemではコンストラクタでユーザー名を指定しない時に自動的に”1234567890″を使うようになっているので、認証の事を全く考えずにコードが書ける。

curlで使う場合はこんな感じ
## ユーザー登録し、usernameを取得する
## usernameは自分で指定できるはずだが、なぜかエラーが返ってくるのでdevicetypeに名前を入れておいた
curl -d '{"devicetype":"shokai"}' http://192.168.1.130/api
## これだけ、bridge上部のボタンを押してから30秒以内に実行する必要あり

## bridgeのステータス取得
## 返り値がjsonなのでjqが便利
curl http://192.168.1.130/api/(username)/config | jq .

## 電球のステータス表示
curl http://192.168.1.130/api/(username)/lights

## 電球3のくわしいステータス表示
curl http://192.168.1.130/api/(username)/lights/3

## 電球3の名前を変更
curl -X PUT -d '{"name":"shooookai"}' http://192.168.1.130/api/(username)/lights/3

Rubyから使う

gemがあるので使いましょう

gem install hue

しかしsaturationとbrightnessが指定できないバグが有ったので、修正してpull requestを送っておいた

そのうち取り込まれて治ると思うけど、それまではGemfileに俺のgithubのブランチを指定してインストールすればいいと思う。
特にbrightnessは最大になってないっぽかったので、修正したらちょっと明るくなった。
source 'https://rubygems.org'

gem 'hue', :git => 'https://github.com/shokai/hue.git', :branch => 'bugfix_saturation_brightness'


実行コマンドも同梱されている。全部の電球をまとめて点灯消灯はできたけど、1つずつ個別にはできなかった。
これもバグがあるのか未実装なのかわからない。
hue all on
hue all off


色変化なしで、ただ点滅させるだけの例
require 'hue'

hue = Hue::Client.new
light = hue.lights[0]

loop do
light.on = true
sleep 0.5
light.on = false
sleep 0.5
end


HSBをそれぞれランダムに操作する例。hueだけ65536段階設定できる。
require 'hue'

hue = Hue::Client.new
hue.lights.each do |light|
light.on = true
end

loop do
hue.lights.each do |light|
puts light.name
light.hue = rand 65535
light.saturation = rand 255
light.brightness = rand 255
end
sleep 0.1
end


HSBをまとめて指定する例。1命令で全部指定するので実行速度が速い。
set_stateは第2引数に変化の速度を指定できる(100ミリ秒単位)
この例だと明度彩度は固定で、色相のみ0.1秒ごとになめらかに変化させる。
require 'hue'

hue = Hue::Client.new
light = hue.lights[0]

loop do
0.upto 65 do |i|
state = {:on => true, :hue => i*1000, :saturation => 255, :brightness => 255}
p light.set_state state, 1
end
end

Lindaでhue

RocketIO::Lindaでhueを操作できるようにした。まだ電球個別に操作はできないけどそのうちやる。

shokai/linda-hue


hueを触ってみて

色をゆっくり変化させると気づかない。これには一長一短あると思う。
気にならないとも言えるが、何かを通知するには気づかないのは良くないかもしれない。
表現したい物による。

何か集中して作業している状態から、hueに強制的に意識を向けさせるには、パッと色を変えるか、一瞬消灯や点滅させる必要がある。

集中力を切らせずに、いつでもいいからそのうち気づいて欲しい情報を提示するには、色をゆっくり変化させられる機能は重要かも。


hueっぽい物の自作

もう1セットhueがあると2地点に設置できるんだけど、無いので、ソリッドステートリレーとArduinoでhueっぽい物を自作した。
ハロゲンランプだから単色だけど、全力で点滅させるとhueの倍ぐらいの速度でチカチカできる。