require 'savon' require 'sonos/endpoint' module Sonos::Device # Used for PLAY:3, PLAY:5, PLAYBAR, SUB, CONNECT and CONNECT:AMP class Speaker < Base include Sonos::Endpoint::AVTransport include Sonos::Endpoint::Rendering include Sonos::Endpoint::Device include Sonos::Endpoint::ContentDirectory include Sonos::Endpoint::Upnp include Sonos::Endpoint::Alarm MODELS = { :'S1' => 'PLAY:1', # Released Oct 2013 :'S3' => 'PLAY:3', # Released Jul 2011 :'S5' => 'PLAY:5', # Released Nov 2009 :'S9' => 'PLAYBAR', # Released Feb 2013 :'Sub' => 'SUB', # Released May 2012 :'ZP80' => 'ZP80', # Released Apr 2006 :'ZP90' => 'CONNECT', # Released Aug 2008 :'ZP100' => 'ZP100', # Released Jan 2005 :'ZP120' => 'CONNECT:AMP' # Released Aug 2008 }.freeze def self.models MODELS end def speaker? services.include?('urn:upnp-org:serviceId:MusicServices') end def shuffle_on shuffle_repeat_change("shuffle_on") end def shuffle_off shuffle_repeat_change("shuffle_off") end def repeat_on shuffle_repeat_change("repeat_on") end def repeat_off shuffle_repeat_change("repeat_off") end def crossfade_on set_crossfade(true) end def crossfade_off set_crossfade(false) end def shuffle_repeat_change(command) status = get_playmode case command when "shuffle_on" status[:shuffle] = true; when "shuffle_off" status[:shuffle] = false; when "repeat_on" status[:repeat] = true; when "repeat_off" status[:repeat] = false; end set_playmode(status) end def set_playmode(status = {:shuffle => false, :repeat => false}) send_transport_message('SetPlayMode', "SHUFFLE") if (status[:shuffle] && status[:repeat] ) send_transport_message('SetPlayMode', "SHUFFLE_NOREPEAT") if (status[:shuffle] && !status[:repeat]) send_transport_message('SetPlayMode', "REPEAT_ALL") if (!status[:shuffle] && status[:repeat] ) send_transport_message('SetPlayMode', "NORMAL") if (!status[:shuffle] && !status[:repeat]) end def set_crossfade(crossfade) crossfade_value = crossfade ? 1 : 0 send_transport_message('SetCrossfadeMode', "0#{crossfade_value}") end def get_playmode doc = Nokogiri::XML(open("http://#{self.group_master.ip}:#{Sonos::PORT}/status/playmode")) playmode = {} playmode[:shuffle] = doc.xpath('//Shuffle').inner_text == "On" playmode[:repeat] = doc.xpath('//Repeat').inner_text == "On" playmode[:crossfade] = doc.xpath('//Crossfade').inner_text == "On" playmode end end end