An independent replacement for the fixture's web and dimming application — what it does, how it is deployed, and how it measured against the original.
This replaces one layer and one layer only: the Node.js application that serves the fixture's web interface and drives its LED dimming. The hardware, the Onion Omega2+ board, OpenWrt, the init system, SSH, networking, and the LED driver board underneath are all untouched and unmodified.
It runs as a drop-in substitute for the original application's own process — same init script, same restart mechanism, same node --expose_gc invocation the device already used. It speaks the same serial protocol to the LED driver, reverse-engineered from the original application's observed behaviour rather than guessed, and it keeps the same bearer-token HTTP API, so existing automation continues to work without changes.
The original application is a single file of roughly 23 KB plus a bundled dependency tree. The rewrite is a set of small single-responsibility modules with no runtime dependencies at all — nothing outside the Node standard library, which is what lets it drop the bundled tree entirely.
| Area | Responsibility |
|---|---|
| orchestrator, scheduler | Resolving the lighting schedule for the current moment and driving output |
| hardware, protocol, dimmer | Serial framing to the LED driver board, per-channel value computation |
| fixture_runtime | Schedule, spots and colour state; the single place that writes schedule files |
| web_server, templates, sessions, auth | HTTP routing, pages, login state, password and token handling |
| temperature, par_power | Live sensor sampling, smoothing, derating and shutoff |
| peer_sync | Optional schedule replication to a second fixture |
| memwatch, event_log | Memory ceiling enforcement, in-process event history |
| system_backup, support_bundle | Config export and diagnostics archive, with secrets redacted |
| setup_wizard, wifi_setup, timezone_setup, ssh_setup | First-boot and settings flows that previously needed shell access |
It carries its own automated test suite — several hundred tests — run both on a current Node release and specifically on the Node 8.10.0 the fixture itself runs. That second target matters: a test passing on a modern engine proves nothing about a nine-year-old one on a 124 MB board with no swap, and more than one real incompatibility was caught that way before reaching hardware.
Deployment is a single supervised script, run by hand — nothing deploys automatically. It is deliberately conservative, because the fixtures light a live reef tank:
An off-device backup is taken independently before each rollout and verified restorable — not merely created — by test-extracting it and comparing a checksum against the running version.
One fixture ran the rewrite while the other stayed on the original application, on the same tank, same schedule and same automation, for six days of direct comparison before the second unit was switched over on 10 October 2026.
| Original application | Rewrite | |
|---|---|---|
| Availability checks | 1614 / 1614 | 1614 / 1614 |
| Failures | 0 | 0 |
| Automatic recoveries | 0 | 0 |
| Memory, mean | 119.2 MB | 114.3 MB |
| Memory, range | 114.4 – 122.1 MB | 112.4 – 115.5 MB |
| Drift over the window | −1.4 MB | +1.6 MB |
Neither showed any sign of a memory leak: both drifted by under 2 MB over 135 samples, and not consistently in one direction. The rewrite averaged about 5 MB lower with less than half the variance. Switching the second unit freed roughly 20 MB of RAM and some flash on it, since the bundled dependency tree goes away.
A fixture answering HTTP does not prove it is lighting anything. Each rollout is therefore confirmed on three independent signals: the fixture's own PAR sensor reading compared against the other unit's (they tracked within 1.5%), a successful scheduled push from the external automation after the swap, and the preserved schedule data read back through the API.
This hardware is out of warranty. The author considers inspecting, patching and rewriting equipment he has paid for and runs himself to be entirely his own call and his own risk to carry. If any of this is useful background for your own out-of-warranty unit, the same applies to you.
Companion writeups: ATI Straton Flex Reliability Notes and ATI Straton Flex Firmware Rewrite at rooselaers.be/Acropora.