Art-Net publisher / subscriber node to expose a 10-universe GRBW LED strip fixture as four RGBW fixtures to be controlled in grandMA3.
This would not have been possible without the following Python libraries:
- pyartnet: for publishing Art-Net data
- python-artnet (and its example code): for subscribing / polling Art-Net data
Massive shoutout to the mainainers of these libraries.
- artnet_helper.py:
- RGBW helper class because GRBW is unintuitive
- Helper methods for assigning an RGBW color value to an arbitrary number of Art-Net universes simulatenously using asyncio
- ring_helper.py:
- Constants for the ring fixture
- ring_script.py:
- Set color values for the ring once
- ring_artnet_bridge.py:
- Continuously poll the first 16 channels of an Art-Net universe and set those values to the ring
Had an upcoming show with this ring fixture installed and no way to communicate with it. The long-term plan is to use pixel mapping software (Madrix) to control it, but we didn't have the time to configure it, and the LD wanted to be able to control the color (alongside every other fixture) with grandMA3, and we ran up against fixture count limitations when trying to communicate with it directly.
Am happy to report this script worked flawlessly for the show. The only issue was I used the world's worst patch cable and my laptop got disconnected from the switch briefly so the colors / animations froze, but once that was corrected, the ring immediately resumed responding to commands.
- Clone the repo
- Create a virtual environment and install the dependencies in
requirements.txt - Create a helper class for your fixture in the style of ring_helper.py. What you'll need is:
- IP address for the Art-Net node where it lives
List[int]of universes it uses
Note
Because I wrote this for a GRBW fixture, that's what all the assignment
commands in artnet_helper.py assume the desired output is. To change
this, make your own getter in the RGBW object in the style of
to_GRBW() and replace all the references to that method.
This is useful for identifying what universes are being used by a fixture, troubleshooting, or setting-and-forgetting something.
- Prepare ring_script.py:
- Import your IP address and universe list from your fixture helper class
- Replace
RING_CONTROLLER_IPwith the IP address imported in the previous step - Create an
RGBWobject of the color you want to use (or use one of the pre-defined ones) - Create a list of one or multiple
Fixtures with the colors you've made and universes you've imported - Update the call to
assign_fixtures()with the list ofFixtures made in the previous step
- Run ring_script.py in your activated terminal
For mapping multiple universes to a manageable set of fixtures.
- Prepare ring_artnet_bridge.py:
- Import your universe list from your fixture helper class
- Replace
artnetListenUniversewith the universe # you want to subscribe to / want your light software to publish to - Update the universes being used in the
Fixtures in the while loop with the ones from your import class - Update DMX mapping to taste
- Run ring_artnet_bridge.py in your activated terminal
Note
When I started writing this I didn't think the performance would be up to par for smooth animations, but I had no issues running the bridge seen/described here on an i7-8750H (6-core, 12 thread) Dell XPS from 2018 on Python 3.14.6. The refresh rate was extremely smooth and it looked like it was being controlled natively from grandMA3.
