Project Overview

The ‘circuitpython-denon-remote-control’ project is written in CircuitPython to control a Denon audio-video receiver wirelessly. The hardware is then embedded in a 3D printed speaker stand, which is built for AudioEngine P4 and A5 speakers.

View the source code on GitHub which also includes the 3D printer design files.


I originally wrote a similar app called pi-dial using the denonavr Python library and a Raspberry Pi in a 3D printed case to control my Denon receiver’s Zone 2. After creating the speakerstand-lights project that embedded a Feather and Featherwing in a speakerstand, I still had one speaker stand left without anything in it. When Adafruit released theESP32-S2 Reverse TFT Feather inspiration struck as it was perfect for my needs.

Parts Needed

CircuitPython Code

The code is hardwired to Zone 2, but could easily work with your main zone. When possible, I tried to use the serial commands over telnet and not the XML post requests. If you’re controlling Zone 1, you can query the volume directly over serial instead of XML, which can sometimes time out.

I used the three buttons on the front of the Reverse TFT Feather to control my AUX1, Tuner, and CD inputs. The if statement changes the display name as I use the CD input for my phono pre-amp so I renamed it “Vinyl” and AUX1 I use for “CD”.

The rotary encoder changes the volume up and down and the button mutes and unmutes the receiver as well as displaying a white screen with big letters saying “MUTED” to remind me to unmute it.

3D Printing New Speaker Stands

I re-used my speakerstand design from the speakerstand-lights project using OnShape. I don’t have any experience with CAD and it shows, especially where the cables lay inside. I hope to re-design this properly some time in the future. Included are all the files you would need, including a normal speaker stand with rounded edges and an angled version. The embedded version includes an STL file, STEP, and 3MF.

You will need to print the Reverse TFT front plate from BlitzCityDIY’s Octoprint enclosure project and attach it using 2 M2 and 2 M2.5 screws.


  • This project couldn’t have been completed without the denonavr Python library. Everything I needed was well documented for the XML queries. Denon’s serial control protocol is well documented, though there are far fewer Zone2 commands.
  • BlitzcityDIY for her Octoprint enclosure which also featured a square faceplate for the ESP32-S2 Reverse TFT Feather.
  • Neradoc for porting ElementTree to CircuitPython for parsing XML.