Skip to main content

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 (and AIRTMP) registers.
  • RSSA-over-TCP server — when outputs.tcp is 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:

RegisterSourceMeaning
POOLTMPJXi pollCurrent pool water temperature (°F)
POOLSP / SPASPJXi pollPool / spa heat setpoint (°F)
AIRTMPDisplay panelAir temperature (°F)
PUMP, AUX1…Status LEDsEquipment on/off
POOLHTStatus LEDsPool heat enabled
PUMPn_WePumpVariable-speed pump power (W)

Driving the pool

Two kinds of write, both through the AllButton emulator:

  • TogglesPUMP, 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 REST POST /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.
  • SetpointsPOOLSP / 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 REST POST /action/setpoint {"register":"POOLSP","value":90} (or "delta":1 to 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).
Setpoints are read-only on the heater

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

Control paths default to dry-run

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

OutputBehavior
TCPRSSA text protocol (drop-in for the Jandy serial dongle): #REG? reads, #REG=VALUE / #REG± writes.
MQTTPublishes discovered equipment, setpoints, temps, and heater state.
REST/action/equipment, /action/registers, /action/stats, /action/pressButton, /action/setpoint.
WebhooksFan 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).