class DenonAvr::Receiver::Zone

Attributes

input[R]
muted[R]
name[R]
power[R]
status[R]
volume[R]

Public Class Methods

new(receiver:, name: 'MainZone') click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 6
def initialize(receiver:, name: 'MainZone')
  @receiver = receiver
  @name = name
  get_status
end

Public Instance Methods

get_status() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 101
def get_status
  res = send_command(path: urls.status_lite)
  status_items = res.parsed_response&.fetch('item', {})
  @status = status_items.each{|k,v| status_items[k] = v['value']}
  @input = @receiver.source_list.invert[@status['InputFuncSelect']] || @status['InputFuncSelect']
  @power = @status['Power']
  @muted = @status['Mute'] == 'on' ? true : false
  @volume = parse_volume(res.parsed_response)
end
input=(input) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 82
def input=(input)
  begin
    if set_input(input).success?
      @muted = true
    else
      false
    end
  rescue UnknownSourceError
    false
  end
end
inspect() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 111
def inspect
  instance_variables_to_list = [:@name, :@volume, :@input, :@power, :@muted]
  instance_vars_string = instance_variables_to_list.map { |v|
    "#{v.to_s}=#{instance_variable_get(v).inspect}"
  }.join(', ')
  "\#<#{self.class}:#{self.object_id.to_s(16).rjust(2, '0')} #{instance_vars_string}>"
end
mute() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 57
def mute
  send_command(path: urls.command_mute_on)
end
mute=(new_mute_state) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 41
def mute=(new_mute_state)
  if new_mute_state === true
    if mute.success?
      @muted = true
    else
      nil
    end
  elsif new_mute_state === false
    if unmute.success?
      @muted = false
    else
      nil
    end
  end
end
muted?() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 65
def muted?
  muted
end
power=(power) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 12
def power=(power)
  power = :on if power === true
  power = :off if power === false
  power = power.downcase.to_sym
  return false unless [:on, :off].include?(power)
  case power
  when :on
    if power_on.success?
      @power = POWER_ON
    else
      false
    end
  when :off
    if power_off.success?
      @power = POWER_OFF
    else
      false
    end
  end
end
power_off() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 37
def power_off
  send_command(path: urls.command_power_standby)
end
power_on() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 33
def power_on
  send_command(path: urls.command_power_on)
end
set_input(input) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 94
def set_input(input)
  if @receiver.source_list[input].nil?
    raise UnknownSourceError.new("#{input} is not in the receiver's source mapping")
  end
  send_command(path: "#{urls.command_sel_src}#{@receiver.source_list[input]}")
end
set_volume(volume) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 78
def set_volume(volume)
  send_command(path: sprintf(urls.command_set_volume, (volume.to_f - 80.0)))
end
unmute() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 61
def unmute
  send_command(path: urls.command_mute_off)
end
volume=(new_volume) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 69
def volume=(new_volume)
  res = set_volume(new_volume)
  if res.success?
    @volume = parse_volume(res.parsed_response)
  else
    false
  end
end

Private Instance Methods

app_command(host: @host, commands: []) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 136
def app_command(host: @host, commands: [])
  @receiver.app_command(commands)
end
parse_volume(xml_response) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 140
def parse_volume(xml_response)
  volume_display = xml_response.fetch('item', nil)&.fetch('VolumeDisplay', nil)
  volume_display = volume_display.fetch('value', nil) if volume_display.is_a? Hash
  master_volume = xml_response.fetch('item', nil)&.fetch('MasterVolume', nil)
  master_volume = master_volume.fetch('value', nil) if master_volume.is_a? Hash
  master_volume = master_volume.to_f
  if volume_display == 'Absolute'
    master_volume = 80.0 + master_volume
  end
end
send_command(path:, body: nil, method: :get) click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 132
def send_command(path:, body: nil, method: :get)
  @receiver.send_command(path: path, body: body, method: method)
end
urls() click to toggle source
# File lib/denon_avr/receiver/zone.rb, line 121
def urls
  case name
  when 'MainZone'
    MAIN_URLS
  when 'Zone2'
    ZONE2_URLS
  when 'Zone3'
    ZONE3_URLS
  end
end