ARCUS

Arcus Manual — Musical Fountain System

How a musical fountain works, how it is designed, and how it is run — the complete field manual for the Arcus system.

Modules

Main module

The Main module is the controller for the whole fountain. It holds the song catalog, the playlists and the schedule, broadcasts the show clock down the RS-485 bus, carries the emergency-stop loop and the fountain-wide run relay, and is the one module that three different hosts can talk to at once.

The Arcus Main module: a wide grey DIN-rail enclosure with the ARCUS name moulded into the top, a two-line character display, three front buttons, three status lamps, a USB port and a screw-on antenna, with green screw terminals along the bottom edge.

What it does

Everything in a fountain hangs off this module. It stores up to 50 songs and 10 playlists, runs the schedule, and broadcasts a 10 ms clock tick that every end unit plays its own stored animation against. The tick is a broadcast — nothing acknowledges it.

Main -> RS-485 bus -> SmartBuffer -> end units

Three hosts can reach it: a PC over USB, which is how an installer commissions a pool; a Raspberry Pi gateway on its own RS-485 port; and a phone over Bluetooth. They are three doors into the same module, not three modes.

Inside the one enclosure it is physically three circuit modules — a CPU module, a front-panel module and a field-wiring module — joined by two stacking header pairs. Only the field-wiring module is mains-grade.

Key specifications

ItemValue
ProcessorPIC18F47Q83, 44-pin TQFP, 64 MHz internal — no crystal fitted
Program memory128 KB — a 32 KB protected bootloader plus 96 KB of application
Working memory12,800 bytes
Stored settings32 KB FRAM — survives power loss with no write limit worth counting
Capacity50 songs · 10 playlists · 10 schedulers · 100 triggers
SupplyMains, through an on-module Hi-Link HLK-5M03 5 W module
Communication portsFive — USB · RS-485 bus · GPS · RS-485 to the Pi · Bluetooth or display
Bus speed1,000,000 baud
Show clock10 ms tick
Fountain sizeUp to 30 SmartBuffers, 32 end units behind each — 960 end units on one Main
Operating temperature0 – 80 °C
Enclosure85 × 57.6 × 115 mm, DIN rail. Two lids — Bluetooth and display

What you wire to it

The field terminals run along the bottom edge of the enclosure. Everything below is a screw terminal except the USB port and the antenna socket.

TerminalPolesWhat goes here
Mains in2Line and neutral
E-stop loop2A dry contact, opto-isolated on the module. Open means stopped — nothing plays while the loop is broken
Run relay2A volt-free contact that follows the e-stop exactly. DC rating 30 V / 2 A
Bus out2RS-485 A and B to the SmartBuffers, up to 30 of them
Gateway port43.3 V, ground, A and B for a Raspberry Pi gateway. This is RS-485, not a serial TTL header
USB—The commissioning port, galvanically isolated from the rest of the fountain
Antenna—Screw-on GPS antenna, for time and position
The mains inlet block is rated 160 V. Confirm that against your supply before energising the panel.
The gateway port will not power a Raspberry Pi. Give the Pi its own supply — undervoltage halts it, and no software recovers from that.

What the lamps mean

LampMeaning
RUNA playlist or a single song is playing
FAULTThe module is holding a fault
RESETUsed in the power-on lamp test
USB TX / RXTraffic on the commissioning port

At every power-up the module runs the three status lamps in sequence — reset, run, fault, half a second apart — then clears them. If that sequence does not happen, the module is not starting.

Two variants

The module ships in two builds from one codebase: Bluetooth, and the legacy display variant. Both can carry the same version number and still differ in what they support, so the module reports its own capabilities when a host connects. New units are Bluetooth only; the display build is kept alive for modules already in the field.

SmartBuffer

The SmartBuffer is the bus hub. One trunk line comes in from the Main, one branch goes out to as many as thirty-two end units, and the module gives every one of those units its address. With no Main present at all it can still run one stored show by itself.

The Arcus SmartBuffer: a square black DIN-rail enclosure, the Arcus name moulded into the top face, one red and one green status lamp, a single front button, and green screw terminals along the lower edge.
Main -> SmartBuffer -> up to 32 end units

It sits between the Main and the end units and does four things.

Repeats the bus

It carries the trunk onto its own branch, so a long fountain is a set of short buses instead of one fragile one. It also carries the only 120 Ω terminator in the product, at its own branch driver.

Hands out addresses

It walks the branch and numbers the units in the order they are wired. An address is positional: a unit's identity is where it sits in the row.

Rescues a stuck unit

A separate one-bit chain runs down the branch and still works when a unit has stopped answering on the bus.

Feeds the branch

The module takes mains in and sends 5 V out along the branch, so every end unit on the row is powered from here.

Splice a new unit into the middle of a row and every address below it shifts. That is why shows are always built against groups and never against a single unit.

Key values

ItemValue
ProcessorPIC18F27Q84, 64 MHz internal
End units per branch32. The thirty-third gets no address and raises a fault
SmartBuffers per Main30 — a different number, and a different limit
Mains input100 – 264 V AC
Power moduleMean Well IRM-30-5 — 5 V, 6 A, 30 W
Internal rails5 V only. There is no second regulator anywhere in the module
Bus termination120 Ω at its own branch driver — the only terminator in the product
Bus speed1,000,000 baud, both sides
Enclosure85 × 57.6 × 80 mm, DIN rail
Operating temperature0 – 80 °C

What you wire to it

TerminalPolesWhat goes here
Mains in2Neutral and line
Bus up2RS-485 A and B, back to the bus-out terminal on the Main
Branch30The end-unit connector. Not thirty signals: four parallel drops of the same bus pair, ten supply pins, ten ground pins, and two for the enrolment chain
The mains terminal block is rated 160 V. Check it against the supply you are connecting before you energise the module.
The branch supply feeds every unit on the row. Ten parallel pins carry 5 V down the branch and ten carry the return, from a 5 V 6 A supply. A full row of thirty-two Drivers or DMX modules at 150 mA each draws 4.8 A of that 6 A; a full row of RGB or Valve units at 100 mA each draws 3.2 A. A mixed row sits between the two. Add the row up before you fill a branch.

The SEARCH button and the lamps

ControlWhat it means
SEARCH buttonHold it for 3 seconds to enrol the end units on the branch. It walks the chain and numbers every unit in physical order, taking about a second per unit, so a full row of thirty-two takes roughly half a minute. This is the only user control on any Arcus module
SYNC lampSolid: the Main has enrolled this module and is talking to it. Dark: no sync
FAULT lampLit on an over-count — a thirty-third unit tried to enrol — or on another held fault

The button only arms on a fresh press: it must have been seen released before a hold counts, so a stuck button cannot start a search on its own.

Running without a Main

After 5 seconds of silence on the trunk, a commissioned SmartBuffer starts playing its one stored show on a loop and generates the show clock itself — the same 10 ms tick the Main would have sent. The loop can be 30 to 600 seconds.

A loop length of zero is a separate and deliberate state: not commissioned. The module then stays quiet rather than playing something nobody asked for.

Driver module

The Driver module commands one motor, and it never touches the motor itself: it speaks Modbus RTU over an isolated RS-485 pair to a variable-frequency drive the customer supplies, so no motor power and no motor wiring ever reaches an Arcus module.

The Arcus Driver module: a slim orange DIN rail end unit with the Arcus mark on the sloped top face, four indicator lamps on the front and a green screw terminal at the bottom.

One module drives exactly one jet. It plays its own part of the show against the Main module's clock and turns each step into a speed and a run command for the drive. The two-pole drive terminal is the only field wiring on the unit — everything else arrives through the backplane, from the SmartBuffer or the previous unit in the row. There is no button, no switch and no address selector anywhere on it.

Driver -> isolated RS-485 -> drive -> pump motor

The drive link

