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 that you accept 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/formiPhoneAp...t.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/formiPhoneAp...t.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:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
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: