LightSwarm LED Systems

How to look at a photo of a rig, tell which of the two LED systems it is, and read what's actually happening — where the processing lives and how the lights are driven.
JOURNEY / VMI
HARDWARE REFERENCE
03

Overview

A LightSwarm rig drives lighting through one of two hardware systems. They differ in one thing — where the processing lives — and everything else (wiring, addressing, whether the LED can be cut to length) follows from that one difference.

Dumb LEDs

Look for: COB strips with yellow covers, many wires home-running back to a 16-output MLS board.

MOD-U-LEDs

Look for: a chip on every LED, one continuous daisy-chain run, driven by a MOD-U-LED Interface.

What's Happening

Once identified, the system tells you how each light is addressed and driven — and where to look if one is wrong.

2
LED Systems
16
Outputs / MLS Unit
Board
Where Dumb Proc. Lives
LED
Where MOD-U Proc. Lives
The fastest tell. Yellow covers on the strips → you're looking at dumb LEDs on MLS 16 units. A processor visible on each LED with a single chained run → MOD-U-LEDs.

The whole difference in one picture — where the processor sits:

Dumb — brain in the board
MLS driver CPU processing here LEDs no chip
Smart — brain on every LED
MOD-U-LED Interface c c c c each LED carries its own chip (c) → daisy-chained
In plain English: a dumb LED is a light bulb on a wire — the board decides when it's on. A smart LED is a tiny computer with a light attached — it listens on a shared wire for its own instructions, so dozens can share one cable.

The two systems side by side:

Dumb — MLS (this model)Smart — MOD-U-LED
The lightPassive COB strip (yellow cover), no electronicsLED with its own processor on board
Brain livesIn the driver board (MLS16 / MLS40J)On every LED
WiringHome-run — one wire per output back to the boardDaisy-chained — one run, IN→OUT
Addressed byboard base (dials) + output numberthe module's own stored ID (e.g. 989–992)
Cut to fit?Yes — trim the strip to lengthNo — fixed discrete nodes
Best forModels where strips must fit tight spacesLong continuous runs, per-pixel effects
Command / protocolIdentical — same LS-bus packet for both; only the address differs
Reference — background & deep-dive
02

Hardware Catalogue

Every box that can appear on a LightSwarm rig, photographed from the actual kit. Two families — dumb drivers (the board does the thinking) and smart MOD-U-LED (the LED does) — plus the gateway and passive parts.

MLS16 board
Dumb driver

MLS16

16-channel driver. Switches 16 passive LED loads; address set by Add-Hi/Add-Lo dials.

16 ch · LS bus · 38400 baud (bench)
MLS40J board
Dumb driver

MLS40J

40-channel driver — the bigger MLS. Three of these run the Chalk Hill model (120 ch).

40 ch · LS bus · 115200 baud (Chalk Hill)
MOD-U-LED Interface
Smart driver

MOD-U-LED Interface

Drives the addressable smart-LED chain and sits on the bus as a control head. Internal fuse.

LS bus · drives daisy chain
MOD-U-LED module 990
Smart LED

MOD-U-LED Module

An LED with its own processor + stored address (yours are 989–992). Daisy-chains IN→OUT.

self-addressed · e.g. 989–992
USB LS Bus Interface
Gateway

USB LS Bus Interface

Bridges a PC's USB to the LightSwarm serial bus. This is the port you open from the test panel.

USB → LS bus · RXD/TXD/PWR
COB LED strips
Passive load

COB LED Strip

The "dumb" light — yellow-cover COB strip, no electronics. Cut to length, wired to an MLS output.

12V · cuttable · red=COM+ / black=ch
Breakout terminal board
Passive wiring

Breakout Terminal

Fans an MLS board's IDC ribbon out to numbered screw terminals (COM+ / channels).

ribbon → screw terminals
12V power supply
Power

12V PSU

Feeds 12V to the boards (via +IN/GND) and the LED loads. Size it to the channel count.

