Jandy AquaLink RS
The jandy adapter decodes the Jandy AquaLink RS pool/spa bus (9600 8N1).
It discovers equipment, reads setpoints and temperatures, surfaces everything
over MQTT/REST, serves Jandy's RSSA text protocol over TCP, and can drive
the pool — toggling equipment and changing heat setpoints — by emulating an
AllButton keypad.
What it does
- Decodes the bus — display panels, pumps (incl. variable-speed watts), SpaLink, the JXi heater, and aux relays, surfaced via REST and MQTT.
- Reads setpoints + temps passively — pool/spa heat setpoint, water
temperature, and heater-firing state are decoded straight from the JXi
heater's poll (no menu navigation needed to read a value). Surfaced as the
POOLSP,SPASP,POOLTMP(andAIRTMP) registers. - RSSA-over-TCP server — when
outputs.tcpis enabled, the port's TCP server speaks the Jandy RSSA text protocol. A drop-in replacement for Jandy's serial-adapter dongle, so existing RSSA clients connect straight to OmniBus. - AllButton keypad emulator — claims a keypad slot (
0x08–0x0b) and synthesizes button presses to drive the AquaLink master: equipment toggles and heat-setpoint changes.
Reading state
Once the bus is decoding, the port card shows a live register table. Binary circuits (pump, aux relays, heaters) render an ON/off pill, and the AllButton test buttons light up for whatever is currently on, so you can see the pool's state at a glance. Key registers:
| Register | Source | Meaning |
|---|---|---|
POOLTMP | JXi poll | Current pool water temperature (°F) |
POOLSP / SPASP | JXi poll | Pool / spa heat setpoint (°F) |
AIRTMP | Display panel | Air temperature (°F) |
PUMP, AUX1… | Status LEDs | Equipment on/off |
POOLHT | Status LEDs | Pool heat enabled |
PUMPn_W | ePump | Variable-speed pump power (W) |
Driving the pool
Two kinds of write, both through the AllButton emulator:
- Toggles —
PUMP,SPA,AUX1…7,POOLHT,SPAHT. A single keypad press toggles the circuit. From the UI use the test buttons; over RSSA send#AUX3=1; over RESTPOST /action/pressButton {"register":"AUX3"}. From a BMS they're also commandable Binary Value objects over the BACnet/IP object server (or a Sparkplug DCMD): writing the present-value drives the keypad. Because the bus press is a toggle, OmniBus only presses when the commanded on/off differs from the decoded current state, so a write behaves as an absolute set; the real result flows back on the next status decode. - Setpoints —
POOLSP/SPASP. OmniBus walks the panel's Set Temp → Set Pool/Spa Temp menu to the target, then confirms the new value against the JXi read-back. From the UI use the Setpoints row (− / + or type a value and Set); over RSSA send#POOLSP=90; over RESTPOST /action/setpoint {"register":"POOLSP","value":90}(or"delta":1to nudge). The pool/spa setpoints are also writable from a BMS: over the BACnet/IP object server they surface as commandable Analog Value objects (°F), and over Sparkplug they accept a DCMD write — writing the present-value drives the same menu walk, and the committed value flows back to the object on the next JXi poll. Setpoints are clamped to 40–104 °F; a menu walk takes a moment (~one step per degree).
The JXi echoes the setpoint the controller pushed to it — it does not own it. Changing a setpoint therefore means driving the panel's menu (the keypad walk above); there is no faster direct-to-heater write path.
Control safety
The AllButton keypad emulator defaults to dry-run: it logs the intended
transmit without writing to the bus, so toggles no-op and setpoint writes
return ?08 SETPT OPERATION FAILED. Observe the dry-run log and confirm the
master is probing your slot, then switch the emulator to live on the port
card to actually drive the bus. Validate against a real panel before shipping
a pool deployment.
Outputs
| Output | Behavior |
|---|---|
| TCP | RSSA text protocol (drop-in for the Jandy serial dongle): #REG? reads, #REG=VALUE / #REG± writes. |
| MQTT | Publishes discovered equipment, setpoints, temps, and heater state. |
| REST | /action/equipment, /action/registers, /action/stats, /action/pressButton, /action/setpoint. |
| Webhooks | Fan out equipment/status events. |
With BACnet output enabled, decoded points are also surfaced through the BACnet/IP object server: temperatures, pump power, and heater-firing as read-only Inputs; the pool/spa setpoints as commandable Analog Value objects; and equipment toggles (pump, aux relays, heaters) as commandable Binary Value objects (see Driving the pool above).