SettingValue
ProtocolModbus RTU
Baud rate19,200 — fixed in firmware
Data and parity8 data bits, even parity — fixed in firmware
Drive address1 — fixed in firmware
Reply timeout100 ms
Tries5 against a silent drive, then it backs off and blinks
Supported drivesINVT GD20 / GD27 / GD350 · GD10 · CHF100 — chosen per unit at commissioning
A drive left on its factory settings cannot be reached, and no software fix exists. The module always talks at 19,200 baud with even parity to drive address 1, and those three values are compiled into the firmware. A drive still at 9600 8N1, or at any address but 1, is deaf — the parameter write that would correct it has to travel over the very link that is wrong. Somebody has to walk to the drive's keypad and set the drive to match before the module can reach it.

The four lamps

LampMeaning
SYNCSteady: enrolled, in step with the show clock and idle
FAULTDark when healthy. Otherwise it blinks a priority code — the number of blinks names the fault, and the most serious one wins
Drive TXThe module is talking to the drive
Drive RXThe drive is answering

The two drive lamps are the fastest diagnosis on site. TX flashing with RX dark means the module is asking and nothing is answering: wrong baud rate, wrong parity, wrong address, wrong wiring, or a drive that is off. Both flashing means the link is healthy, whatever the water is doing.

Module data

ItemValue
Motor outputs1 — one speed and one run command per module
ProcessorPIC18F27Q84
Drive terminal2-pole screw terminal, galvanically isolated on its own supply island
Current draw150 mA
Per-unit settingsNozzle, motor type, max height, reverse, offset, accel, decel, pump limits, drive model — all sent over the bus
Arcus publishes no motor power rating for this module and never will. The drive belongs to the customer: the module commands it, it does not sell one. Size the drive and the motor from the pump data, not from anything in this manual.

RGB module

The light module. Three output channels — red, green and blue. Each channel is a 16-bit dimmer that switches the low side of an external LED string, isolated from the fountain's own electronics.

The Arcus RGB module: a slim orange DIN-rail end unit with the Arcus mark on the sloped top face, indicator lamps near the top and two green screw terminals stacked at the bottom.

The channel count is three, and it is three in every mode. The module can be told to treat the three as one RGB fixture, or as three independently groupable single-colour lamps — that changes how a show addresses them, never how many there are.

It stores up to 30 songs and plays its own part of a show against the Main module's 10 ms clock, turning each step into three dimming levels.

The output stage

The LED supply is the customer's and never enters the module as a rail: the positive leg runs straight from the power supply to the string. The module switches the low side, on its own isolated island, so the lighting circuit and the fountain's bus share no ground.

PSU + -> LED string -> R / G / B terminal -> shared return -> PSU −
All three channels share one return terminal. Red, green and blue are each switched on the low side, and the current of all three leaves through that single terminal — so what decides the wiring is not the largest channel but the sum of the three. A single channel can pass up to 200 W, and the module totals 20 A across the three: 240 W at 12 V, 480 W at 24 V. Size the LED cable and the supply to that total.
The LED return is not module ground. The output stage is referenced to the isolated island that the lighting supply shares, and that is deliberate. Do not bond the LED common to the fountain's ground to tidy the wiring up — it defeats the isolation.

Key values

ItemValue
Output channels3 — red, green, blue
Dimming16-bit, at 2.000 kHz
Switch deviceLow-side N-channel MOSFET, 30 V / 60 A rated part, opto-isolated gate drive
LED supply12 – 24 V DC
LED loadUp to 200 W on a channel; 20 A total across the three — 240 W at 12 V, 480 W at 24 V
Current draw100 mA
Storage30 songs; 8000 cues on the EEPROM units shipping now, 800 steps on the FRAM units still in the field
ProcessorPIC18F27Q84, 64 MHz internal
Enclosure20 × 85 × 58 mm, DIN rail
Units per SmartBuffer branch32
Operating temperature0 – 80 °C

What you wire to it

ConnectionPolesWhat goes here
LED terminal 12Red and green channel returns
LED terminal 22Blue channel return, and the isolated LED common
Backplane, upstream30Plugs into the SmartBuffer or the previous unit
Backplane, downstream30The next unit, or the terminator plug

What the lamps mean

LampMeaning
SYNCSteady: enrolled, in step with the show clock and idle
FAULTDark when healthy; otherwise it blinks a priority code naming the fault
Colour lampAn on-module RGB indicator — a local check that the three channels are being driven, without a meter

No button, no switch, no address selector. Every setting arrives over the bus, and the address comes from the unit's position in the row.

Past its store a unit does not truncate — it sits the song out. An overlong song leaves that light completely dark while the rest of the pool plays, so author a little under the budget of the smallest unit taking part.

Valve module

The Valve module switches solenoids. Six independent on/off outputs, driven from an animation stored in the unit and played against the same 10 ms show clock every other end unit follows — so a water curtain stays with the music without the controller having to talk to the module in real time.

The Arcus Valve module: a slim orange DIN-rail end unit with a red and a green status lamp near the top, six green output lamps in two rows below them, and two green screw terminal blocks stacked at the bottom.

Each unit holds up to 30 songs. A step in a song can carry a flash modifier and an inverse modifier, so one cue can pulse a valve at a chosen rate instead of simply opening it. The flash rate is set per step against the 10 ms clock.

Every unit also carries a curtain identity, so several Valve units feeding one water curtain can be addressed together. Apart from that it groups like any other end unit, with 20 group slots.

The six outputs

The outputs are numbered 1 to 6 — on the wire, on the enclosure, and in the same order as the six output lamps. In the switched pattern, output 1 is the least significant bit. If valve 1 and valve 6 ever appear swapped, a numbering conversion is the first thing to check.

What you wire to it

  • The six valve coils, 1 to 6, across the two screw terminal blocks.
  • The valve supply, 12 – 24 V, for the coils.
  • Backplane upstream: the SmartBuffer, or the previous unit in the row.
  • Backplane downstream: the next unit, or the terminator plug.
Each output switches 12 – 24 V, 80 W. Nothing heavier and nothing at mains voltage belongs on these terminals — switch a contactor instead.

Key figures

ItemValue
Solenoid outputs6, independently switched
Per channel12 – 24 V, 80 W
Current draw100 mA
ProcessorPIC18F27Q84, 64 MHz internal
Songs stored30
Flash rateSet per step against the 10 ms clock
Grouping20 group slots, plus a curtain identity
Units per SmartBuffer branch32
Operating temperature0 – 80 °C

The lamps

LampMeaning
SYNCLit while the unit is enrolled, in step and idle. It goes dark the moment any valve opens.
FAULTBlinks a priority code naming the fault.
Outputs 1 – 6One lamp per valve, following that output.
A dark sync lamp during a show is normal, not a fault — it follows the valves. At power-up the two status lamps run a short three-step sequence — green, both, red — then clear. If that sequence does not happen, the unit is not starting.

DMX module

The DMX module is a Driver module carrying the DMX512 firmware instead of the motor firmware. The terminal that would talk Modbus to an inverter drives one lighting fixture instead, through the same isolator.

The Arcus DMX module: the same slim orange DIN-rail unit as the Driver module, which is what it physically is.

It reports itself to the rest of the system as an ordinary light, so it shares groups and cues with the RGB modules. Nothing about building a show changes: you place it, you group it, you colour it.

Key numbers

ItemValue
RoleA Driver module running the DMX512 firmware
Light output1 — one fixture per module, up to 24 DMX slots
SignalDMX512, 250,000 baud, refreshed 40 times a second
ProcessorPIC18F27Q84, 64 MHz internal
IsolationThe fixture pair is galvanically isolated on its own supply island
Current draw150 mA
Enclosure20 × 85 × 58 mm — the shared end-unit shell

What you wire to it

One pair, to the fixture’s DMX input, on the same two-pole screw terminal a Driver uses for the inverter. That is the only field wiring on the unit; the bus, the supply and the ground arrive through the backplane connectors, from the SmartBuffer or from the previous end unit.

One module is one fixture. There is no universe and no patch table to set up.
In this role the module has no inverter, no motor and no Modbus. Do not wire a drive to a DMX module, and do not fit one where a jet is expected — a DMX module cannot run a pump.

Pi gateway