12V DC · e.g. Mean Well 60W
One bus, one protocol. Every intelligent box here speaks the same LS-bus command (16-bit address + fade). They only differ in how many outputs they drive and what address they answer to — see Addressing.
04

Dumb LEDs — MLS 16

The "dumb LED" system uses LED COB strips, identifiable by their yellow covers. The LEDs are passive; all the intelligence sits upstream in the driver board.

Characteristics

Passive strips

  • COB LED strips with yellow covers
  • No processor on the LED itself
  • Processing lives in the MLS 16 unit
  • Each strip home-runs to one board output
  • Can be cut to short, custom lengths
MLS Driver Board

The driver board

  • Comes in sizes: MLS16 (16ch), MLS40J (40ch)
  • Each output individually driven
  • Holds all per-channel processing
  • Base address set by Add-Hi / Add-Lo dials
  • Boards chain on the LS bus to scale up
  • Address = board base + output number
Signal Path — Dumb LED
Controller
LightSwarm
Driver
MLS 16 unit
Output (1 of 16)
Home-run wire
Passive
COB strip
05

MOD-U-LEDs

The MOD-U-LED system uses LEDs with an onboard processor, driven by the MOD-U-LED Interface. Because every LED is addressable in its own right, they can be daisy-chained on a single run.

Characteristics

Intelligent nodes

  • Processor on every LED
  • Each LED individually addressable
  • Driven by the MOD-U-LED Interface
  • Daisy-chained — one continuous run
  • Cannot be freely cut to length
Wiring Implication

Less home-run cabling

A single chain carries power and per-LED control down the line, so you don't return every light to its own board output. The trade-off is rigidity: each unit is a discrete, processored node and cannot be trimmed down like a passive strip.

Signal Path — MOD-U-LED
Controller
LightSwarm
Driver
MOD-U-LED Interface
Daisy chain
LED → LED → LED
06

Addressing & the Channel Map

Once you've identified a dumb-LED rig, this is what's actually driving each light. Because the intelligence is in the board, a light is identified by which board and which output it is wired to. Each MLS 16 board owns 16 contiguous addresses.

Address Formula
mlsUnit
board no.
−1, ×16
+ output
0–15
=
addr
unique index

In code terms: addr = (mlsUnit − 1) × 16 + output. So output 0 on board 1 is addr 0; output 0 on board 2 is addr 16; and so on. The address map is the single source of truth for which physical light a given addr drives.

Why it matters. When a light appears "wired wrong," the fault is almost always a mismatch between the physical output a strip is soldered to and the addr the map expects — e.g. an off-by-N output shift on one board.

Two questions this raises

How do we know a board's base?

Read the dials — or light it

The base isn't stored in software or in the port sheet — it's set in hardware by each board's Add-Hi / Add-Lo dials. Two ways to know it for sure: (1) read the dials, or (2) send a test address and watch which unit lights. The tidy 0 / 40 / 80 layout is an assumption until confirmed that way.

Is the command the same for every box?

Yes — one protocol

MLS16, MLS40J and the smart MOD-U-LED all take the same LS-bus packet: address + fade level. Proven on the wire — a broadcast to 65535 lights everything regardless of type. The only thing that differs between boxes is the address each answers to.

07

Rig Circuits

Two different rigs, both on the LightSwarm LS bus. Rig A is the bench demonstrator — one small dumb board plus the smart modules, side by side. Rig B is the Chalk Hill production setup — the same dumb-LED family scaled up to three 40-channel panels. Diagrams colour-coded by what each wire carries.

Rig A — Bench Demo

the real board · tap a number to find it in the list

LightSwarm bench demo rig 1 2 3 4 5 6 7
  1. 112V PSU ×2 — Mean Well + adapter. Power for everything.
  2. 2USB LS Bus Interface — the only "brain link": PC USB → LightSwarm bus.
  3. 3MOD-U-LED Interface — runs the smart side.
  4. 4Smart modules 989–992 — MOD-U-LEDs, daisy-chained IN→OUT.
  5. 5COB strips ×4 — the dumb LEDs (passive, cut to length).
  6. 6Breakout terminal — ribbon fans MLS16's 16 outputs to screw terminals.
  7. 7MLS16 — the dumb driver. All switching happens here.
