module HAP::Client

Public Class Methods

new() click to toggle source
# File lib/hap_client.rb, line 15
def initialize
  @name = "Unknown Client"
  @mode = :init
  @values = {}
  @ids = {}

  @manufacturer = ""
  @model = ""
  @name = ""
  @serial = ""
  @version = ""

  init_request()
  init_log()
end

Public Instance Methods

get_accessories(&block) click to toggle source
# File lib/hap_client.rb, line 71
def get_accessories(&block)
  info("Get Accessories")
  get("/")

  if block_given?
    @callback = block
  end
end
get_id(service_id, characteristic_id) click to toggle source
# File lib/hap_client.rb, line 96
def get_id(service_id, characteristic_id)
  @services.each do |service|
    if service[:type] == service_id
      service[:characteristics].each do |char|
        if char[:type] == characteristic_id
          return char
        end
      end
    end
  end
  return nil
end
get_type(aid, iid) click to toggle source
# File lib/hap_client.rb, line 88
def get_type(aid, iid)
  begin
    return @ids[aid][iid]
  rescue
    return ""
  end
end
get_value(aid, iid) click to toggle source
# File lib/hap_client.rb, line 80
def get_value(aid, iid)
  begin
    return @values[aid][iid][:value]
  rescue
    return ""
  end
end
set_value(aid, iid, value) click to toggle source
# File lib/hap_client.rb, line 31
def set_value(aid, iid, value)
  info("Set Value #{aid}:#{iid} to #{value}")
  data = {
    "characteristics" => [{
                            "aid" => aid.to_i,
                            "iid" => iid.to_i,
                            "value" => value.to_i
                          }]
  }

  put("/characteristics", "application/hap+json", JSON.generate(data))
end
subscribe(&block) click to toggle source
# File lib/hap_client.rb, line 44
def subscribe(&block)
  events = []
  @values.each do |service|
    service[1].each do |val|
      value = val[1]
      if value[:perms].include?("ev")
        info("Subscribe to #{value[:aid]}:#{value[:iid]}")
        events.push({
                      :aid => value[:aid],
                      :iid => value[:iid],
                      :ev => true
                    })
      end
    end
  end

  data = {
    :characteristics => events
  }

  put("/characteristics", "application/hap+json", JSON.generate(data))

  if block_given?
    @callback = block
  end
end
to_s() click to toggle source
# File lib/hap_client.rb, line 109
def to_s
  @name
end

Private Instance Methods

parse_accessories(data) click to toggle source
# File lib/hap_client.rb, line 136
def parse_accessories(data)
  begin
    data = JSON.parse(data, :symbolize_names=>true)
  rescue JSON::ParserError => e
    error(e.inspect)
    error(data)
    return nil
  end

  if data[:accessories]
    @services = data[:accessories][0][:services]

    @services.each do |service|
      @values[service[:type]] = {}
      @ids[service[:iid]] = {}

      parse_characteristics(service)
    end
  elsif data[:characteristics]
    parse_event(data)
    init_parser
  end

  return data
end
parse_characteristics(service) click to toggle source
# File lib/hap_client.rb, line 169
def parse_characteristics(service)
  service[:characteristics].each do |char|
    val = char[:value]

    @values[service[:type]][char[:type]] = {
      :aid => char[:aid],
      :iid => char[:iid],
      :perms => char[:perms],
      :value => val
    }
    @ids[char[:aid]][char[:iid]] = {
      :service => service[:type],
      :characteristic => char[:type]
    }

    if service[:type] == "3E"
      case char[:type]
      when "20"
        @manufacturer = val
      when "21"
        @model = val
      when "23"
        @name = val
      when "30"
        @serial = val
      when "52"
        @version = val
      end
    end
  end
end
parse_event(data) click to toggle source
# File lib/hap_client.rb, line 162
def parse_event(data)
  val = data[:characteristics]
  val.each do |value|
    on_event(value[:aid], value[:iid], value[:value])
  end
end
parse_message(data) click to toggle source
# File lib/hap_client.rb, line 115
def parse_message(data)
  @res_queue.push(1)

  case @mode
  when :pair_setup
    pair_setup_parse(data)
  when :pair_verify
    pair_verify_parse(data)
  else
    if !data.nil? and data != ""
      data = parse_accessories(data)
    end

    if @callback
      t = @callback
      @callback = nil
      t.call(data)
    end
  end
end