The Pi gateway is the optional add-on that gives a fountain music, an internet link and the phone app. It is a stock Raspberry Pi 4 and a USB audio interface in a printed box, wired into the Main's gateway terminal. Not every fountain has one: the Main runs the show with or without it.

The Arcus Pi gateway enclosure: a printed box with vent slots down one end, mounting wings at the base and an opening in the back face for the audio connectors.

The four jobs

Show audio

Plays the show's sound to the venue mixer, in step with the water.

Internet link

Carries the connection that lets the fountain be reached and updated remotely.

Local network service

Hosts the service the phone app connects to on site.

Scheduling handover

Can hand the schedule to the Main and then follow it, so a show still runs while the Pi is rebooting.

How it reaches the Main

Pi -> USB-RS485 converter -> Main gateway terminal

The converter plugs into the Main's four-way gateway terminal — A, B and ground. The link is addressed, so the gateway and a PC can share the module without colliding. The terminal's supply pin cannot power the Pi; the Pi is powered separately.

One gateway per fountain. Approving a second one while a binding is live is refused.

Key values

ItemValue
ComputerRaspberry Pi 4 Model B, 2 GB — a stock module
Power5 V / 3 A minimum. Undervoltage halts the Pi and no software recovers it
Audio interfaceBehringer UCA202, 88 × 60 × 22 mm, bus-powered, 5 V / 100 mA
Audio outTwo phono jacks, line level, to the venue mixer
Link to the MainUSB-RS485 converter, 1,000,000 baud
Pairing window10 minutes
Cellular data~60 – 90 MB per month in push mode
Box106.3 × 68.8 × 51.8 mm; 151.3 mm long with the cable shroud fitted

Which face carries what

FaceWhat is on it
Left endEthernet, four USB ports and the audio interface's captive cable. Everything that stays plugged in leaves from this end
BackThe four phono jacks — two line out to the mixer, two line in (unused) — and the Pi's USB-C power entry
FrontOnly the audio interface's own indicator, optical output and headphone jack. Nothing the installation needs
Right endA blank wall with vents. Behind it, inside, is the channel that lets the memory card be withdrawn
The length of the box is set by a moulded-in cable. The audio interface's USB lead is captive, about a metre long, and leaves its left end face, so the Pi's port edge has to sit at that same end and cannot be enclosed: a moulded USB plug needs roughly 38 mm of clear space in front of its socket. That is what the shroud is for, and why the box is 151.3 mm long with it fitted. Leave that end clear when you mount it.

Cabling and power

  • To the Main: a USB-RS485 converter into the four-way gateway terminal — A, B and ground. Runs of 30 m have been proven at full speed.
  • Pi power, on the bench: the official 27 W USB-C supply.
  • Pi power, installed: a quality 5 V / 5 A converter from the panel's DC rail.
  • Audio out: two phono leads from the back of the box to the mixer.
  • Network: Ethernet is the field link. Wi-Fi also runs, and the built-in hotspot is the way in when there is no network.
Check two things on the first installation in a new enclosure. Heat — the processor runs at full performance, so the module runs warm; the box material is chosen for that, but the enclosure is what decides the temperature inside. Radio — the antenna sits close to a metal enclosure wall. Do not rely on wireless here: run Ethernet, and check the hotspot on site.

Installation

What a full installation looks like

An Arcus installation is a row of modules on a single DIN rail inside the fountain's control panel. Each module clips to the rail and plugs into its neighbour, so the bus and the low-voltage supply travel along the row instead of through a loom of hand-made cables.

A row of Arcus modules clipped side by side on one DIN rail: two narrow grey modules, the wide Main module with its display and buttons, another grey module, then three orange end units.

The colour tells you what a module does. Orange marks an end unit — a module that drives a load: a jet, a light or a solenoid. Grey marks everything else: the Main, and the SmartBuffers that carry the bus out to the end units.

The shape of a system

Main -> SmartBuffer -> end units 1…32

One Main runs the fountain. Behind it sit its SmartBuffers, and behind each SmartBuffer sits one branch of up to 32 end units. A small fountain is one Main, one SmartBuffer and a handful of end units on one rail; a large one is the same picture repeated across more branches. An end unit is 20 mm wide, so a full branch of thirty-two takes about 640 mm of rail, plus the Main and its SmartBuffer.

Main

The controller, one per fountain. It stores the songs and playlists, runs the schedule, broadcasts the show clock, and carries the emergency-stop loop and the fountain-wide run relay.

SmartBuffer

The bus hub. It repeats the bus onto its own branch and gives every unit on that branch its address by walking the row. With no Main present it can still run one stored show by itself.

End units

The orange modules. A Driver commands one jet, an RGB module dims three lighting channels, a Valve module switches six solenoid outputs. They share one shell and one branch, in any mix.

Pi gateway

Optional. A Raspberry Pi 4 and a USB audio interface in a printed box, wired to the Main's gateway terminal, for music, internet and the phone link. The Main runs the show with or without it.

What a system holds

LimitValueNote
End units per SmartBuffer32One shared 1…32 sequence, whatever the mix of Driver, RGB and Valve
SmartBuffers per Main30Each one starts its own branch
End units on one Main96030 branches of 32
Bus speed1,000,000 baudThe same on every port in the system
Show clock10 ms tickBroadcast by the Main; each end unit plays its stored animation against it
Branch supply5 V, 6 AA full row of Drivers draws 4.8 A of it
Operating temperature0 – 80 °CEvery Arcus module
What is fed from where. The Main and every SmartBuffer are mains-fed, each through its own screw terminal and its own on-module supply; the SmartBuffer accepts 100 – 264 V AC. The end units are not: each SmartBuffer feeds its branch with 5 V at 6 A through the backplane, and a full row of thirty-two Drivers draws 4.8 A of that. No mains wiring reaches an end unit.
Load power never passes through an Arcus module. A Driver commands a variable-frequency drive over an isolated Modbus pair, so motor power and motor wiring stay on the drive; an RGB module switches the low side of an external LED supply, on its own isolated island. Give every load circuit its own supply — never the branch.
Rail order is the addressing. A unit's identity is where it sits in the row, so a unit spliced into the middle of a branch renumbers every unit after it. Fix the order before you wire, and always aim a show at a group rather than at a single unit.

What follows

  1. How the pieces fit together: the bus, the show clock and positional addressing.
  2. Cabling: what you wire to the Main, to each SmartBuffer and to the end units.
  3. Power: the 5 V branch supply, what each unit draws, and the supplies you provide for the loads.
  4. The hard limits and the enclosure sizes to plan the panel and the rail against.

How it fits together

One Main module runs the show. Everything below it hangs off a single RS-485 bus at 1 Mbaud: the Main feeds the SmartBuffers, and each SmartBuffer carries its own branch of up to 32 end units. However large the fountain, there is one bus.

Main -> RS-485 bus -> SmartBuffer -> up to 32 end units -> bus terminator

Three kinds of end unit hang off a branch — a Driver for a jet, an RGB for a light, a Valve for solenoids — and they share one numbering sequence, whatever the mix. The last unit in the row is capped with the bus terminator plug.

The show clock

The Main broadcasts a 10 ms clock tick onto the bus. Every end unit already holds its own animation in memory and plays it against that tick, so the controller does not send each jet and each lamp its commands in real time. Two things follow from that on site:

  • The show is loaded into the units before it runs. Uploading a song takes time; playing it does not load the bus.
  • Water and light stay together because they are counting the same tick, not because the controller is keeping up with them.

Positional addressing

An end unit has no address switch and nothing to set. Its identity is where it sits in the row. The SmartBuffer walks its branch along the Signal chain that runs from one end unit to the next, and hands out 1 to 32 in physical order; the full address is the branch number followed by the position within that branch.

That is what makes commissioning one button on the SmartBuffer instead of setting switches on thirty-two modules. Clip the row up, hold the SEARCH button for 3 seconds, and the units number themselves.

