class Hue::Client

Attributes

username[R]

Public Class Methods

new(username = nil) click to toggle source
# File lib/hue/client.rb, line 8
def initialize(username = nil)
  @bridge_id = nil
  @username = username || find_username

  if @username
    begin
      validate_user
    rescue Hue::UnauthorizedUser
      register_user
    end
  else
    register_user
  end
end

Public Instance Methods

add_lights() click to toggle source
# File lib/hue/client.rb, line 54
def add_lights
  bridge.add_lights
end
bridge() click to toggle source
# File lib/hue/client.rb, line 23
def bridge
  @bridge_id = find_bridge_id unless @bridge_id
  if @bridge_id
    bridge = bridges.select { |b| b.id == @bridge_id }.first
  else
    bridge = bridges.first
  end
  raise NoBridgeFound unless bridge
  bridge
end
bridges() click to toggle source

Patched by Jordan Hollinger to remove use of “curb” gem TODO handle redirects? That's what curb was used for.

# File lib/hue/client.rb, line 36
def bridges
  req = Net::HTTP::Get.new(URI("https://www.meethue.com/api/nupnp"))
  resp = Net::HTTP.start req.uri.host, req.uri.port, {use_ssl: true} do |http|
    http.request req
  end

  JSON(resp.body).lazy.map { |x|
    Bridge.new(self, x)
  }

rescue Net::OpenTimeout, Net::ReadTimeout, JSON::ParserError
  []
end
group(id = nil) click to toggle source
# File lib/hue/client.rb, line 67
def group(id = nil)
  return Group.new(self, bridge) if id.nil?

  id = id.to_s
  groups.select { |g| g.id == id }.first
end
groups() click to toggle source
# File lib/hue/client.rb, line 63
def groups
  bridge.groups
end
light(id) click to toggle source
# File lib/hue/client.rb, line 58
def light(id)
  id = id.to_s
  lights.select { |l| l.id == id }.first
end
lights() click to toggle source
# File lib/hue/client.rb, line 50
def lights
  bridge.lights
end
scene(id) click to toggle source
# File lib/hue/client.rb, line 78
def scene(id)
  id = id.to_s
  scenes.select { |s| s.id == id }.first
end
scenes() click to toggle source
# File lib/hue/client.rb, line 74
def scenes
  bridge.scenes
end

Private Instance Methods

find_bridge_id() click to toggle source
# File lib/hue/client.rb, line 126
def find_bridge_id
  return ENV['HUE_BRIDGE_ID'] if ENV['HUE_BRIDGE_ID']

  json = JSON(File.read(File.expand_path('~/.hue')))
  json['bridge_id']
rescue
  return nil
end
find_username() click to toggle source
# File lib/hue/client.rb, line 85
def find_username
  return ENV['HUE_USERNAME'] if ENV['HUE_USERNAME']

  json = JSON(File.read(File.expand_path('~/.hue')))
  json['username']
rescue
  return nil
end
get_error(error) click to toggle source
# File lib/hue/client.rb, line 135
def get_error(error)
  # Find error class and return instance
  klass = Hue::ERROR_MAP[error['type']] || UnknownError unless klass
  klass.new(error['description'])
end
register_user() click to toggle source
# File lib/hue/client.rb, line 108
def register_user
  body = JSON.dump({
    devicetype: 'Ruby'
  })

  uri = URI.parse("http://#{bridge.ip}/api")
  http = Net::HTTP.new(uri.host)
  response = JSON(http.request_post(uri.path, body).body).first

  if error = response['error']
    raise get_error(error)
  end

  if @username = response['success']['username']
    File.write(File.expand_path('~/.hue'), JSON.dump({username: @username}))
  end
end
validate_user() click to toggle source
# File lib/hue/client.rb, line 94
def validate_user
  response = JSON(Net::HTTP.get(URI.parse("http://#{bridge.ip}/api/#{@username}")))

  if response.is_a? Array
    response = response.first
  end

  if error = response['error']
    raise get_error(error)
  end

  response['success']
end