class HueBLE

Constants

HUE_BLE_SERVICE_UUID
VERSION

Public Class Methods

add(address, adapter_name: BLE::Adapter.list.first) click to toggle source
# File lib/hue_ble.rb, line 66
def self.add(address, adapter_name: BLE::Adapter.list.first)
  adapter = BLE::Adapter.new(adapter_name)
  device = adapter[address]
  device.trusted = true
  unless device.is_paired?
    begin
      device.pair 
      sleep(3)
      device = adapter[address] # reload
    rescue BLE::NotAuthorized => e
      puts "Failed to pair: #{e}. Please try scanning after power off/on the bulb, getting closer, or resetting it using the smart phone app."
    end
  end
  fail "device does not have Hue Lamp Control service" unless device.services.include?(HUE_BLE_SERVICE_UUID)
  hues[address] = new(device)
end
hues() click to toggle source
# File lib/hue_ble.rb, line 42
def self.hues
  @hues ||= {}
end
new(device) click to toggle source
# File lib/hue_ble.rb, line 105
def initialize(device)
  @device = device
end
scan(adapter_name: BLE::Adapter.list.first, wait: 5) click to toggle source
# File lib/hue_ble.rb, line 46
def self.scan(adapter_name: BLE::Adapter.list.first, wait: 5)
  adapter = BLE::Adapter.new(adapter_name)
  adapter.start_discovery
  sleep(wait)
  adapter.stop_discovery

  unpaired_devices = []
  adapter.devices.each do |address|
    device = adapter[address]
    name = device.name rescue nil
    if name == 'Hue Lamp' && !device.is_paired?
      unpaired_devices << device
    elsif device.services.include?(HUE_BLE_SERVICE_UUID)
      hues[device.address] = new(device)
    end
  end

  { hues: hues, unpaired_devices: unpaired_devices }
end
scan_cli(reset = false) click to toggle source
# File lib/hue_ble.rb, line 83
def self.scan_cli(reset = false)
  puts "Scanning devices ..."
  scan_results = scan(wait: 1)
  puts "Found #{scan_results[:hues].count} Hue devices:"
  scan_results[:hues].each { |address, device| puts "  #{address}  #{device.name}" }

  if @reset
    scan_results[:hues].each { |address, device| device.remove }
    scan_results[:unpaired_devices].each { |device| device.remove }
    return
  end

  scan_results[:unpaired_devices].each do |device|
    print "Found a new #{device.name}  #{device.address} : Do you want to pair? (Y/n)> " 
    STDOUT.flush
    add(device.address) if ["Y", "y", "\n"].include? gets[0]
  end
end

Public Instance Methods

brightness() click to toggle source
# File lib/hue_ble.rb, line 128
def brightness
  connect
  @device[:hue_lamp_control, :brightness]
end
brightness=(value) click to toggle source
# File lib/hue_ble.rb, line 133
def brightness=(value)
  connect
  @device[:hue_lamp_control, :brightness] = value
end
color() click to toggle source
# File lib/hue_ble.rb, line 148
def color
  connect
  @device[:hue_lamp_control, :color]
end
color=(value) click to toggle source
# File lib/hue_ble.rb, line 153
def color=(value)
  connect
  @device[:hue_lamp_control, :color] = value
end
color_temperature() click to toggle source
# File lib/hue_ble.rb, line 138
def color_temperature
  connect
  @device[:hue_lamp_control, :color_temperature]
end
color_temperature=(value) click to toggle source
# File lib/hue_ble.rb, line 143
def color_temperature=(value)
  connect
  @device[:hue_lamp_control, :color_temperature] = value
end
inspect() click to toggle source
# File lib/hue_ble.rb, line 109
def inspect
  "#<HueBLE:#{@device.address}>"
end
off() click to toggle source
# File lib/hue_ble.rb, line 123
def off
  connect
  @device[:hue_lamp_control, :on] = false
end
on() click to toggle source
# File lib/hue_ble.rb, line 118
def on
  connect
  @device[:hue_lamp_control, :on] = true
end
on?() click to toggle source
# File lib/hue_ble.rb, line 113
def on?
  connect
  @device[:hue_lamp_control, :on]
end