Splice a unit into the middle of a row and every unit after it shifts up by one. The branch renumbers itself at the next enrolment, so shows already loaded end up on the wrong jets. Add to the end of a row wherever you can; if you must insert in the middle, re-enrol the branch and reload it. This is also why a show always targets a group and never a single unit.
LimitValue
Bus speed1,000,000 baud — the same on every port in the system
Show clock10 ms tick, broadcast by the Main
End units per SmartBuffer32 — one shared 1…32 sequence, whatever the mix of Driver, RGB and Valve
SmartBuffers per Main30
End units per controller960 — 30 branches of 32
Branch supply5 V, 6 A — a full row of Drivers draws 4.8 A of it
Songs stored per end unit30
Because the show lives in the units and the addresses live in the row, a branch is not helpless without its controller: with no Main present a SmartBuffer can still run one stored show on its own branch.

Power and current budget

Two kinds of supply meet at every Arcus branch, and they have to be kept apart both in your head and in the enclosure. The SmartBuffer powers the electronics: 5 V down the branch to as many as 32 end units. Everything the fountain actually moves or lights is fed from supplies you provide, and those never pass through an Arcus module except as the switched return.

The branch supply

The SmartBuffer takes mains in and is the only source of power on the branch. Its power module produces the only rail in the module: 5 V, and nothing else. The 30-way branch connector carries that rail on ten parallel pins, with ten more for the return, alongside four parallel drops of the bus pair and two pins for the enrolment chain.

Mains -> SmartBuffer -> 5 V branch -> up to 32 end units
ItemFigure
Mains input100 - 264 V AC
Power moduleMean Well IRM-30-5 — 5 V, 6 A, 30 W
Internal rails5 V only. There is no second regulator anywhere in the module
Branch supply5 V, 6 A, shared by every unit on the branch
Branch pinsTen supply, ten ground
The mains screw terminal is rated 160 V. Confirm it against the supply you are connecting before you energise the panel.

What each unit draws

These are fixed figures for the module’s own electronics. They do not change with what the unit is driving.

UnitEachA full branch of 32
Driver150 mA4.8 A
DMX module150 mA4.8 A
RGB100 mA3.2 A
Valve100 mA3.2 A

The worst case is a full row of 32 Drivers or DMX modules: 4.8 A of the 6 A available, four fifths of the supply. A full row of RGB or Valve units draws 3.2 A. A mixed row falls between the two — add the units up, do not assume.

The current in that table is the module’s own electronics only. No load current passes through the branch supply: no motor a Driver commands, no LED string and no solenoid coil is fed from the 5 V rail.

The supplies you provide

LED supply, for RGB

12 - 24 V DC, yours. The positive leg runs straight from your power supply to the LED string and never enters the module. The module switches the low side of the string on its own isolated island, so the lighting circuit and the fountain bus share no ground.

Solenoid supply, for Valve

12 - 24 V for the coils, yours, across six independently switched outputs at 80 W per channel. Size it for the coils that can be open at the same time, not for one.

On an RGB module the three channels share one return. Red, green and blue are each switched on the negative side and all three currents leave through one common terminal, so what counts is the total of the three and not the largest: 20 A together — 240 W at 12 V, 480 W at 24 V, with up to 200 W on any one channel. Size the return for the total.
Do not bond the LED common to the fountain ground to tidy the panel up. That return is referenced to the isolated island deliberately, and bonding it defeats the isolation.

The Driver module carries no load supply at all. The motor is run by the customer’s inverter over an isolated pair, so no motor power and no motor wiring reaches an Arcus module, and Arcus publishes no motor power rating.

Cabling: what you wire where

Field wiring happens in only three places in an Arcus panel: the Main, each SmartBuffer, and the load terminals on the end units. Everything else — the bus, the 5 V supply, ground and the enrolment chain — travels on the 30-way backplane connector between units, so the end units in a row are plugged together, not wired together.

Main -> bus out -> SmartBuffer bus up -> branch -> end units -> terminator
Both mains blocks — the Main's and the SmartBuffer's — are rated 160 V. Confirm that against your supply before energising.

Main

TerminalPolesWhat goes on it
Mains in2Line and neutral
E-stop loop2A dry contact, opto-isolated on the module. Open means stopped
Run relay2A volt-free contact that follows the e-stop exactly. DC rating 30 V / 2 A
Bus out2RS-485 A and B to the SmartBuffers — up to 30 of them
Gateway port43.3 V, ground, A and B for a Raspberry Pi gateway. This is RS-485, not a serial TTL header
USB—The commissioning port. Galvanically isolated from the rest of the fountain
Antenna—Screw-on GPS antenna, for time and position
The e-stop input is a dry contact, and open means stopped. Nothing plays while the loop is broken, and the run relay follows it exactly. A fountain that stays silent with the loop open is behaving correctly — that is not a fault.
The gateway port is differential, and its supply pin will not run a Pi. Four wires: 3.3 V, ground, A and B, into a USB-RS485 converter at the Pi end. The Pi needs its own 5 V / 3 A supply; undervoltage halts it and no software recovers from that.

SmartBuffer

TerminalPolesWhat goes on it
Mains in2Neutral and line
Bus up2RS-485 A and B back to the Main's bus-out terminal
Branch30The end-unit connector: four parallel drops of the bus pair, ten supply pins, ten ground pins and two chain pins
The branch supply feeds every unit on it. Ten parallel pins carry 5 V down the row and ten carry the return, out of the module's 6 A supply. A full row of Drivers or DMX modules at 150 mA each draws 4.8 A; a row of RGB or Valve units at 100 mA draws 3.2 A.

End units

ModuleTerminalWhat goes on it
DriverDrive terminal, 2 polesThe isolated RS-485 pair to the inverter's Modbus port. This is the only field wiring on the unit
RGBLED terminal 1, 2 polesRed and green channel returns
RGBLED terminal 2, 2 polesBlue channel return, and the isolated LED common
RGBLED supply12–24 V DC. The three channels share one return: 10 A total — 120 W at 12 V, 240 W at 24 V
ValveSolenoid terminalsThe six valve coils, numbered 1 to 6, across the two terminal blocks. 12–24 V, 80 W per channel
ValveValve supply12–24 V for the coils
The LED return is not module ground. The output stage is referenced to the isolated island that the lighting supply shares, deliberately. Do not bond the LED common to the fountain's ground to tidy it up — that defeats the isolation. The LED supply's positive leg goes straight from the customer's power supply to the string; it never enters the module.

The backplane

Every end unit carries two 30-way backplane connectors. The upstream one plugs into the SmartBuffer's branch or into the previous unit; the downstream one takes the next unit, or the bus terminator plug on the last unit in the row. The backplane carries the bus, the supply, ground and the enrolment chain, so nothing is run between units by hand. One branch takes up to 32 end units, in any mix of Driver, RGB and Valve.

Commissioning, step by step

Bring a panel up in this order. Every step has a lamp that proves it, and a lamp that fails to come up tells you where to stop and look. None of it needs a tool, a switch setting or an address: the only user control on any Arcus module is the SEARCH button on the SmartBuffer.

