Lumware
Software for programmable light strips. A Python host decodes media, applies the colour pipeline, and streams frames over USB serial to an Arduino driving a NeoPixel strip.
Lumware streams light. Real pixels, real frames, real photons. No mood-lighting heuristics: the colour that hits the LED is the same colour the dashboard previews.
En xifres
- 30 fps sostingut a 299 LEDs (RGB), measured.
- Wire baud 500 000, frames binaris amb CRC8.
- Frame budget host ~8 ms, latency p99 < 12 ms (host → photon).
- Transport
serialper a hardware real; transportvirtualper a desenvolupament sense Arduino — la UI rep exactament els mateixos bytes que rebria la tira.
La família
- Lumware (flagship, aquest hub) —
host → strip. - Lumware Capture —
sensor → host. Repository separat, planejat. - Lumware Stage —
unity ↔ strip. Repository separat, planejat.
Què no és
No automatització de la llar. No mood-lighting. No núvol — viu a
la LAN. No depèn de hardware: el transport virtual arrenca sense
Arduino i les imatges de calibració se sembren soles al primer boot.
Aprofundir
Els deep-dives — un script de 200 línies que es converteix en una família, l’electrònica mínima, el firmware Arduino, el protocol binari, l’arquitectura Python, BMAD i les branques, la identitat spectrum R/G/B/W, la UI web local, els benchmarks — viuen com a sèrie al blog. Cada article enllaça amb l’anterior i el següent dins de la sèrie.
Full series
Part of Lumware 01/10
What Lumware is
I set out to blink a few LEDs. I ended up designing a software family for programmable light strips.
Part of Lumware 02/10
From script to product
There was a 200-line script. It worked. The story did not end there — without the next step, there would be no family.
The minimum electronics for lighting a strip
Six parts. Drop one and the symptoms lie: the first LEDs work, then colors go random. Why every single piece matters.
Part of Lumware 04/10
The firmware: Arduino and critical timing
An Arduino Uno has 2 KB of RAM. A 300-LED strip is 900 bytes just for pixel buffers. Every decision is a question of space.
Part of Lumware 05/10
Why a binary protocol (and not JSON)
The easy option was JSON. It was also the option that made 30 FPS physically impossible. A six-byte-overhead binary protocol clears the bottleneck.
Part of Lumware 06/10
Host architecture: events, settings, scheduler
Three decisions changed how I think about this host. None is dramatic on its own. Together, they make all the difference.
Part of Lumware 07/10
BMAD: plan before writing code
If I just write code, I lose the thread by week three. If I over-plan, I lose it sooner. I had to learn to plan without drowning in planning.
Part of Lumware 08/10
Identity: spectrum R/G/B/W
The name took longer to surface than the architecture. When it did, everything fell into place — even the brand colors.
Part of Lumware 09/10
The local web UI: FastAPI inside the app
A physical knob would be optimal. Building one, not. I put the UI in the browser and made it reachable from any device on the LAN.
Real framerate: benchmarks and bottlenecks
The theoretical ceiling is one thing. What you measure is another. The gap between the two is where the work that's left lives.