homebridge-systemline-s62-usb
v1.0.0
Published
Homebridge plugin for the Systemline S6.2 multi-room audio system over a direct USB-to-RS232 serial cable. Each zone appears as a TV accessory with source selection and volume control. No network-to-serial adapter required.
Maintainers
Readme
homebridge-systemline-s62-usb
A Homebridge plugin for the Systemline S6.2 multi-room audio system over a direct USB-to-RS232 serial cable. Each zone appears as a TV accessory in HomeKit with source selection and volume control.
Which plugin do I want?
| Plugin | Connection | HomeKit presentation | |--------|-----------|---------------------| | this one | USB-to-RS232 cable | TV accessory with source picker + volume | | homebridge-systemline-s62-control | Global Cache iTach IP2SL (network) | TV accessory with source picker + volume | | homebridge-globalcache-gc100-kiro | Global Cache iTach IP2SL (network) | Simple on/off switches + volume |
If Homebridge runs on a machine physically near the amplifier, this plugin is the simplest and fastest option — a low-cost USB serial cable replaces a network-to-serial adapter, and the round-trip latency is a fraction of the networked equivalent.
Overview
The Systemline S6.2 is an 8-zone multi-room audio matrix amplifier with an RS232 control interface but no network connectivity.
This plugin drives that interface directly from a USB serial adapter, exposing each zone to HomeKit so you can control whole-home audio from the Home app, Siri, or any automation.
From HomeKit you can:
- Turn zones on and off
- Select the source per zone using the TV input picker
- Set volume with a slider, or step it with the TV remote volume buttons
- Include zones in scenes and automations
Requirements
- Homebridge v1 or v2
- USB-to-RS232 cable (FTDI FT232R chipset recommended)
- Systemline S6.2 amplifier, cable connected to its RS232 control port
- The Homebridge user must be in the
dialoutgroup
Installation
npm install -g homebridge-systemline-s62-usbOr install via the Homebridge UI plugin search.
The serialport dependency compiles natively — on a Raspberry Pi this happens automatically but may take a minute.
Finding your serial port
ls /dev/ttyUSB*
udevadm info /dev/ttyUSB0 | grep ID_USB_SERIALStable device paths (recommended)
USB serial numbering (ttyUSB0, ttyUSB1, …) depends on enumeration order and can change after a reboot. If you have more than one USB serial device, pin them with udev rules so the right cable is always used.
- Get the cable's serial number:
udevadm info /dev/ttyUSB0 | grep ID_USB_SERIAL_SHORT- Create
/etc/udev/rules.d/99-usb-serial.rules:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="YOUR_SERIAL", SYMLINK+="ttyUSB_S62_CTRL"- Reload:
sudo udevadm control --reload-rules && sudo udevadm trigger- Use
/dev/ttyUSB_S62_CTRLas theserial_portin your config.
Configuration
{
"platform": "SystemlineS62USB",
"name": "Systemline S6.2",
"serial_port": "/dev/ttyUSB_S62_CTRL",
"baud_rate": 9600,
"maxVolume": 25,
"sources": [
{ "id": 1, "name": "Sky Q Mini" },
{ "id": 2, "name": "Sky Q" },
{ "id": 6, "name": "Apple TV" }
],
"zones": [
{ "id": 1, "name": "Bedroom 1" },
{ "id": 2, "name": "Kitchen" },
{ "id": 8, "name": "Winter Lounge" }
]
}Options
| Option | Required | Default | Description |
|--------|----------|---------|-------------|
| serial_port | Yes | — | USB serial device path |
| baud_rate | No | 9600 | S6.2 control port baud rate |
| maxVolume | No | 25 | Slider maps 0–100% onto 0–maxVolume (hardware max 30). Lower = finer control |
| sources | Yes | — | Sources by S6.2 source number (1–6) and name. List only the ones you use |
| zones | Yes | — | Zones by S6.2 zone number (1–8) and name |
Zones appear as accessories in the Homebridge UI after a restart — add each to HomeKit from there. No separate pairing is required.
How it works
Each zone is a TV accessory containing:
| Service | Purpose |
|---------|---------|
| Television | Power and source selection |
| InputSource (one per source) | Entries in the source picker |
| TelevisionSpeaker | Volume up/down in the TV remote UI |
| Lightbulb | Brightness slider used as the volume control |
State is read from the amplifier at startup and cached. HomeKit reads are answered from cache so they return instantly, and the cache is updated after every command. Volume changes are debounced by 400 ms so dragging the slider sends one command rather than a flood.
Doubled commands
Every command is written to the port twice. The S6.2 holds its response in an output buffer and only flushes it when further incoming bytes arrive — send a single command and the reply sits there until the next command shows up, which desynchronises every request/response pair after it. Writing the command twice supplies the flush trigger, so the reply comes straight back.
This was originally assumed to be a quirk of the Global Cache iTach. It is not — it is the amplifier's behaviour, and it applies equally over direct serial.
Reconnection
If the USB device drops off the bus — cable unplugged, power glitch, hub hiccup — the plugin detects it, retries every 10 seconds, and re-reads every zone's state once the device returns. No Homebridge restart needed. If the cable is missing at startup the accessories still register and begin working once it appears.
S6.2 RS232 protocol
| Action | Command | Response |
|--------|---------|----------|
| Select source | $s<zone>src<source>\r | $r<zone>src<source> |
| Zone off | $s<zone>srcoff\r | $r<zone>srcoff |
| Query source | $g<zone>src\r | $r<zone>src<source> or $r<zone>srcoff |
| Set volume | $s<zone>vol<0-30>\r | $r<zone>vol<n> |
| Query volume | $g<zone>vol\r | $r<zone>vol<n> or $r<zone>volmute |
| Mute | $s<zone>volmute\r | $r<zone>volmute |
| Unmute | $s<zone>volmoff\r | $r<zone>vol<n> |
Commands are serialised through a single queue so only one is ever in flight.
Troubleshooting
Permission denied opening the port
sudo usermod -a -G dialout $USERThen restart Homebridge. On a Homebridge UI install the service user may differ — check which user the service runs as.
Response timeouts
- Confirm the baud rate matches your amplifier's control port
- Check the wiring: TX to RX, RX to TX. A straight-through cable where a null modem is needed will not work
- Confirm the cable is on the control RS232 port, not a data/feedback port
Zones show the wrong state
- State is read at startup; if the amplifier is changed from a wall keypad the plugin will not see it until the next restart or reconnect
- Restart Homebridge to force a re-read
Wrong device opened after reboot
- Use udev symlinks — see "Stable device paths" above
Credits
Systemline S6.2 RS232 protocol — documented in the S6.2 installation manual.
Predecessor — homebridge-globalcache-itach by Paul Wieland, which the original iTach-based version was derived from.
Built with Kiro AI — https://kiro.dev
License
MIT