Check the supply before you energise. The Main and every SmartBuffer are mains-fed. The SmartBuffer accepts 100 – 264 V AC, but the screw terminal block on both modules is rated 160 V — confirm that against your supply before switching on. End units take 5 V from the SmartBuffer branch and have no mains connection at all.
  1. Energise the panel. Mains to the Main and to every SmartBuffer. The branch supply comes up with its buffer, so the end units on that branch power up with it.
  2. Watch the Main’s power-on lamp test. The Main steps its three status lamps in sequence — reset, run, fault, half a second apart — then clears them. If that sequence does not happen, the module is not starting. Check its supply before you look any further.
  3. Prove the e-stop. The loop on the Main is a dry contact and open means stopped — nothing plays while it is broken. The run relay follows the loop exactly, so the relay is your check: break the loop and confirm the relay drops, close it and confirm it picks up.
  4. Check each SmartBuffer’s sync lamp. Solid means the Main has enrolled that buffer and is talking to it. Dark means the trunk is not reaching it — check the RS-485 A and B pair back to the Main’s bus-out terminal, and check that the buffer itself is powered.
  5. Enrol each branch. At the buffer, hold SEARCH for 3 seconds. It walks the branch and numbers the units in the order they are wired, about one second per unit — a full row of thirty-two takes roughly half a minute. Do it once per buffer. The button only arms on a fresh press, so it has to be seen released first; a stuck button cannot start a search on its own.
  6. Confirm every end unit’s sync lamp. Steady means the unit is enrolled, in step with the show clock and idle. Dark means it never got an address — check its upstream and downstream backplane plugs and the terminator on the last unit in the row, then hold SEARCH again. On a Valve unit the sync lamp goes dark the moment any valve opens, so a dark lamp there during a show is normal.
  7. Read any fault lamp. On an end unit the fault lamp blinks a priority code: the number of blinks names the fault, and the most serious one wins. On a SmartBuffer it lights on an over-count — a thirty-third unit tried to enrol, and a branch takes 32. Move the surplus units onto another buffer.
  8. Set the per-unit configuration from the website. Once the branch is enrolled every unit is reachable by its position, and the rest is done in the web application: names, groups, and the settings each module carries — nozzle, motor type, max height, reverse, offset, accel, decel, pump limits and drive model on a Driver; one RGB fixture or three separately groupable single-colour lamps on an RGB; the curtain identity on a Valve. There is no address to set anywhere.
  9. On each Driver, watch the two drive lamps. TX means the module is asking the inverter; RX means the inverter is answering. Both flashing is a healthy link. TX flashing with RX dark means nothing is answering — wrong baud rate, wrong address, wrong wiring, or a drive that is off.

What a lamp is telling you

LampWhat it means
Main lamp testReset, run, fault in sequence at power-up, half a second apart. No sequence, no start
Main RUNA playlist or a single song is playing
Buffer SYNC solidThe Main has enrolled this buffer and is talking to it
Buffer SYNC darkNo trunk. Check the buffer’s own supply and the RS-485 pair to the Main
Buffer FAULTAn over-count — a thirty-third unit tried to enrol — or another held fault
Unit SYNC steadyEnrolled, in step with the show clock, idle
Unit SYNC darkNo address yet: enrol the branch again. On a Valve, an open valve also darkens it
Unit FAULTBlinks a priority code naming the fault; the most serious one wins
Driver TX / RXTX: the module is asking the inverter. RX: the inverter is answering. TX without RX is a dead link
Addresses are positional. A unit’s identity is where it sits in the row, so splicing a new unit into the middle shifts every address after it. Enrol that branch again afterwards and check the groups. It is also why a show always targets groups and never a single unit.
A Driver cannot reach an inverter left on its factory settings. The Modbus link is fixed in firmware at 19,200 baud, even parity, drive address 1. An INVT sitting at 9600 8N1, or at any address but 1, is deaf — and the parameter write that would correct it has to travel over the very link that is wrong. Somebody has to set it at the drive’s own keypad.
A SmartBuffer will run without the Main. After 5 seconds of silence on the trunk, a commissioned buffer starts playing its one stored show on a loop and generates the show clock itself. The loop can be 30 to 600 seconds. A loop length of zero is a separate, deliberate state — not commissioned — and the buffer stays quiet rather than playing something nobody asked for.

System limits and enclosures

Arcus is planned in whole branches. One SmartBuffer carries up to 32 end units, one Main carries up to 30 SmartBuffers, and the figures below are hard limits, not suggestions. Size the panel and the rail against them before you order anything.

LimitValueNote
End units per SmartBuffer32One shared 1…32 sequence, whatever the mix of Driver, RGB and Valve
SmartBuffers per Main30
End units on one controller96030 branches of 32
Songs on the Main50Plus 10 playlists, 10 schedulers and 100 triggers
Songs stored per end unit30
Cues per song, per end unit8000 EEPROM · 800 FRAMA pool is authored to its smallest unit
Bus speed1,000,000 baudThe same on every port in the system
Show clock10 ms tickBroadcast by the Main
Branch supply5 V, 6 A
Operating temperature0 – 80 °C

Two generations of end unit

End units now ship with a 256 KB EEPROM in place of the earlier 32 KB FRAM, which takes a unit from 800 stored animation steps to 8000 cues. FRAM units already installed keep working and are being retired over time, and the two mix freely on one bus.

A show is bounded by the smallest unit taking part. Until a pool is entirely EEPROM, it is authored to the 800-step budget. The two generations take different firmware and neither accepts the other’s, so an update cannot reach the wrong module.

Enclosures and rail space

ModuleW × D × HNotes
Main85 × 57.6 × 115 mmOne envelope, two lids — Bluetooth and display
SmartBuffer85 × 57.6 × 80 mm35 mm shorter than the Main in the long axis
End units20 × 85 × 58 mmOne shared 20 mm shell for the Driver and RGB
Pi gateway box106.3 × 68.8 × 51.8 mm106.3 × 88.8 across the mounting wings; 151.3 mm long with the cable shroud fitted

An end unit is 20 mm wide, so a full branch of thirty-two occupies about 640 mm of DIN rail. The Main and the SmartBuffer are 85 mm wide each, so allow for them on the same rail and leave room above and below the row for the field wiring.

Start

What Arcus is

A musical fountain: pumps push water through nozzles and LEDs light it, choreographed to music — automatically, from an AI that writes the show.

A pool is a chain of end units (each one jet: a motor driving its pump, and/or an RGB light) hanging off buffers that hang off one Main controller. The Main owns time and the schedule; a Raspberry Pi gateway gives it internet, audio and remote control. In the cloud, the website and phone app talk to a backend that stores shows, runs the AI composer, and holds ownership.

MUSIC → AI composer → show (cues) → Main → Buffers → End units  ·  Pi = internet + audio + OTA

Sold example: a 150-unit fountain = 75 motor (Driver) units + 75 LED (RGB) units, on ~10 buffers of 15 units each.

Hardware

Layout & wiring

One Main controller, up to 30 buffers, and up to 32 end units per buffer — all daisy-chained on a single shared wire.

Every unit is identified by its position in the chain: which buffer it sits on, and its number within that buffer. That position is assigned during a scan, never typed in by hand — so inserting a new unit shifts the numbering of everything below it, and the system re-discovers the order rather than guessing it.

Hard limit: 32 units per buffer. The 150-unit pool spreads across about 10 buffers to stay under it.

The boxes

Six module types. Each is a PIC microcontroller with a shared RS485 transceiver and its own non-volatile memory for settings — end units ship with EEPROM now, and the earlier FRAM units are being retired.

A Main

The brain — song catalog, playlists, 10 schedulers + 100 triggers + a forever list, the pool clock and pump ceiling. Broadcasts prepare/play/time. New units carry BLE; the legacy display variant is still maintained for modules already in the field.

S Buffer

Repeats the bus down to its ≤32 units and back, gates addressed traffic, relays OTA. Mostly transparent.

M Driver

Drives one pump via a VFD (INVT GD20/GD27/GD350, GD10 or CHF100, Modbus). Owns nozzle, max height, accel/decel, pump limits, reverse. 75 in the sold pool.

C RGB

Drives one jet’s RGB light; animates so colour staggers across jets like the water. 75 in the sold pool.

V Valve

Curtain/valve unit, keyed by a curtain id. Not in the 150-unit pool.

DMX module

A Driver module carrying the DMX512 firmware instead: it drives one lighting fixture out of the same isolated terminal. It appears to the system as an ordinary light, so it shares groups and cues with the RGB modules.

Add-ons

Pi gateway, RN4871 BLE on the Main’s UART5, and the ordered ATECC608B secure element.

Cabling & connections

The whole pool is ONE daisy-chained RS485 bus. It leaves the Main, threads through every buffer, and each buffer fans out to its end units — one continuous line, not a star.

  • Chain, don’t star — each box has a bus IN and a bus OUT; run OUT → IN down the line. RS485 wants a clean daisy-chain; loose stubs and star splits hurt the signal.
  • Keep the pair consistent — RS485 is two data lines (A / B) plus a common reference. Keep A→A, B→B the whole way; one swapped pair silences everything past it.
  • Order IS the address — because SlaveIDs are positional, the physical order you chain the units in becomes their numbering. Chain them in the order you want them numbered, then run a search to assign the IDs.
  • Power + data together — each box needs its supply and the data pair; the pump motors are driven by their VFD on its own feed. Watch the total run length and volt-drop on long chains.
