Hue をいままで API を叩いて操作したことが無かったのメモ。Hue は外部からの接続には LAN 経由での http で、ブリッジと電球の間には ZigBee のネットワークを用いて通信してる。ふつうに API を叩くには LAN 経由でやれば良い。
hue gem を使う
hue gem を使うと CUI や Ruby から叩けて便利。
gem install hue
hue all on
# 一回目は Hue のブリッジにあるボタンを押す
なお cli の裏側では
- https://www.meethue.com/api/nupnp を叩いてブリッジのインターナルIPを取得
- http://#{ブリッジのIP}/api に username を POST して user を作る(hue cli だと現在 1234567890 というユーザ名で作る)
して IP の取得、user の作成を行ってる。また API ドキュメントは hue の developer program に登録しないと見れないのだけど、各種電球の操作から、グルーピング、シーン(hue のスマフォアプリにあるアレ、個人的には使いにくい…)、スケジューリング等々を行うことができる。
また色は RGB でなく、hue(色相), brightness(明度), saturation(彩度)の HSB をセットする必要がある。これは大本の hue API がその値で受け付けるからである。
# くらい赤
hue all --hue 65535 --brightness 10 --saturation 255
# 明るい白
hue all --hue 0 --brightness 255 --saturation 255
Ruby から叩く
lights で全電球がとれるのでそれを叩く。
require 'hue'
lights = Hue::Client.new.lights
loop do
lights.each do |light|
state = {
on: true,
hue: rand(Hue::Light::HUE_RANGE),
saturation: rand(Hue::Light::BRIGHTNESS_RANGE),
brightness: rand(Hue::Light::SATURATION_RANGE)
}
# set_state で状態を更新する。第二引数はどれだけの時間をかけて電球の色を変化させるか。
# 1 = 100ms でデフォルトは 4(400ms)
light.set_state(state, 10)
end
sleep 1
end
RGB で色指定したい
なじみ深い RGB で指定したい。color gem を使うと RGB <=> HSL 変換ができるので、それを Hue::Light と繋ぎやすいインターフェイスを作る。
require 'hue'
require 'color'
module ToHSB
def to_hsb
{
hue: (hue * (65536 / 360)).to_i,
brightness: (brightness * 255.0).to_i,
saturation: (saturation * 2.55).to_i
}
end
end
Color::HSL.include(ToHSB)
これで、RGB で指定できるように。
hsb = Color::RGB.new(255, 255, 0).to_hsl.to_hsb
state = { on: true }.merge(hsb)
light.set_state(state)
追記: とおもったら G の色がうまくいってない…