AudioControl Rialto
The audiocontrol_rialto driver controls AudioControl Rialto network-streaming
amplifiers over TCP. It drives power, volume, mute, input selection, Accubass, and
the headphone output. Each Rialto is a single stereo audio zone, so one device
equals one amplifier equals one listening area — there is no per-output routing.
Control uses the Rialto's plain-text ASCII command protocol: short commands such as
vol+, mute!, and power1, each terminated with a carriage return.
AudioControl ships several products with separate GEM drivers. Pick the one that matches your hardware:
- Rialto (this page) — a single-zone streaming amplifier controlled with plain-text commands over TCP.
- AudioControl Multi-Zone Amplifier (
audiocontrol) — a whole-house matrix amp that auto-creates a GEM zone per output. - AudioControl Maestro (
audiocontrol_maestro) — a home-theater processor/receiver using a binary hex protocol.
Prerequisites
- Rialto amplifier on the same LAN as GEM, reachable at a static IP or DHCP reservation.
- IP control enabled on the Rialto and the TCP port it is configured for.
Read the port off the unit's network setup — there is no fixed default; the
factory examples commonly use
23. - Only one control point at a time. The Rialto accepts a small number of simultaneous IP-control sessions, so a mobile app or a second controller talking to it at the same time as GEM will fight over state.
Setup
- System → Devices → Add Device. Choose the AudioControl Rialto driver.
- Fill in Amplifier IP and TCP Port. The port must match the IP-control port shown in the Rialto's network setup. Save and enable.
- On connect the driver begins polling the amp for volume, power, and
mute on the status interval (default every 30 s), spacing the three queries
about a second apart so it doesn't flood the amp. Those values land on the
device as the
volume,power, andmute_stateattributes.
The Rialto does not need a zone address — one device is one audio zone. You can still create a plain zone bound to the device if you want a simple on/volume tile, but for AV routing and touchpanel control, bind an AV Zone instead (next section).
Using the Rialto as an AV Zone
To drive the Rialto's volume and mute from an AV touchpanel:
- AV → AV Zones → create (or bind) an AV Zone for the listening area.
- Set the AV Zone's Volume Device to the Rialto device. The AV Zone's volume slider and mute button then drive the amplifier directly.
- Reload the device after binding. The driver looks up which AV Zones name it as their Volume Device once, at connect time, so it knows where to echo live volume/mute back to. After you add or change a Volume Device binding, reload the Rialto device (or restart) so it picks up the zone and the slider tracks changes made from the amp itself.
Once bound, the driver keeps the AV Zone's on-screen volume and mute in sync with the amplifier — including changes made outside GEM that it sees on the next status poll.
The Rialto is an amplifier, not a switcher — it has an input select but no matrix
routing. If a touchpanel needs to pick what's playing, drive that from the AV
Source's on/off macros (put the correct input command in the source's On Macro),
not from the Rialto's zone. See AV Sources.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP of the Rialto amplifier. |
port | int | Rialto IP-control TCP port. No fixed default — match the unit's network setup. |
Device — optional (inherited TCP tunables)
| Attribute | Type | Default | Description |
|---|---|---|---|
status_interval | int (ms) | 30000 | How often the driver polls volume / power / mute. Lower it for snappier feedback at the cost of more traffic. |
command_throttle | int (ms) | 200 | Minimum spacing between outbound commands. |
Reflected device attributes
The driver writes live state onto the device. When an AV Zone uses the Rialto
as its Volume Device, volume and mute_state are also mirrored onto that zone.
| Attribute | Type | Values |
|---|---|---|
power | string | on / off |
volume | int | Current volume, 0–100 (see the scaling note) |
mute_state | string | on / off |
input | string | Currently selected input token |
phones | string | Headphone output on / off |
Only volume, power, and mute are polled on the status interval. The
input and phones attributes update only when you change them from GEM (the
driver re-reads them a second after the change) or when you run their query
commands (get_input, get_headphone) explicitly. Accubass has no reflected
attribute — the Accubass commands take effect on the amp, but GEM does not read
its state back.
Commands
Send these from the Commands page, a macro, or a control.
Power
| Command | Args | Notes |
|---|---|---|
power_on / power_off | — | Turn the amp on / off. |
power_toggle | — | Toggle power. |
get_power | — | Refresh the power attribute. |
Volume & mute
| Command | Args | Notes |
|---|---|---|
volume | level | Set an absolute level. Enter level as 0–100 — the driver scales it to the amp's 0–64 range for you. |
volume_up / volume_down | — | Step up / down one increment. Best for touchpanel binding — they need no scaled value. |
mute_on / mute_off | — | Set mute. |
mute_toggle | — | Native mute toggle — GEM sends it directly, with no state emulation. |
get_volume | — | Refresh the volume attribute. |
get_mute | — | Refresh the mute_state attribute. |
Input selection
| Command | Args | Notes |
|---|---|---|
input | input | Select an input. The driver sends input<value>, so set the input argument to the input token the Rialto expects (from the amp's protocol reference), then re-reads it into the input attribute. |
get_input | — | Refresh the input attribute. |
The driver lists analog_input, digital_input_1, and digital_input_2 as
convenience buttons, but they are placeholders — they carry no command template and
currently send nothing usable to the amp. To switch inputs, use the input
command with the correct input token as its input argument. Do not build macros
or controls around the three shortcut commands until they are implemented.
Accubass
| Command | Args | Notes |
|---|---|---|
accubass_on / accubass_off | — | Enable / disable Accubass. |
accubass_up / accubass_down | — | Step the Accubass level up / down. |
accubass_toggle | — | Toggle Accubass. |
get_accubase | — | Query Accubass (note the command name is spelled get_accubase). GEM does not currently store the returned value as an attribute. |
Headphone
| Command | Args | Notes |
|---|---|---|
headphone_on / headphone_off | — | Enable / disable the headphone output. |
headphone_toggle | — | Toggle the headphone output. |
get_headphone | — | Refresh the phones attribute. |
Known quirks
- Volume is 0–100 in GEM, 0–64 on the wire. You always enter and read volume
as
0–100; the driver converts to the amp's0–64range in both directions. Values above100are clamped by the amplifier. - State feedback lags a set by ~1 second. After a power/volume/mute/input change, the driver waits about a second, then re-queries the amp to catch the new value — so the on-screen state settles a beat after you press the button.
- The amp answers over TCP even in standby.
powercan reportoffwhile the amplifier is still reachable on the network, so a connected device is not the same as a powered-on one. - One controller at a time. The Rialto allows only a few concurrent IP-control sessions; a competing app racing GEM shows up as a volume slider that snaps back or a connection that keeps dropping.
Troubleshooting
| Symptom | Check |
|---|---|
| Connects but state never updates | Confirm IP control is enabled on the Rialto and the TCP Port matches its network setup. |
| Volume slider snaps back | Another control point (a mobile app or a second controller) is racing GEM. Disable the competing controller. |
| Connection drops repeatedly | Confirm only one TCP client is connected — the Rialto allows a small number of concurrent IP-control sessions. |
| AV Zone slider does nothing after re-binding | The driver learns its Volume-Device AV Zones only at connect. Reload the Rialto device after changing the binding. |
| An input shortcut button does nothing | analog_input / digital_input_1 / digital_input_2 are not implemented — use the input command with the correct input token instead. |