Connector pinouts per box — which terminal is A / B / GND / power on the Main, the buffer and each end unit — belong here. They’ll be added from the wiring drawing so an installer can wire without guessing.

The Pi gateway

A Raspberry Pi on the J2 bus that turns a standalone Main into a connected, controllable, updatable fountain.

  • Internet & relay — presence/commands/songs over a cloud relay (push), heartbeats for “online”.
  • Audio — plays the show’s track in sync with the water.
  • OTA — pulls firmware and flashes the modules over the bus.
  • Own hotspot — a WPA2 access point with a per-device password, so you can control the pool with no venue network.
  • Self-update — pulls its own daemon bundle from the cloud.

The Pi gateway, deeper

An installed Raspberry Pi is the fountain's brain and internet bridge; it reaches the cloud and the phone without any router changes at the venue.

Reaching a Pi behind the venue's network

A transparent relay carries the connection: the Pi dials out to the relay and the phone dials out to the relay, so both sides connect outward and no port-forwarding is ever needed. The link is encrypted in transit, and the fountain's control password still gates control end to end.

Module takeover on link loss

The Pi sends the Main a steady keepalive about every 2.5 s. While it keeps arriving the Main stays Pi-driven and holds its own schedule engine off; if it stops for ~8 s the Main takes over and runs its own schedule — the pool never goes dark.

  • Presence / heartbeat — while the relay is up it reports the whole fleet's presence in one step, so every fountain's online state stays fresh; the Pi only sends its own heartbeat (every 20 s) when there is no relay. The app shows a fountain as offline once it has been silent for 60 s.
  • Pairing the Pi — the programmer or owner issues the Pi's gateway key once (it is shown a single time, then kept only as a fingerprint). The Pi presents that key to prove it is exactly one fountain's gateway.
  • Self-update — the Pi reports its own software version, and the phone can trigger an update or restart. Updates apply with a health-check and automatic rollback, and the Pi updates last — after its units.

VFD wiring & Modbus

The Driver module talks to an INVT variable-frequency drive (VFD) over its own separate wiring, using the standard Modbus protocol, and picks the spin direction from whether a show is playing.

Drive settingValue to set on the drive
DrivesINVT GD20/GD27/GD350 (default), GD10, CHF100
ModeModbus RTU (default) or ASCII
Drive address1
Serial19200 baud, 8 data bits, even parity, 1 stop bit (8E1)
  • Run / reverse / stop — the Driver tells the drive to spin forward, spin in reverse, or stop, based on the show state and the per-motor Reverse setting.
  • Speed — the 0–100 pump speed is scaled against the drive's own maximum frequency and the pool's pump ceiling, then sent to the drive.
  • Per model — on a GD20 the run and speed go together in one message; on a GD10 or CHF100 they are sent as two separate messages. The Driver handles this automatically.
This drive link uses the Driver module's own dedicated wiring, separate from the fountain's unit chain.

Firmware

How the boxes talk

Every box in the fountain shares one internal language. You never type any of it — the website and phone speak it for you.

When you press Prepare, Play or Stop, set the show clock, adjust the pump ceiling, or configure a unit's nozzle, height or reverse, the app turns that into the right message and delivers it to the right unit automatically.

The language is built to grow safely: new features are added as new settings, never by changing what an existing message means. That is why a newer box and an older box in the same pool always understand each other, and why a firmware update never leaves part of the fountain unable to talk.

What this means for you: mixed firmware versions across a pool are safe, and the controls you see in the app map straight onto what each box does.

Where settings are stored

Every module remembers a set of values — its identity, how it's configured, and how it's doing. The website and phone read and write these for you.

GroupYou canWhat it holds
Identityread onlymodule type, firmware version, bootloader version, serial number, result of the last update
Unit setupread & setnozzle, motor type, maximum height, reverse, offset, acceleration, pump minimum/maximum — and RGB type on colour units
Pool setupread & setthe pool-wide pump ceiling, the disable (kill) switch, and the anti-theft leash — all held on the Main
Diagnosticsread onlyuptime, fault flags, drive (VFD) state

Reading a value and setting it use the same path, so what you save is exactly what reads back — no drift between what you set and what the module runs.

On-module memory

Each module keeps its settings in permanent on-module memory that survives being powered off.

  • Safe defaults — if a stored value is ever blank or out of range, the module quietly falls back to a safe default. A brand-new or just-wiped module is never born with a bad setting.
  • Update-safe — a small part of memory is set aside for the update process, so a firmware update that gets interrupted can't corrupt the module's normal settings.
Why it matters: settings you make at commissioning stay put across power cuts, and the fountain protects itself from half-written or empty values on its own.

Over-the-air updates

Firmware updates are delivered over the air from the website — no site visit needed for the buffers and end units. Each module checks an update before it commits to it.

  • Verified before install — every update is encrypted and integrity-checked as it arrives, so a module only installs a genuine, undamaged image.
  • Safe if interrupted — if power drops or the update is broken off partway, the module falls back to its working firmware instead of bricking. Only a brief final moment must complete, and the process is built around surviving everything up to it.
  • The Main is flashed on site — the central Main controller isn't updated over the air; an installer flashes it by hand with a PICkit. While that's happening the fountain goes quiet — that's the expected, safe state.

Provisioning & identity

  • A 10-digit random serial and a 256-bit device key are burned into the PIC User ID (64B) at flash and registered with the backend.
  • Anti-clone is website-only — duplicate-serial detection in the cloud warns HQ with forensic proof and never auto-disables; there is intentionally no runtime device-key verification.
  • Real-serial guard: an all-zero 00000000 serial is a “ghost” — never claimed, owned, or listed.

Pump & motor control

  • Pump ceiling (1–8) — the pool-wide cap on how hard any pump may run. Set once on the web for the whole pool, it is applied to every pump and re-affirmed at the start of every show. It fails open — if the value is ever unreadable it is treated as uncapped, so a bad setting never chokes the fountain.
  • Motor reverse — a per-pump switch that flips the drive's spin direction; it fixes a phase-swapped pump without re-wiring. Set at commissioning on the web.
  • Per-unit limits — nozzle, max height, accel/decel, pump min/max % — all set per unit at commissioning.
Fault LEDs (red): a Driver blinks a code — ≈1 Hz = serial/address mismatch, fast = song too long, medium = drive/pump unreachable. A Driver, RGB or Valve red LED is never steady; a solid red is the Main's e-stop, not an end unit. Full per-module table → Troubleshooting → Fault-LED reference.

Firmware field ops & module indicators

Units are updated over the air from the website — each buffer and end unit has its own button — while a version of 0 marks a module sitting in its startup loader with no working program yet.

Update / Re-flash

Each unit has its own button, targeting exactly that unit by its place in the chain. The button reads Update to vN when the unit is behind, or Re-flash vN for a forced re-install. It confirms first and shows live % + ETA; only one update runs at a time.

Startup-loader update

A separate, master-only button (enforced on the server too). The normal app update is the amber action; the red action re-installs the module's startup loader itself. The Main is never updated over the air — it is updated by hand with a PICkit on site.

  • Version 0 = no working program — every tune/memory/test control is hidden and the unit can only be updated. An amber chip offers the one-click app update, and a buffer in this state is flagged BOOTLOADER.
  • Order: end units first — a buffer relays the update through to the end units below it regardless of its own version, so end units keep working while the buffer updates.
  • Update outcome — if an update fails, the unit automatically falls back to its previous program — a safe, non-destructive recovery the site shows as an "update failed" badge.

Software

The software stack

Website — arcusl

The programmer/operator console: per-unit device config over Web-Serial, the AI composer, the locker, admin/fleet pages.

Backend — RestAPI