Rig A — signal & power flow
12V 12V COM+ LS bus LS bus chain 16-way ribbon channels PCUSB host USB LS BusInterface MOD-U-LEDInterface MLS1616-channel driver 989 990 991 992 MOD-U-LED modules — daisy chain Breakout16ch terminals COB ×4dumb strips 12V PSU×2
control / LS bus 12V power LED output wiring

Rig B — Chalk Hill FINAL

3× MLS40J panels · from the Chalk Hill control-points sheet

Chalk Hill FINAL control rig, three MLS40J panels 1 2 3 4 5 6
  1. 1PANEL 1 — MLS40J — 40-channel dumb driver. Note the Add-Hi / Add-Lo dials set its address.
  2. 2PANEL 2 — MLS40J — second 40-channel board.
  3. 3PANEL 3 — MLS40J — third board → 120 channels total.
  4. 4MOD-U-LED Interface — sits on the bus as the control head here.
  5. 5USB LS Bus Interface — PC → bus, running at 115200 baud.
  6. 6Power + bus wiring — red/black = 12V; white = the daisy-chained LS bus.
What Rig B is. The Chalk Hill production control rig — three MLS40J boards, physically Panel 1 (Left) / Panel 2 (Center) / Panel 3 (Right), each using ports 1–26 (27–30 spare), fed by one USB LS-bus interface at 115200. Together they drive ~78 of the model's ~82 control points — condo/hotel apartments, amenities and office/site. It's the same dumb-LED system as Rig A's MLS16, just scaled up — and from what's visible, no smart MOD-U-LED modules. That scale-up is exactly why it first looked like a different system.
Rig B — signal & power flow
12V to all boards USB bus LS bus chain 40ch PCUSB host USB LS BusInterface · 115200 baud MOD-U-LEDInterface PANEL 1MLS40J · 40ch PANEL 2MLS40J · 40ch PANEL 3MLS40J · 40ch Model LEDsdumb COB Model LEDsdumb COB Model LEDsdumb COB 12V PSUsupply
control / LS bus 12V power LED output wiring
Rig A — Bench DemoRig B — Chalk Hill FINAL
PurposeShow dumb + smart side by sideProduction model lighting control
Dumb driver1× MLS16 (16ch)3× MLS40J (40ch) = Panels 1–3
Total channels16120
Smart modules4× MOD-U-LED (989–992)None shown — dumb-LED build
BusUSB LS Bus → both controllersUSB LS Bus @ 115200 → chained panels
Both diagrams are read from the rig photo (Rig A) and the Chalk Hill control-points sheet (Rig B). Confirm the LS-bus chain order and the per-panel 12V split against the physical boards before treating either as authoritative.

Worked example — how the system works, using Rig B

Chalk Hill is the clearest case to learn the whole system on: one control bus, three boards, 120 lights, all driven from a PC. Here's how an address becomes a lit light.

1. The address map

Each board's Add-Hi/Add-Lo dials set a base address; its 40 channels count up from there. Stagger the bases by 40 and the three panels tile a clean 0–119 with no overlap:

PanelBoardBase (dials)Local channelsGlobal addresses
PANEL 1MLS40J00–390 – 39
PANEL 2MLS40J400–3940 – 79
PANEL 3MLS40J800–3980 – 119

