lib/sonos/device/speaker.rb in sonos-0.3.3 vs lib/sonos/device/speaker.rb in sonos-0.3.4
- old
+ new
@@ -1,25 +1,96 @@
require 'savon'
require 'sonos/endpoint'
module Sonos::Device
- # Used for PLAY:3, PLAY:5, and CONNECT
+ # 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
- MODEL_NUMBERS = ['S3', 'S5', 'S9', 'ZP90', 'Sub']
+ 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
- attr_reader :icon
-
- def self.model_numbers
- MODEL_NUMBERS
+ def self.models
+ MODELS
end
def speaker?
true
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', "<NewPlayMode>SHUFFLE</NewPlayMode>") if (status[:shuffle] && status[:repeat] )
+ send_transport_message('SetPlayMode', "<NewPlayMode>SHUFFLE_NOREPEAT</NewPlayMode>") if (status[:shuffle] && !status[:repeat])
+ send_transport_message('SetPlayMode', "<NewPlayMode>REPEAT_ALL</NewPlayMode>") if (!status[:shuffle] && status[:repeat] )
+ send_transport_message('SetPlayMode', "<NewPlayMode>NORMAL</NewPlayMode>") if (!status[:shuffle] && !status[:repeat])
+ end
+
+ def set_crossfade(crossfade)
+ crossfade_value = crossfade ? 1 : 0
+ send_transport_message('SetCrossfadeMode', "<InstanceID>0</InstanceID><CrossfadeMode>#{crossfade_value}</CrossfadeMode>")
+ 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