Accounts, ownership, the show locker, billing, and the AI compose pipeline.

Phone app — arcus_app

The operator’s post-setup tool: run shows, compose, monitor, kill-switch, BLE.

Pi daemon — pi-gateway

On-site control: module link, hotspot, self-update, cloud relay, kill-switch enforcement.

Role split: the programmer sets up the pool on the web at commissioning; the phone app is the operator’s tool for after — it runs and composes, never does setup.

The AI composer

A physics-aware author that turns a song into a fountain show — cues for every jet and light, aligned to the beat.

  • Plan-then-compose — a 1-on-1 chat plans the show first; the agreed plan is built into cues.
  • Animations — a fixed AI palette (grow, fall, wave, chase, bounce, alternating, coindrop, split). Ripple remains available for manual shows but AI Composer never emits it. Variety comes from the music, not a catalogue.
  • Rig rules — the programmer’s AiSettings: mirrors, motor↔LED couplings, mutual-exclusions, per-group excludes & centres. The composer obeys; the operator respects.
  • Compose defaults — the pool’s standing palette/density/flash/height. Web sets them; the phone inherits and respects them; a per-show tweak layers on per field.

Credits & billing

The price of a show is the length of the song — nothing else.

  • Rate: {{PRICE}} per second of music. A 218 s song costs 218 × {{PRICE}} — before, during and after. It is multiplication, not an estimate, so it never moves.
  • Fixed before Compose: the model, effort, group count and token spend do NOT change the price. You see the exact final amount and Compose is gated on it.
  • A failed compose = ⬡0: if no show is delivered the whole charge is returned, even when the model ran and burned tokens — you buy a show, not an attempt.
  • Balance guard (402): anyone below the price is blocked with "Not enough balance to compose. Top up to continue." Only role 100 (master) composes free.
  • Minimum length: a compose needs a real billable length (≥ 60 s) or it is refused.
  • Planning costs a little: each plan-chat turn charges the actual Anthropic cost × 3, taken immediately; the song analysis that grounds the plan is free. A near-empty balance blocks chat too.
  • Top-up is manual today — credit is added to the account; there is no auto-recharge.
Only role 100 sees what a compose cost us (the Anthropic bill and margin); the customer only ever sees what they paid.

Rig rules: mirrors, centres, couplings, mutex, excludes

The AutoShow rig editor IS the core physics programming — it tells the composer how your pool is wired.

  • Mirror pairs: two groups play as a symmetric wing pair. Mirroring is geometric — order each group's devices outside-in so index 0 of one wing physically mirrors index 0 of the other. (Set swap only when one side wasn't reverse-ordered.)
  • Centres: the device IDs you pick as the MIDDLE between a mirrored pair. Explicit only — leave it empty and the middle stays dark; nothing is ever auto-chosen.
  • Couplings: a directional motor→LED link, "light follows water" — that LED group lights that motor group.
  • Mutex: never-play-together pairs (groups or single units) the composer will never fire in the same moment.
  • Excludes: whole groups the composer must not touch; skip unit drops one broken end unit (by SlaveID) from every group, server-side.
  • How the composer obeys: these lists are the durable truth enforced at compose. A per-show override can switch a whole class off (mirrors, light-coupling or mutex) but cannot invent new ones.
Mis-set them and it fails silently — wings ordered wrong mirror the WRONG jets, a missing centre leaves a dark hole in the middle, an over-eager mutex or exclude leaves groups dark. Verify on the water.

AI composer: how deep the chat goes

The plan chat is a real control surface, not just conversation.

  • It changes the build: "make it 3 minutes", "no ripple", "softer" are applied straight into the settings — duration and every rule (flash, density, heights, ramps, white, silence, transitions, arc, palette, mirrors, coupling, mutual-exclusion, colour, banned animations) take real effect. The planner confirms only what it actually applied.
  • Attach a track: pin a song and the planner holds its full block grid and plans to THAT music (one track at a time — a new one replaces the old).
  • Attach a show: pin an existing show to improve this; Compose then recomposes fresh from the saved inputs (brief / blocks / track), never re-sending the heavy animation.
  • Model: the composer always runs on one fixed top model. Because the price is flat per second, customers always compose on that default; choosing a different model is a manufacturer-only tool.
  • Effort: low / medium / high / xhigh is the quality dial — it drives how hard the model thinks. The plan chat itself runs on a lighter model.
  • Language: the plan replies in your website's language (Turkish or English).

Compose settings: the full vocabulary

Every override the composer will obey. Set them as pool house-style (standing defaults) or per-show in chat — a per-show change wins field by field.

