This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

Denon AVR X2300W control via API
#1
Hello everyone,

Maybe someone here have succesfully integrated Denon AVR X2300W with logicmachine? I mean, there are couple of scripts out here in forum and one in the openrb website, but those scripts differ and there is no clear indication whether they work or not. I will have to integrate such functionality:

  • ON
  • OFF
  • VOLUME ON
  • VOLUME OFF
  • VOLUME SET
  • MUTE ON
  • MUTE OFF
  • SOURCE INPUT SELECTION
As I do not have the AVR at the moment I just can prepare the script for it and only then test it, but I will have not a lot of time. So, maybe someone who has succesfully integrated such AVR could share some code examples?

Thanks in advance!
Reply
#2
Looks like newer models can be controlled via HTTP like this:
http://DENON_IP:8080/goform/formiPhoneAppDirect.xml?PWON
I'm not sure if status response can be received this way, you might need to use Telnet instead of HTTP.
Reply
#3
(22.06.2020, 10:57)admin Wrote: Looks like newer models can be controlled via HTTP like this:
http://DENON_IP:8080/goform/formiPhoneAppDirect.xml?PWON
I'm not sure if status response can be received this way, you might need to use Telnet instead of HTTP.
I got the post commands working as admin said above,
This also might help I did get feedback with this script, using xpat to parse XML I got it working but never completed it properly,
Even with it running in an resident script with 1 sec delay the feedback was to slow for me, the impatient so I ended up using telnet 
Code:
local http = require("socket.http")
local ltn12 = require("ltn12")

  local path = "http://192.168.1.13/goform/AppCommand.xml"
 
  local payload = [[
<?xml version="1.0" encoding="utf-8"?>
<tx>
  <cmd id="1">GetAllZonePowerStatus</cmd>
  <cmd id="1">GetAllZoneVolume</cmd>
  <cmd id="1">GetAllZoneSource</cmd>
  <cmd id="1">GetAllZoneMuteStatus</cmd>
</tx>
]]


         --"cmd0=PutMasterVolumeBtn%2F%3E&cmd1=aspMainZone_WebUpdateStatus%2F"
         --"cmd0=PutZone_InputFunction%2FTV&cmd1=aspMainZone_WebUpdateStatus%2F"

  local response_body = { }

  local res, code, response_headers, status = http.request
  {
    url = path,
    method = "POST",
    headers =
    {
      ["Accept"] = "*/*",
      ["Content-Type"] = "application/x-www-form-urlencoded",
      ["Content-Length"] = payload:len()
    },
    source = ltn12.source.string(payload),
    sink = ltn12.sink.table(response_body)
  }


itemtag = false
result = {}

-- callback for tag start
function starttag(parser, tag)
  -- create new storage in result table for each <item> tag
  if tag == 'zone1' then
    itemtag = true
    table.insert(result, {})
  end

  currtag = tag
end

-- callback for tag end
function endtag(p, tag)
  if tag == 'zone1' then
    itemtag = false
  end

  currtag = nil
end

-- callback for character data
function cdata(parser, text)
  -- check if parser is inside of <item> and either in <title> or <description>
  if itemtag and currtag then
    if currtag == 'zone1' then
      result[ #result ].Z1= text
     
    elseif currtag == 'dispvalue' then
      result[ #result ].Z1_Volume = text
     
    elseif currtag == 'source' then
      result[ #result ].Z1_source = text
    end
   
  end
end

-- create parser
lxp = require('lxp')
parser = lxp.new({
  StartElement = starttag,
  EndElement = endtag,
  CharacterData = cdata,
})

if parser:parse(data) then
  -- Zone 1 State
  if (result [1].Z1) == 'ON'then
  —-update group
  end
 
  if (result [1].Z1) == 'OFF'then
    —update group
  end

  -- Zone 1 Volume
  if(result [2].Z1_Volume) ~= last then
    —set new volume to group
     last = result [2].Z1_Volume
  end
 
else
  log('parse failed')
end
Reply
#4
Thank You guys!

I've managed to make control script with method admin posted and I've managed to make a status script from this example: https://openrb.com/example-use-lm2-as-tc...e-theater/ it is a bit slow, but it is more than fine for the client.
Reply


Forum Jump: