A fake UDP "fixture" for testing lighting-control plugins for ETC's Echo (get it?) Integration Interface locally, with a FastAPI control layer for inspecting traffic.
docker run -p 9000:8000 -p 9703:4703/udp --name reverberate zklosko/reverberate
pip install -r requirements.txt
uvicorn main:app --reload --port 8000This starts two things in one process/event loop:
- A UDP listener on
0.0.0.0:4703(change the default inmain.py, or override at runtime viaPOST /config/port) - An HTTP control API on
http://localhost:8000— Swagger docs athttp://localhost:8000/docs- In addition, a live dashboard is available at
http://localhost:8000/dashboard
- In addition, a live dashboard is available at
Point your plugin at 127.0.0.1:4703 instead of the real controller.
| Method | Path | Purpose |
|---|---|---|
| GET | /state |
Current fixture/channel state snapshot |
| GET | /log?n=50 |
Recent packet log (rx + tx, with parsed data) |
| GET/POST | /config/port |
Read or change the UDP listen port at runtime |
Example — change the UDP port at runtime:
curl -X POST http://localhost:8000/config/port -H "Content-Type: application/json" -d '{"port": 7000}'- The packet log keeps the last 500 entries (both directions) in memory;
bump
maxleninFixtureState.logif you want more history. - Since UDP is connectionless, "port can be changed by the user" is
handled by tearing down and recreating the
asynciodatagram endpoint via/config/port— no server restart needed.