SettingWhat it does — options (default)
useMirrorshonour the mirror pairs (on)
coupleLightLEDs follow their motors (on)
useMutexhonour never-together rules (on)
strictColoursaturated colours only (on)
minRampSslowest motor ramp, 0.2–2 s (0.2)
heightFloorlowest level the show may sit at, 0–60 (0)
heightCeilinghighest level it may reach, 40–100 (100)
flashAmountnone / rare / normal / heavy (normal)
cueDensitycalm / normal / busy (normal)
whiteUsagepunctuation / free / never (punctuation)
silenceModedark / bridge / feature — what silent passages do (dark)
transitionsflow (hand over, no dead water) / cut (hard scene changes) (flow)
showArcauto / build / waves / calmend (auto)
paletteauto / warm / cool / contrast (auto)
bannedAnimsforbid any of: grow, fall, wave, chase, bounce, alternating, coindrop, split (none; can't ban all). Ripple is unavailable to AI Composer.

Store & ordering

The store is quote-first: the customer designs a fountain, the cart prefills the parts, and the manufacturer returns a price — no money moves online.

Design in the sim (configurator) → Cart prefilled → Request quote → HQ prices & replies → Accept
  • The sim is the configurator — the TIA-style Devices designer. The cart prefills unit quantities from that design and they stay editable.
  • Catalog — Main, Buffer/Splitter, Driver, RGB, Valve, Terminator. The manufacturer keeps prices on the Database page.
  • The server prices, not your browser — requesting a quote sends only the quantities and your design up; the server prices each line from the catalog and your standing discount, so a tampered browser can't invent its own pricing. Quantities are capped at 1000 per line.
  • A quote is a request — its status runs new → quoted → accepted → closed. The record is deliberately order-shaped for when a payment processor lands.
Quote-only mode is on: customers see no prices anywhere — only their line items and the status. Public pricing is a single switch when it returns.

Ownership & security

Roles & ownership

RoleWhoCan
Ownerthe customerfull control — run, compose, config, transfer, kill-switch; sees the programmer
Programmermanufacturer/installerfull power until sold; after a real owner exists → support only (loses operate/edit/gateway/factory-reset) but keeps the kill-switch + leash
MasterHQ (role 100)fleet admin — everything, incl. revoke

Transfer/resale: a sale reassigns the owner and clears the seller’s shares; the buyer inherits the show locker.

Kill-switch & anti-theft

Turn a fountain off (and on) remotely — the owner's safety control and the manufacturer's non-payment lever — in layers, so it holds even if the gateway is unplugged.

Cloud + phone

Disable or enable from the website or phone (owner, programmer, master). The disabled state is durable — it survives a factory reset; a simple on/off toggle in the phone.

Gateway enforcement

The gateway holds the disabled state (survives a reboot), stops any running show, and refuses all play — manual, playlist and scheduled alike.

Module-level lock

The Main module remembers the disable (kill) switch in its own on-module memory: even standalone with the gateway unplugged, it refuses every list, solo and forever loop.

Owner-heartbeat leash

Opt-in. The fountain expects to check in with the cloud from time to time; a unit left fully offline past the window locks itself. Off by default.

BLE PIN & access

Stand by the pool with no network and control the Main over Bluetooth — behind a PIN.

  • PIN gate — a 6-digit PIN unlocks a BLE session. Change it in the app; the new PIN is best-effort escrowed to the cloud for recovery.
  • Brute-force lockout — a FRAM-persisted counter (survives power-cycle and reconnect): after 10 wrong PINs the module stops checking until a wired reset clears it.
  • Reset-pin is wired-only — physical cabinet access is the ownership proof, so a lost PIN can never brick BLE.

Accounts & sign-in

Everyone works through a signed-in account, so the system always knows who is making a change.

  • You sign in on the website or phone with your Arcus account; the cloud confirms who you are before trusting a request.
  • Your role — owner, programmer, operator or master — decides what you are allowed to do.
The sensitive actions always require a verified, authorized identity — a factory reset, backup and restore, revealing a fountain's Bluetooth pairing PIN, transferring ownership and the kill-switch can never be done anonymously.

Claiming & ownership lifecycle

Every fountain moves through a fixed chain: an installer claims it, commissions it, then offers it to the buyer — who has to accept. Nothing on a fountain works until it has been claimed, and ownership is given, never taken.

Claim (installer) → Commission → Offer to the buyer → Buyer accepts → Share (owner, max 4)
  • Claim — only a programmer can claim a fountain; operators never can. A fountain whose Main still carries the all-zero placeholder serial is refused (give the Main its real serial first), and one already claimed by another programmer comes back as already claimed. Claiming makes you its Installer and nothing else. Until an owner exists the installer acts as one, so a freshly commissioned pool can be run, shared and handed on; and until somebody claims it, nobody can configure it, name it or run it — being at the fountain with a cable is not authority.
  • Share — owner only. You name the account by email or id and it must be a real registered account; up to 4. A shared user can play and operate but cannot edit, transfer or re-share, and may remove only themselves.
  • Transfer / resale — the owner offers it on (or the installer, while the fountain has no owner yet). It is an invitation: you name an account by email, and nothing changes until they accept it. That is deliberate — a mistyped address would otherwise hand the fountain to somebody who does not exist. On acceptance it is a full handover: the seller's shares are cleared, the buyer inherits the show locker, and the first non-programmer owner gets the owner free-credit tier once. An outstanding offer shows on the ownership panel to both sides, and either the sender or the current holder can withdraw it.
  • Handing the installer role on — the installer offers it to another programmer account, who must accept. This is the only way out of the role: it cannot be released, so a claimed fountain always has an installer. If yours has left the company, Arcus staff (role 100) move it with no acceptance step — that is the recovery path.
  • After the sale — the installer keeps the fountain: commissioning (unit types, limits, groups, placement), naming, authoring and operating stay theirs, because a customer with a fault needs the person who built it. What passes to the owner alone is ownership: sharing, adding mp3s, handing it on. Module swaps, serials and chain rescue are Arcus staff work.
The one power a demoted programmer keeps is the disable (kill) switch — the manufacturer's non-payment lever, the only manufacturer control that survives the sale.

Security operations

Four independent layers protect a fountain from theft, cloning and non-payment — most fail closed today even before login is enforced.

Anti-theft leash

Set by the programmer or master only, never the owner (who could disarm it on a financed unit). The Pi renews the Main's expiry on each cloud contact; a unit that goes the set number of days with no contact stops itself. Set the window to zero to disarm.

Kill-switch

The owner, the programmer (kept after sale), or master can disable or enable a fountain. It latches a durable flag that survives factory-reset and reboot; the Pi holds it too and refuses all play until re-enabled.

  • BLE-PIN recovery — the 6-digit PIN is random at the factory and the module locks out after 10 tries. The owner (or master) can escrow and reveal it, encrypted at rest; a lost PIN is otherwise recovered through a wired reset. If no escrow key has been set up, the feature is unavailable.
  • Anti-clone / real-serial guard — website-only, with no check on the fountain itself or the Pi. The all-zero placeholder serial can't claim, own or appear in any list. A duplicate serial (same serial, different key) seen at the factory is reported to HQ with forensic proof (IP, network name, PC, employee) and refused — but never auto-disabled; a clone is simply a brick until a human grants it a programmer claim.
Login enforcement is built but staged off; it turns on in steps (configure the login system → clients send tokens → server verifies → enforce). The dangerous actions — escrow, migrate, disable, factory-reset — already fail closed regardless.

Operations

Install & commissioning

  1. Mount & wire the cabinet: Main, buffers, end units on one RS485 chain; power; the Pi on J2.
  2. Search from the Main to enroll every unit — assigns the positional SlaveIDs.
  3. Configure each unit on the web (Web-Serial): type, nozzle, max height, accel/decel, limits, reverse. A programmer job.
  4. Set pool rules + the compose house-style.
  5. Provision internet (venue Wi-Fi or the Pi hotspot) and set the owner.
  6. Hand off — the customer runs it from the phone.

Flashing & updates

  • At the bench: the ArcusFlash tool writes the firmware, serial number and key onto a new module and registers it. Access is request → approve; the firmware is pulled from the cloud.
  • In the field: updates go out over the air, driven by the Pi from the published versions. The Main needs an on-site PICkit only for its deepest startup code.
  • Publishing: new firmware is built, checked and published to the cloud by the manufacturer. Installers and operators only flash the published version.

Shows & scheduling

  • Songs live in the cloud locker (audio + cues) and are installed onto each unit's on-module memory.
  • Playlists group songs; up to 10 schedulers and 100 triggers fire shows by clock time or sunrise/sunset, and a forever list loops when nothing else is scheduled.
  • How a show starts — the units first hold still, then get a prepare signal, then a short 2-second lead-in, then the show plays with all the jets moving in time to the music.

Scheduling: schedulers, triggers, forever list

When shows run — built from schedulers, triggers and one forever override, all stored on the module.

  • 10 schedulers — named on/off groups. A trigger fires only when its parent scheduler is enabled — one switch arms or silences a whole set.
  • 100 triggers — the flat pool that actually starts shows. Each trigger's fields are below.
  • Forever list — one switch plus one playlist that loops forever and overrides all scheduling; for bare LCD units with no gateway or GPS.
  • A running show is never interrupted — a trigger due while a show plays is dropped, never queued.
  • All of this is saved onto the module itself, so the gateway drives the schedule while it is connected and the module runs it on its own when the gateway isn't there.
Trigger fieldMeaning
Daysany of the 7 weekdays
Starta clock time, or sunrise / noon / sunset ± a minute offset (sun anchors need a GPS fix)
Repeatfire every N minutes inside the window; 0 = once
Untilend-of-window clock time; none = one-shot
Playlistwhich playlist this trigger starts
Priority0–255; highest wins when two fall on the same minute

Backup & restore

One encrypted JSON that captures the whole pool, and a restore that rebuilds it.

  • One file: AES-256-GCM encrypted under your account's Backup Key — a XXXX-XXXX-XXXX-XXXX code, minted once and then fixed. Tamper-proof and unreadable without the key.
  • The key is escrowed on your account and applied automatically after login. Write your copy down: it is your only way back if the cloud copy is ever lost — you type it in.
  • What it captures: programmer, songs/charts, every unit's hardware config (offsets, limits, accel/decel, driver/model/nozzle/motor type, max height, reverse, RGB type, positions/shapes), groups, playlists, the schedule, the whole show library, the AI rig rules, and the pool image.
  • Restore is gated first: the backup's topology must match this pool exactly — same buffer count, same units per buffer, each slot the same device type — or it stops with no change made. This lets two identically-wired pools share a backup.
  • Then it rebuilds: wipe → groups → unit config → songs → playlists → schedule → cloud. Songs merge with the pool's own; on a name clash the backup wins.
A restore is destructive once it passes the topology gate. A failed restore may leave the pool partly rebuilt — simply run it again; the file is never changed.

Reference

Glossary

TermMeaning
End unitone jet — a Driver (motor) and/or an RGB (light)
Buffera splitter carrying up to 32 units under the Main
Pump ceilingpool-wide pump limit, 1–8; a bad value defaults to fully open
On-module memoryeach module's permanent settings memory, kept through power-off
OTAover-the-air firmware update, sent from the website
AiSettingsthe programmer's rig rules + compose house-style
Kill-switchremote disable/enable, cloud → gateway → module
Leashopt-in self-lock if a unit loses cloud contact
Ghost serialan unflashed 00000000 module — can't be owned