A lighting program can calculate the right fade while the lamp remains dark. Between those two events sit a protocol, an interface and a routing decision. Open Lighting Architecture, or OLA, supplies that distribution layer: software generates lighting values, while OLA carries them through supported network protocols or hardware adapters. Following that path reveals a second responsibility hidden inside the plumbing: deciding which controller's values reach the lights when several sources speak at once.[1]
There is a useful small-scale example in Ryder Damen's Tom's Hardware tutorial, updated in September 2022. He connects a Raspberry Pi to a DMX fixture through an Enttec Open DMX USB adapter, then uses OLA to deliver control values. The project makes the division of labor tangible: a computer, an adapter and a light, with software binding them together.[2]
The central process is olad, the OLA daemon. Client applications connect through a library; plugins handle particular device families or protocols. Plugins expose devices, and devices expose directional ports. A port can be a physical connection or a virtual endpoint associated with a network protocol. Both appear in the same routing model.[3]
Its meeting point is the universe, a set of 512 DMX channels. Patching assigns a port to a universe. An input supplies values; an output carries values away. Suppose an installation receives Art-Net and sends physical DMX through a compatible USB interface. Its network input and USB output must be patched to the intended universe. Finding both devices is only the discovery step; the patch establishes the connection between them.[3]
That separation is concrete in the implementation. The universe's UpdateDependants() function writes its buffer to each attached output port and sends updates to subscribed clients. One collection of lighting values can therefore feed several destinations. The individual output implementations handle the next transport step.[6]
OLA's diagnostic tools follow these boundaries. ola_dev_info lists devices and ports; ola_patch controls their bindings; ola_uni_info lists active universes. ola_dmxmonitor observes the values on a universe, while ola_dmxconsole sends them. Those are different observations: detecting an adapter, finding its patch and watching a changing channel each establish a different part of the route. My debugging order would follow that progression before changing the application that produces the cue.[4]
Even a value that reaches the fixture needs the right meaning. Damen's particular lamp assigns its first three channels to red, blue and green. Another fixture's channel assignments can differ. OLA's transport abstraction does not make that example a universal color recipe; the fixture's operating mode and channel mapping still determine what the arriving values do.[2]
Now add a second controller. OLA first considers source priority, with documented values from 0 to 200 and a default of 100. Lower-priority sources yield to active sources with higher priority. Only when multiple sources share the winning priority does the universe's merge mode decide how to combine or select their data. Some ports inherit priority from their protocol; others use a configured value.[5]
Consider two equal-priority sources and one channel. A console sends 0 for blackout; a second controller sends 180. In HTP, highest takes precedence, the channel remains at 180. That is the intended consequence of choosing the higher channel value. Sending zero from one source does not cancel another source's contribution.[6]
In LTP, latest takes precedence, the implementation instead selects the newest eligible source's buffer. This is a timing decision among sources at the winning priority. It is not a comparison of their artistic intentions, and the newest packet from a lower-priority source still cannot take control.[5][6]
The practical consequence is easy to miss during a successful first demonstration: two controllers can each work perfectly alone and behave unexpectedly together. A rehearsal should include that overlap. For an intensity channel, try sending a lower value from one controller while another continues sending a higher one. The visible result tests whether the chosen merge policy matches the operator's expectation.
Priority also gives a backup controller a defined place in the system. The merging documentation describes sources becoming inactive after a timeout; when a higher-priority source disappears, a lower-priority source can become eligible. It explicitly allows different timeout intervals for different ports. That supports testing a particular failover path, rather than assuming every transport changes over immediately or identically.[5]
The abstraction has other edges. OLA permits internal universe numbers beginning at zero, but its FAQ notes that the sACN plugin does not support universe 0 and recommends starting at 1. An identifier accepted by the daemon can therefore be unsuitable for an attached protocol. The FAQ also distinguishes USB adapters that generate DMX with an onboard processor from FTDI devices that depend on the host to generate it. A similar connector does not imply the same driver or timing responsibility.[7]
A working patch also has to survive the next startup. OLA's persistence guide identifies ola-universe.conf and ola-port.conf as the files holding universe settings and port bindings. It warns that patch files are written when olad exits, so a crash can lose recent changes. A controlled stop and restart is therefore part of proving a configuration. Seeing the lamp respond once proves less than seeing the intended route return after a restart.[8]
For a small venue or installation team, I would treat this as a system that needs a named operator who understands both software configuration and the physical lighting setup. Establish one known route, record the fixture mapping, then exercise competing sources and restarts before depending on it during a show. OLA makes the path inspectable at several points. The useful result is being able to explain why a particular value reached a particular light—and why another controller's value did not.
Sources
- Open Lighting Project, OLA repository README — distribution layer, client library, daemon, plugins and protocol conversion.
- Ryder Damen, “How to Control DMX Lights with Raspberry Pi,” Tom's Hardware (updated September 17, 2022) — independent practical demonstration, fixture mapping and photograph provenance.
- Open Lighting Project, “Using OLA” — devices, directional ports, universes, clients and patching.
- Open Lighting Project, “Command-Line Tools” — discovery, patching, universe inspection and DMX monitoring tools.
- Open Lighting Project, “OLA Merging Algorithms” — source priorities, equal-priority merge modes and source timeouts; read alongside the implementation in source 6.
- Open Lighting Project, Universe.cpp at commit 3f870a79b69e08a8553df360c82635113c192504 — UpdateDependants, HTPMergeSources and MergeAll; implementation inspected November 5, 2026.
- Open Lighting Project, “FAQ” — universe-zero restrictions and differences between USB adapter plugins.
- Open Lighting Project, “Patch Persistency” — configuration files, patch bindings and saving on daemon exit.