address = panel base + channel. So "Panel 2, channel 5" = 40 + 5 = 45. (Bases of 0/40/80 are an assumed convention — the real base is whatever each board's Add-Hi/Add-Lo dials are set to. Read the dials to know it, or light a test address and watch which unit responds.)

1b. The real port map — what each output drives

From the Chalk Hill control-points sheet. PORT is the output's label (1-based) — so Port 6 = channel 5. Panels 1–2 drive the apartment stack (floor-letter, e.g. 22-G = floor 22, unit G); Panel 3 finishes the apartments then the amenities & public areas.

PortPanel 1 (Left)Panel 2 (Middle)Panel 3 (Right)
1Penthouse23-G18-C
228-H22-A18-D
328-I22-B18-E
428-J22-C18-F
528-K22-D17-A
627-H22-G17-B
727-I21-A17-C
827-J21-B17-D
927-K21-CCondo club room
1026-H21-DLevel 6 Restaurant
1126-I21-ELevel 6 Hotel Pool
1226-J21-FLevel 6 Condo Pool
1326-K20-ALevel 5 Fitness
1425-H20-BLevel 5 Spa
1525-I20-CLevel 5 Ballroom
1625-J20-DLevel 1 Lobby
1725-K20-ELevel 1 Restaurant / Bar
1824-A20-FLevel 1 Standalone Rest
1924-B19-ALevel 1 Hotel Dropoff
2024-C19-BLevel 1 – screen accent
2124-D19-CLevel 1 Ivan entry
2224-G19-DLevel 1 office dropoff
2323-A19-ELevel 1 office lobby
2423-B19-FLevel 1 court lanterns
2523-C18-ALevel 1 office garage entry
2623-D18-BOffice – Level 6 Amenity
27not usednot usednot used
Reading it: "Panel 2, Port 6" is unit 22-G. If Panel 2's base is 40 and Port 1 = channel 0, that's bus address 40 + 5 = 45. So one command to address 45 lights apartment 22-G. (Each panel uses ports 1–26; ports 27–30 are spare. ~82 control points across the model, ~78 driven by these three boards.)

1c. What the channels actually light (by area)

From the building control-points sheet — the ~78 channels group into three kinds of thing:

Condo / Hotel units

Apartments

Penthouse + floors 17–28 (units like 28-H, 22-G, 18-C). Fills Panel 1, all of Panel 2, and the top of Panel 3.

Amenity

Shared spaces

17 Club, L6 Restaurant + hotel/condo pool terraces, L5 Fitness / Spa / Ballroom / Meeting / Terrace, L1 Lobby / Bar / Restaurant / Dropoff. Mostly Panel 3.

Office

Office & site

Garage, middle drive, office lobby, court lanterns, feature-screen elevation, L22/L6/L1 balconies. End of Panel 3.

2. Follow one command

"Light unit 22-G" — Panel 2, Port 6 = address 45, level 255
You
send addr 45
Controller
server / USB
bus @115200 →
All 3 panels
hear addr 45
Only PANEL 2
owns 40–79 → acts
  1. You send {lightsOn:[45]} at level 255 (one button click in the panel).
  2. The controller frames it as a LightSwarm packet and puts it on the bus at 115200 baud.
  3. Every panel sees the message — the bus is shared. Each asks "is 45 in my range?" P1 (0–39) no, P3 (80–119) no, P2 (40–79) yes.
  4. Panel 2 switches its Port 6 output (unit 22-G) — connecting 12V to that strip.
  5. Light on. Send addr 45, level 0 to turn it off; the board holds the last state until told otherwise.
This is also where "wired wrong" comes from. If a panel's dials are set to the wrong base, its whole 40-channel block shifts — so address 45 lights the wrong strip even though the command was correct. The fix is always: match the dials to the address map.

3. Test it from this page

  1. In the Test Panel, set Rig under test = Chalk Hill — baud jumps to 115200 and it generates 120 buttons (0–119).
  2. Connect (Server to the Linux box, or Direct USB if the interface is on this machine).
  3. Click button 45 → Panel 2's 6th light comes on. Or hit Test all (sweep) to walk every channel and confirm all 120.
08

Connecting to the Rig

There are three layers between your code and the lights: your client, the controller server (lightswarm-socket-server), and the serial link to the hardware. You talk to the server over WebSockets; the server talks to the boards over USB serial.

Connection Path
Your client
browser / Node
Socket.IO :9090 →
Controller
lightswarm-socket-server
USB serial →
USB LS Bus IF
115200 · 8N1
LS bus →
Boards
MLS40J ×3

Bring it up

  1. Plug in the USB LS Bus Interface and find its serial port — macOS ls /dev/tty.usbserial-*, Windows a COMx.
  2. Set config.jsonserialPort to that port and baudRate to match the rig (bench = 38400, Chalk Hill = 115200).
  3. Install & runyarn install then node index.js. The server listens on port 9090.
  4. Verifycurl http://localhost:9090/health reports server + serial status.
  5. Drive lights — connect a Socket.IO client, emit connect_device, then allOn or a lights command.

WebSocket API

Emit eventPayloadEffect
connect_device{ serialPort?, baudRate? }Open the serial connection
lights{ lightsOn:[], lightsOff:[], lightsDimmed:[] }Set specific addresses
allOn / allOff / allDimmedBroadcast to all (address 65535)
reconnect_deviceForce a serial reconnect

The server emits back connectionStatus, commandStatus and error. REST: GET /health, GET /config.

Addresses & the wire protocol

The numbers in lightsOn:[…] are global light addresses — board base + output (MLS16 → (unit−1)×16 + output; MLS40J → base + channel). 65535 (0xFFFF) is the broadcast / all-lights address.

# each command is a SLIP-framed packet (lightswarm.js):
[ addrHi, addrLo, command, ...data, checksum ]
  command  = 0x23   # MDP_FADE (35) — set level / fade
  data     = [level, 1, 1]   # level 0–255 (on≈190, off=0)
  checksum = addrHi ^ addrLo ^ command ^ ...data   # XOR of all bytes

config.json (key fields)

{
  "server":     { "port": 9090, "cors": { "origin": "*" } },
  "lightswarm": { "serialPort": "/dev/tty.usbserial-DA00VYIC",
                  "baudRate": 115200 },
  "lightLevels":{ "on": 190, "dimmed": 10 },
  "inactivity": { "timeout": 900000, "resetAction": "allOn" }
}
Remote access. On a deployed model the controller runs on a small Linux box reachable over a Cloudflare Tunnel rather than directly — so "connecting" in production means hitting that tunnelled :9090, not a local USB port.
01

LED Test Panel

A live tool to connect to a rig and exercise every channel. Pick a model (or type the LED count), generate a button per address, then click to toggle individual lights or run a full sweep. Two ways to drive it — no IP needed for either:

Option A · via server

lightswarm-socket-server

Run it on the same laptop → http://localhost:9090. Loopback, no network. Uses your proven protocol code.

Option B · direct USB

Web Serial

This page opens the USB serial port itself — no server, no IP, no Node. Chrome / Edge only. Just plug in and pick the port.

▶ Bench · MLS16
not connected 38400 = bench/MLS16 · 115200 = Chalk Hill
localhost = a server on this machine. Controller on the Linux box? Use the box's LAN address: http://<box-ip>:9090 — not localhost.
no server, no IP · Chrome / Edge

Generate a set above. Click a button to toggle that address; commands are sent live.

Live hardware. Every click sends a real command. All On / sweep drive the whole address space — fine on a bench rig, but on an installed model confirm it's safe to flash everything first. Direct USB needs Chrome/Edge and a secure context (https:// or http://localhost). If it can't connect the dot stays grey/red and the log shows why.
Deployed (https) vs local (http) — what works where.
Deployed Cloudflare site (https): Direct USB works on any PC — open it in Chrome/Edge, plug the rig into that PC, Connect USB. But Server mode to a http://<ip>:9090 box is blocked — an https page can't talk to a plain-http server ("mixed content").
Local copy (http://localhost): both Direct USB and Server mode work — use this one to test against the Linux box on plain http.
So: deploy for docs + plug-in-and-test-here (Direct USB); keep the local copy for Server-mode testing of a networked box.
09

On-Site Notes

Practical reminders when working with the dumb-LED system on a physical model.

01

Identify

Yellow covers = dumb COB strips

02

Cut to fit

Trim strips to the building length

03

Wire to output

Home-run each strip to an MLS output

04

Verify addr

Output + board must match the map

Verify against the map. The dumb-LED address scheme means a strip soldered to the wrong output lights the wrong unit even when the data is correct. Always check physical board/output against the address map after install.