Nuvo Grand Concerto / Essentia G
Multi-zone audio amplifier driver for the Nuvo (Legrand) family of installer-grade amps: the Grand Concerto (16 zones), the original Concerto (12 zones), and the smaller Essentia G (6 zones). The driver speaks Nuvo's published ASCII integrator protocol over a TCP socket — typically against a serial-over-IP gateway sitting in front of the amplifier's 9-pin port.
Prerequisites
- A Nuvo amplifier: Grand Concerto (NV-I8G / NV-I8GMS), Concerto (NV-I8), or Essentia G (NV-E6G).
- A serial-over-IP gateway wired to the amp's "Integrator" or "RS-232" DB-9 port. Anything that supports transparent TCP server mode works — Brainboxes ES-313 / ES-279, Global Cache GC-100, USR-IOT USR-TCP232 / USR-N510, Moxa NPort 5110, etc.
- The gateway configured for 57600 baud, 8 data bits, no parity, 1 stop bit, no flow control, in transparent TCP server mode.
- The gateway's TCP port reachable on the LAN from the GEM controller.
The Nuvo amps themselves do not have an Ethernet jack — even the units that ship with a "Concierge IP" accessory expose the same ASCII protocol on TCP, so this driver covers both retrofits (USB-Serial gateway) and the factory IP modules.
Setup
- Verify the gateway is talking to the amp. From a workstation,
telnet <gateway-ip> <port>and send*Z01STATUSfollowed by carriage-return. You should see a line starting with#Z01PWR…come back within a second or two. If nothing comes back, the gateway's serial parameters are wrong or the RX/TX pair is reversed. - Add a GEM device. In
/admin/devices, create a new device of driver type nuvo_concerto and set:ip— the gateway IPport— the gateway TCP port (5006 is the driver default; Brainboxes typically uses 9001, GC-100 uses 4999, USR-IOT uses 8234)max_zones— 16 for Grand Concerto, 12 for Concerto, 6 for Essentia G
- Enable the device. The driver will open the TCP socket, query every zone's status once, then keep state in sync via a 60-second polling loop. The amplifier also emits unsolicited status lines on user changes (front-panel keypad, app, IR), which the driver picks up immediately.
- Create one GEM zone per amplifier zone. zone.address is the Nuvo zone number as a plain integer —
1through your amp's max. Once the zone exists, the driver will start writingstate,volume,source, andmute_stateattributes onto it. - (Optional) Create AV sources. If you want named source switching in the UI (e.g. "Sonos", "Apple TV", "Tuner") rather than raw indices 1-6, create an AV source row for each input you have wired and key it to the absolute source number.
Attribute reference
Device
| Attribute | Required | Default | Description |
|---|---|---|---|
ip | yes | — | Gateway IP address |
port | yes | 5006 | Gateway TCP port |
max_zones | no | 16 | Upper bound for get_zones discovery |
status_interval | no | 60000 | Backstop poll interval in ms |
command_throttle | no | 120 | Minimum gap between outbound commands in ms — do not drop below 100 |
Zone
| Attribute | Required | Description |
|---|---|---|
address | yes | Nuvo zone number 1-16 as a plain integer |
The driver writes state (on/off), volume (0-100), source (1-6), and mute_state (on/off) onto each GEM zone as it sees status arrive.
Zone address format
A single integer matching the physical Nuvo zone number on the amplifier:
1 2 3 … 16
Pad and Z-prefix are added internally — write 5 in the admin UI, not Z05.
Commands implemented
on/off— per-zone powerall_off— every zone on the ampset_volume— GEM 0-100 scale; the driver inverts and scales to the native 0-79 wire formatvolume_up/volume_downmute_on/mute_off/mute_toggleset_source— absolute source index 1-6get_zone_status— force a status read on one zoneget_zones— poll every zone up tomax_zonesand return the discovered list
Known limitations
- Native Nuvo volume is inverted (0 = loudest, 79 = mute). The driver hides this — GEM's
volumeattribute is always 0-100 with 100 = loudest, scaled on both the way in and the way out. If you ever see raw0-79values it means a UI consumer is bypassing the conversion. - Source switching is by index, not label. The Nuvo amp has no software way to label its source inputs; the on-amp labels are silkscreen only. Name your AV sources in GEM to whatever's wired to that input.
- No EQ exposure yet. Bass, treble, balance, and DND/group commands are part of the protocol but not surfaced in
getCommands()for this release. - No scene/group support yet. Nuvo supports linking zones into groups via
*ZxxGRPx; that surface is not yet wired through this driver.
Troubleshooting
| Symptom | Check |
|---|---|
| No response from amp | Telnet to the gateway and send *Z01STATUS\r manually. No reply → gateway is not at 57600 8N1 or the TX/RX pair is reversed. |
| Power state updates but volume doesn't | The status line is being truncated. Try raising command_throttle to 150-200ms — a too-fast gateway buffer can fragment the response. |
| Live updates lag by 60s | Unsolicited status from the amp isn't reaching the gateway. Confirm response_terminator is \r (driver default) — some gateways inject CRLF and the parser depends on the bare CR framing. |
| Wrong volume scale in the slider | A control is reading the raw Nuvo 0-79 value instead of the GEM volume attribute. Always read volume (0-100) off the zone, never the wire value. |
| Commands accepted but the amp ignores some zones | Confirm max_zones matches the physical amp. Sending *Z14ON to an Essentia G (which only has 6 zones) is silently ignored. |