class Sonos::Device::Base

Attributes

group[R]
group_master[RW]
hardware_version[R]
icon[R]
ip[R]
mac_address[R]
model_number[R]
name[R]
serial_number[R]
services[R]
software_version[R]
uid[R]
zone_type[R]

Public Class Methods

detect(ip) click to toggle source
# File lib/sonos/device/base.rb, line 11
def self.detect(ip)
  data = retrieve_information(ip)
  model_number = data[:model_number]

  # TODO: Clean up
  if Accessory.models.keys.include?(model_number.to_sym)
    Accessory.new(ip, data)
  elsif Speaker.models.keys.include?(model_number.to_sym)
    Speaker.new(ip, data)
  else
    raise ArgumentError.new("#{data[:model_number]} not supported")
  end
end
new(ip, data = nil) click to toggle source
# File lib/sonos/device/base.rb, line 25
def initialize(ip, data = nil)
  @ip = ip

  if data.nil?
    self.data = Base.retrieve_information(ip)
  else
    self.data = data
  end
end

Protected Class Methods

parse_description(doc) click to toggle source

Get information about the device

# File lib/sonos/device/base.rb, line 83
def self.parse_description(doc)
  {
    name: doc.xpath('/xmlns:root/xmlns:device/xmlns:roomName').inner_text,
    uid: doc.xpath('/xmlns:root/xmlns:device/xmlns:UDN').inner_text,
    serial_number: doc.xpath('/xmlns:root/xmlns:device/xmlns:serialNum').inner_text,
    software_version: doc.xpath('/xmlns:root/xmlns:device/xmlns:hardwareVersion').inner_text,
    hardware_version: doc.xpath('/xmlns:root/xmlns:device/xmlns:softwareVersion').inner_text,
    zone_type: doc.xpath('/xmlns:root/xmlns:device/xmlns:zoneType').inner_text,
    model_number: doc.xpath('/xmlns:root/xmlns:device/xmlns:modelNumber').inner_text,
    services: doc.xpath('/xmlns:root/xmlns:device/xmlns:serviceList/xmlns:service/xmlns:serviceId').
      collect(&:inner_text)
  }
end
retrieve_information(ip) click to toggle source
# File lib/sonos/device/base.rb, line 77
def self.retrieve_information(ip)
  url = "http://#{ip}:#{Sonos::PORT}/xml/device_description.xml"
  parse_description(Nokogiri::XML(open(url)))
end

Public Instance Methods

data() click to toggle source
# File lib/sonos/device/base.rb, line 46
def data
  {
    name: @name,
    uid: @uid,
    serial_number: @serial_number,
    software_version: @software_version,
    hardware_version: @hardware_version,
    zone_type: @zone_type,
    model_number: @model_number,
    services: @services
  }
end
data=(data) click to toggle source
# File lib/sonos/device/base.rb, line 35
def data=(data)
  @name = data[:name]
  @uid = data[:uid]
  @serial_number = data[:serial_number]
  @software_version = data[:software_version]
  @hardware_version = data[:hardware_version]
  @zone_type = data[:zone_type]
  @model_number = data[:model_number]
  @services = data[:services]
end
model() click to toggle source

Get the device’s model @return [String] a string representation of the device’s model

# File lib/sonos/device/base.rb, line 61
def model
  self.class.models[@model_number.to_sym]
end
speaker?() click to toggle source

Can this device play music? @return [Boolean] a boolean indicating if it can play music

# File lib/sonos/device/base.rb, line 67
def speaker?
  false
end

Protected Instance Methods

parse_response(response) click to toggle source
# File lib/sonos/device/base.rb, line 73
def parse_response(response)
  response.success? ? :success : :failed
end