LoginSignup
10
10

More than 5 years have passed since last update.

Hue 電球を Ruby から操作する

Last updated at Posted at 2015-09-21

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 の色がうまくいってない…

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10