Denon discovery is a small helper template for Denon HEOS products. It does not scan the network for devices: it connects to one HEOS player at the IP address entered during import, asks the HEOS CLI (Command Line Interface) for the list of players in the HEOS system and stores the player ID (pid) of the first player in that list. The player commands of the HEOS CLI (heos://player/...) address a player by this pid.
The template contains one module with a single variable, Denon player id. It has no volume, mute or playback control.
The template always reads the first entry of the player list (
payload[0].pid). In a HEOS system with several players it shows only that onepid— the HEOS CLI specification does not define the order of the list, so the first entry is not necessarily the speaker whose IP address was entered.
Full control of a HEOS player, and selecting a player from the list by its index (service actions Get Players and Set Player Id), is provided by the main Denon HEOS template. Denon discovery only reads the pid.
Preparing the HEOS device
The HEOS CLI is part of the HEOS firmware; there is nothing to enable on the device and no extra hardware. The template is built against HEOS CLI v1.17, which corresponds to HEOS version 2.41.140.
- Install the HEOS App (Android / iOS) on a phone or tablet in the same network and finish the initial setup of the HEOS device, so that it is connected to Wi-Fi or Ethernet. The CLI is not available until this setup is complete.
- Find the IP address of the HEOS device — in the HEOS app under Settings → My Devices → About, or in the DHCP client list of the router. HEOS products also announce themselves on the LAN over UPnP SSDP (search target
urn:schemas-denon-com:device:ACT-Denon:1). - Reserve that address in the router (DHCP reservation) or set a static IP, so that it does not change after a DHCP renewal.
- Make sure the TapHome Core can reach the HEOS device on TCP port 1255 — same LAN or routed subnet, no firewall blocking the port.
One HEOS device is enough: a connection to a single HEOS speaker gives access to every HEOS player in the network, so get_players returns all of them.
The HEOS CLI has no login of its own — any device that can reach TCP port 1255 can send commands to the HEOS system. Keep the HEOS products on a trusted network segment.
Configuration
During import into the Packet Parser interface of the TapHome app, enter the IP address of the HEOS device in the IP address parameter; the port and message framing are already set in the template.
| Setting | Value |
|---|---|
| Transport | TCP, port 1255 |
| Message delimiter | \r\n for commands and responses |
| Connection | opened for each reading, not kept open (StayConnected off) |
| Reading interval | 15 s |
| Command sent | heos://player/get_players |
| Value stored | payload[0].pid from the JSON response |
The response of get_players is a JSON object with a heos header (command, result, message) and a payload array with one entry per player. Each entry carries name, pid, model, version and network (wired or wifi), plus lineout, and depending on the device gid (only when the player is part of a group), control and serial. The template keeps only the pid of the first entry.
Device capabilities
Denon player id
Denon player id is a variable that holds the HEOS player ID read from the first entry of the get_players response. It is refreshed every 15 seconds, so it follows the HEOS system when the list changes. The template has no write script for this variable — it is meant for reading only.
The value can be used wherever a HEOS pid is needed, for example when a heos://player/* command is sent from another Packet Parser module. When the full Denon HEOS template is in use, this helper is not needed — its Get Players and Set Player Id service actions already list the players and bind the module to the chosen one.
Troubleshooting
Denon player id stays empty after import
A HEOS speaker runs the CLI in a dormant mode and starts it only when the first TCP connection arrives. Right after that the CLI may not yet be able to answer player commands, because it first has to discover all players in the network. Wait for a few reading cycles (15 s each). Because this template closes the connection after every reading, the CLI can fall back to dormant mode between readings; the first readings after a longer pause may therefore stay empty as well.
If the value never appears, check that:
- The IP address in the module still belongs to the HEOS device (DHCP reservation or static IP).
- TCP port 1255 is reachable from the TapHome Core — same LAN, no firewall in between.
- The HEOS device is fully online in the HEOS app.
The value belongs to a different speaker
The template stores the pid of the first player in the list, which is not necessarily the speaker at the entered IP address. With several HEOS players use the main Denon HEOS template, whose Get Players service action shows the whole list (name, pid, model) and whose Set Player Id selects the player by its 0-based index.
The pid changed
HEOS assigns pid values to the players in the network. If a speaker was factory-reset or replaced, it can get a new pid; Denon player id shows the new value on the next reading, but a value copied elsewhere must be updated by hand.
Denon