Skip to content

Releases: fiverecords/DMXRouter

DMXRouter 1.7.2

26 Mar 22:20
78a12e9

Choose a tag to compare

DMXRouter v1.7.2 — Release Notes

sACN Multicast Limit (Linux)

DMXRouter now automatically raises the kernel IGMP multicast group limit on Linux when needed. sACN uses one multicast group per universe — the default Linux limit of 20 is too low for professional setups with many universes. On startup, DMXRouter detects the current limit and raises it to 1024 if necessary, requesting elevation via pkexec when not running as root. No manual sysctl commands needed.

Fixture Database — Serial Number & Notes

The Fixture Database now includes editable Serial and Notes columns. Double-click a cell to type a serial number or free-text note for any fixture. Values are saved automatically and persist across sessions. Both fields are included in CSV exports (manual and auto-mirror) for integration with inventory management systems and spreadsheets.

Useful when the printed serial number on a fixture doesn't match the RDM UID — some manufacturers use a separate internal counter for the UID instead of the serial.

Bug Fixes

  • Fixed the Manufacturer PIDs tab not updating when switching between devices on the same gateway. Previously fetched values from one fixture would remain visible when selecting another fixture with the same manufacturer PIDs. Values are now cached per device and restored correctly when switching.
  • Fixed the Manufacturer PIDs tab losing all previously fetched values when switching to a device on a different gateway. Values are now stored in the device cache and persist across tab rebuilds — no need to repeat GET requests for a device you already queried.
  • Fixed the RDM device tree selection highlight showing mixed colors when focus moves to the inspector tabs. The branch area (left edge of the row) remained blue while the rest of the row turned grey. Both areas now use a consistent grey highlight when the tree loses focus.
  • Fixed clicking on empty space in the RDM device tree not clearing the selection. The inspector tabs continued showing the last selected device even though no device appeared selected in the tree. Clicking on empty space now properly deselects and clears the inspector.
  • Widened the UID, MAC Address, and CID columns in the LLRP target table. The UID column no longer truncates when the identify icon is shown.
  • Improved the LLRP Device Configuration layout — info fields now use a compact grid, the personality table fills available vertical space instead of being capped at a fixed height, and the log panel has more room.
  • Centered the RDM toolbar buttons (RDM ON/OFF, Discover, Force, Identify Off, Remove Lost) instead of pushing them to the right edge.
  • Widened the Access and Type columns in the Manufacturer PIDs table to prevent truncation.
  • Widened the Time and PID columns in the RDM Transaction Log. PID now uses stretch mode to accommodate long names.
  • Widened the Last Seen column in the Fixture Database table to fit the full timestamp.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included. UAC will prompt for administrator privileges automatically if your account has them — this enables VLAN management without needing to right-click "Run as administrator".

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.7.2-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.7.2-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6 libqt6websockets6 libqt6openglwidgets6

# Fedora
sudo dnf install qt6-qtbase qt6-qtwebsockets

# Arch
sudo pacman -S qt6-base qt6-websockets

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later.

First launch: macOS quarantines apps downloaded from the internet. Double-click install.command (shipped alongside the app) to remove the quarantine and sign it locally — you only need to do this once. Alternatively, run manually in Terminal:

xattr -cr DMXRouter.app
codesign --force --deep --sign - DMXRouter.app

Important: Disable the macOS Application Layer Firewall for reliable real-time DMX operation (System Settings → Network → Firewall → OFF). If you need firewall protection, use PF (pfctl) instead — see the v1.5.6 release notes for details and example rules.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.7.1

25 Mar 22:07
0afed58

Choose a tag to compare

Software Version Column

A new Software column in the RDM device tree shows each fixture's software version label at a glance. Hidden by default — right-click the tree header to enable it. Useful for spotting firmware mismatches across a fleet without selecting each device individually.

Manufacturer PIDs Tab

A dedicated Mfr PIDs tab in the RDM inspector lists all manufacturer-specific PIDs (0x8000–0xFFDF) reported by the device's SUPPORTED_PARAMETERS response. PARAMETER_DESCRIPTION is automatically queried for each manufacturer PID when selecting a device — when supported, the table shows human-readable names, access types (GET/SET), data types, and valid ranges. Use the GET button to read a PID, SET to write it with hex data, or GET All to read every readable manufacturer PID at once. Values are automatically displayed as ASCII text when printable, as decimal numbers for short numeric values, or as hex for binary data.

Flat View

A new Flat View toggle in the tree toolbar shows all fixtures as a flat list without the gateway/port hierarchy. This allows global sorting by any column — click on Name, DMX, FID, Manufacturer, Model, or Software to sort all fixtures across all nodes at once. Essential for large installations where you need to find all fixtures of a specific model, or sort the entire fleet by lamp hours or firmware version.

Expand All / Collapse All

Two new buttons above the RDM device tree let you expand or collapse all nodes with one click. Essential when working with large installations where scrolling through 50+ gateways and ports becomes impractical.

Improved DMX Conflict Details

DMX address overlap warnings now show exactly which fixtures conflict and their channel ranges in the tooltip. Instead of the generic "DMX address overlap with another device on this port", you now see: "⚠ Overlaps with: Fixture A (1–12), Fixture B (5–16)".

Bug Fixes

  • The RDM device tree Name column no longer uses stretch mode. All columns are now individually resizable with a horizontal scrollbar appearing when the total width exceeds the panel. Previously, the stretch mode prevented the scrollbar from appearing when many columns were enabled.
  • Gateway node names in the RDM tree no longer include the IP address in parentheses. The IP is already shown in the UID column, allowing independent sorting by name or by IP.
  • The RDM device tree no longer forces DMX address sort order every refresh cycle. Clicking a column header now sorts devices by that column persistently, both within ports (hierarchical view) and globally (flat view).
  • The selected device in the RDM tree now remains visually highlighted even when focus moves to the inspector tabs. Previously the selection became invisible when clicking on a tab, making it unclear which device was selected.
  • Fixed the Manufacturer PIDs tab showing an empty list. The tab was sourcing PIDs from PARAMETER_DESCRIPTION responses only; devices that list manufacturer PIDs in SUPPORTED_PARAMETERS without supporting PARAMETER_DESCRIPTION had no entries. Now uses SUPPORTED_PARAMETERS as the source and enriches with description metadata where available.
  • Fixed the Manufacturer PIDs GET, SET, and GET All buttons silently failing. The PID text format "0x8000" was parsed with base 16 which does not accept the "0x" prefix. Now uses the stored integer value directly.
  • Fixed the PID Browser GET and SET buttons failing for PIDs entered with "0x" prefix in the hex field. Changed from base-16 parsing to auto-detect (base 0) which accepts both "8000" and "0x8000".
  • Widened narrow tree columns (DMX, FID, Status, Last Seen) and set a minimum column width of 40px to prevent the sort arrow from overlapping column text.
  • Fixed the RDM device tree sorting columns like DMX address and Fixture ID alphabetically instead of numerically (e.g. "113–128" appeared before "1–16"). Numeric columns now sort by their actual values.
  • Fixed RDM ACK_TIMER responses causing infinite retry loops with certain fixtures. Retries are now capped at 5 attempts per transaction.
  • Fixed RDM QUEUED_MESSAGE drain running indefinitely on devices that always report messageCount > 0. A 30-second cooldown prevents continuous retry after finding an empty queue.
  • Fixed RDM status messages not being read from devices that use the direct-read model (GET STATUS_MESSAGES) rather than the queued notification model.
  • Fixed the RDM Status tab description text being cleared every 300ms by the periodic refresh.
  • Status tree indicators now show green checkmark when only advisory messages are present. Only warnings and errors display the warning icon.
  • Fixed DEVICE_UNIT_NUMBER (Fixture ID) using 2-byte format which caused errors on fixtures that implement the 4-byte variant. GET now accepts both formats; SET sends 4 bytes.
  • Fixture ID now populates automatically during RDM discovery instead of requiring a manual fetch. A single GET DEVICE_UNIT_NUMBER is sent after the basic probe completes for each device.
  • PARAMETER_DESCRIPTION is now requested automatically during extended info fetch for all manufacturer-specific PIDs, instead of requiring a manual "Fetch Advanced" click. This populates the Mfr PIDs tab with human-readable names as soon as a device is selected.
  • Manufacturer PIDs values are now displayed as readable text: ASCII strings when all bytes are printable, decimal numbers with hex reference for short numeric values, or hex dump for binary data.
  • RDM queued change notifications for non-status PIDs are now detected and the affected PID is automatically re-fetched.
  • Fixed sensor values displaying raw integer values instead of applying the SI prefix from the sensor definition. Values now show correct decimal places (e.g. 4.5 V instead of 45, 30.0 °C instead of 300).
  • Widened the Sensor Unit column to prevent truncation of values like "A DC" and "Centigrade".
  • Suppressed expected NACK log entries for SELF_TEST_DESCRIPTION, STATUS_ID_DESCRIPTION, and PARAMETER_DESCRIPTION during iterative discovery.
  • Rearranged the Remote Control panel layout — Value Reference and Action Log are now side by side.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included. UAC will prompt for administrator privileges automatically if your account has them — this enables VLAN management without needing to right-click "Run as administrator".

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.7.1-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.7.1-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6 libqt6websockets6 libqt6openglwidgets6

# Fedora
sudo dnf install qt6-qtbase qt6-qtwebsockets

# Arch
sudo pacman -S qt6-base qt6-websockets

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later.

First launch: macOS quarantines apps downloaded from the internet. Double-click install.command (shipped alongside the app) to remove the quarantine and sign it locally — you only need to do this once. Alternatively, run manually in Terminal:

xattr -cr DMXRouter.app
codesign --force --deep --sign - DMXRouter.app

Important: Disable the macOS Application Layer Firewall for reliable real-time DMX operation (System Settings → Network → Firewall → OFF). If you need firewall protection, use PF (pfctl) instead — see the v1.5.6 release notes for details and example rules.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.7.0

24 Mar 23:37
1df6c8c

Choose a tag to compare

Profile Preview

The Profile Manager now shows a detailed preview of the selected profile before loading. The preview panel displays the number of process engines, shows, cues, and VLANs, along with a compact list of each engine's mode, inputs, and outputs.

Preserve IP on Profile Load

When recalling a profile, a new Preserve current IP / VLAN settings checkbox (enabled by default) lets you keep your current network configuration. Uncheck it to load the VLAN settings stored in the profile — useful when moving profiles between machines.

Show Import / Export

Individual shows can now be exported to and imported from standalone JSON files. Use the ⤒ (export) and ⤓ (import) buttons next to the show selector. Exported shows can be shared between DMXRouter installations or used as backups independently of the full profile.

Engine Templates

A new Templates button next to Add in the process engine toolbar offers pre-configured engine setups: 8×/16× Forward sACN, 8×/16× Forward Art-Net, HTP Merge, LTP Merge, Backup Pair, X-Fade, and Switch. Templates automatically assign the next available universe numbers based on existing engines. Merge templates (HTP, LTP, Backup, X-Fade, Switch) assign distinct universes per input and place the output on the next available universe. Use this instead of creating engines one by one during initial setup.

Quick Universe Adjust

New Uni − / Uni + buttons (aligned right) in the process engine toolbar decrement or increment the input and output universe of the selected engine(s) by one. Only available for Forward mode engines — merge modes (HTP, LTP, Backup, etc.) are skipped to avoid breaking multi-input configurations. Works with multi-selection for fast bulk adjustments during setup.

RDM Self-Test (E1.20 §10.7)

Full self-test workflow support in the Status tab. DMXRouter discovers available self-tests on a device via SELF_TEST_DESCRIPTION, presents them in a dropdown, and lets you trigger any test with a single click via PERFORM_SELFTEST. A background poll detects when the test completes and directs the user to the status messages table for results — which are populated automatically by the existing messageCount auto-drain.

RDM Batch Operations

Select multiple devices in the RDM tree (Ctrl+click or Shift+click) and right-click for batch operations: Identify All On/Off, Set Personality (same mode on all selected), Set Sequential Addresses (auto-increments by each fixture's DMX footprint), and Fetch Info for all selected devices at once. Useful for touring setups where you need to repatch or remode an entire rig quickly.

Sensor Progress Bars

The Sensors tab now shows graphical progress bars for sensor values when the fixture reports a valid range (rangeMin/rangeMax). Bars are color-coded: green when the value is within the fixture's declared normal range, orange when outside. Plain numeric values are shown as fallback when no range is defined.

RDM Device Tree — Customizable Columns

Right-click the device tree header to show/hide columns and drag to reorder. Manufacturer and Model columns are now available (hidden by default). Column visibility, order, and widths persist across sessions. Use Reset to Defaults at the bottom of the context menu to restore the factory layout.

WiFi Interface Support

A new Show WiFi checkbox in the Network Interfaces panel makes wireless adapters visible for preprogramming scenarios where no Ethernet connection is available. WiFi interfaces appear tagged with [WiFi] in the interface list. Hidden by default to avoid confusion in live show environments. The setting persists across sessions.

Remote Control — Template Actions

Four new DMX remote control actions on the Main Channel: Auto-Apply Templates On (80–87), Auto-Apply Templates Off (88–95), Apply DMX Address On (96–103), and Apply DMX Address Off (104–111). The corresponding checkboxes in the RDM Templates tab update in real time when toggled via remote control.

Windows — Automatic Administrator Elevation

DMXRouter now includes a Windows application manifest with highestAvailable execution level. If the Windows user account has administrator privileges, UAC prompts automatically on launch — no need to manually right-click "Run as administrator" for VLAN management.

Bug Fixes

  • Fixed keyboard arrow navigation in the RDM device tree not updating the right-side inspector tabs. Only mouse clicks were selecting devices; keyboard navigation now works identically.
  • Added Delete key support in the RDM Templates tab to remove the selected template (with confirmation dialog).
  • Fixed the RDM Self-Test "Fetch Tests" button not sending any requests to the device.
  • Fixed RDM template apply sending incorrect parameter sizes for E1.37-1 dimmer PIDs (Curve, Output Response Time, Modulation Frequency, Maximum Level). Strict fixtures would NACK with FORMAT_ERROR.
  • Fixed engine templates for merge modes (HTP, LTP, Backup, X-Fade, Switch) creating both inputs on the same universe, making the merge non-functional.
  • Fixed a race condition in the RDM extended fetch pacer that could create duplicate worker threads under rapid start/stop cycles.
  • Fixed a potential path traversal vulnerability in the web server when an external web root directory is configured.
  • Fixed Windows administrator detection always reporting elevated privileges regardless of actual state. VLAN controls are now correctly disabled when not running as administrator.
  • Fixed inspector tab tables (Personalities, Slots, Sensors, PID Browser, Status Messages) losing the selected row and scroll position on every periodic refresh.
  • Fixed the self-test combo losing the selected test on every periodic refresh.
  • Fixed the Undo button and Seq Loop dropdown overflowing outside the cue list panel on narrow windows.
  • Improved the RDM Config tab layout — device controls now use a compact two-column grid, freeing more vertical space for the personality table.
  • Fixed LLRP discovered devices disappearing and reappearing every 30 seconds. Periodic keepalive probes were including the known UID suppression list, causing compliant responders to not reply.
  • Fixed LLRP multicast packets missing TTL=1 (link-local). Without this, some consumer routers attempted to route the multicast traffic beyond the local segment, causing internet disruption for the entire network.
  • Removed the LLRP "All Interfaces" option. The interface selector now requires choosing a specific network adapter before starting LLRP discovery, preventing accidental multicast traffic on unintended interfaces. Non-Ethernet adapters (WiFi, VPN, tunnels) are filtered from the list.
  • Fixed LLRP Identify and Get Info buttons briefly enabling then disabling when selecting a target.
  • LLRP target table now highlights devices in identify mode with the identify icon and amber text, matching the RDM device tree visual style.
  • LLRP now queries SUPPORTED_PARAMETERS on first target select and only requests PIDs the device actually supports. Controls for unsupported features (DMX address, personality) are automatically disabled. Avoids unnecessary NACK responses in the log.
  • LLRP now auto-fetches device info and network configuration when selecting a target — no need to click "Read" manually. Network fields (Static IP, Mask, Gateway) are pre-filled from the device's current configuration, and the DHCP checkbox visually disables the static fields when DHCP is active.
  • LLRP network config fields now show a clear visual distinction when disabled (dimmed background and text).
  • LLRP network config re-reads the device IP twice after applying changes (at 1s and 4s) to catch DHCP lease assignments that take a few seconds.
  • Removed the LLRP "Send Probe" button — redundant with the automatic periodic probe every 2 seconds.
  • Expanded the PID Browser table to use all available vertical space instead of a fixed 150px height.
  • Fixed RDM ACK_TIMER responses causing infinite retry loops with certain fixtures. Retries are now capped at 5 attempts per transaction, after which the operation fails cleanly instead of blocking the RDM queue.
  • Fixed RDM QUEUED_MESSAGE drain running indefinitely on devices that always report messageCount > 0 but use the direct-read STATUS_MESSAGES model instead of the QUEUED_MESSAGE queue. A 30-second cooldown now prevents continuous retry after finding an empty queue.
  • Fixed RDM status messages not being read from devices that use the direct-read model (GET STATUS_MESSAGES) rather than the queued notification model. Both approaches are now supported automatically.
  • Fixed the RDM Status tab description text being cleared every 300ms by the periodic refresh, making it impossible to read STATUS_ID_DESCRIPTION results.
  • Status tree indicators now show green ✔ (healthy) when only advisory messages are present. Only warnings and errors display the ⚠ icon — advisory messages are informational and represent normal device state.
  • Fixed DEVICE_UNIT_NUMBER (Fixture ID, E1.37-5) using 2-byte format which caused FORMAT_ERROR on fixtures that implement the 4-byte variant. GET now accepts both 2-byte and 4-byte responses; SET sends 4 bytes for compatibility.
  • Fixture ID (FID column) now populates automatically during RDM discovery instead of requiring a manual "Fetch Advanced" click.
  • RDM queued change notifications for non-status PIDs (e.g. DEVICE_UNIT_NUMBER after SET) are now detected and the affected PID is automatically re-fetched to update the device cache.
  • Fixed sensor values displaying raw integer values instead of applying the SI prefix from the sensor definition. Values now show correct decimal places (e.g. 4.5 V instead of 45, 30.0 °C instead of 300).
  • Widened the Sensor Unit column to prevent truncation of values like "A DC" and "Centigrade".
  • Suppressed expected NACK log entries for SELF_TEST_DESCRIPTION and STATUS_I...
Read more

DMXRouter 1.6.1

21 Mar 20:34
1df6c8c

Choose a tag to compare

DMXRouter v1.6.1 — Release Notes

Show Mode

New Show Mode — a live-show protection lock that prevents accidental changes to the running configuration during a performance. When activated, destructive operations are blocked across the desktop GUI, the web interface, and the REST API.

Blocked (Destructive): Engine create / edit / delete, profile load / rename / delete / duplicate, VLAN create / delete, interface enable / disable, patch editing, config load / import.

Blocked (Caution): Engine enable / disable, RDM SET operations (address, personality, label), force discovery, RDM enable / disable, blackout / release.

Always allowed: Playback (GO, stop, pause, next, prev, record, autopilot, snapshot), DMX monitoring, RDM identify, stats, log, fixture database, node discovery list.

Activate Show Mode from the toolbar button (desktop) or the SHOW MODE button next to BLACKOUT (web). A red status bar badge and a red banner across the web interface confirm the lock is active. Show Mode always starts deactivated on launch.

The REST API exposes GET /api/showmode, POST /api/showmode/activate and POST /api/showmode/deactivate. State is included in GET /api/status and broadcast via the engines WebSocket channel. Blocked API calls return HTTP 403.

Web Remote Control

Improved mobile layout for the playback transport buttons. On narrow screens the first row (Prev, GoBack, Stop, Next) now shows icon-only buttons to prevent overflow. Full labels remain visible on desktop.

The web interface now receives network interface changes (cable connect/disconnect, adapter state) in real time via WebSocket, without requiring a manual refresh.

Network Interfaces

Improved filtering of non-Ethernet adapters on macOS. Low-level kernel interfaces (USB Host Controller, AWDL access point, Apple Neural Processing, bridge, tunnel, packet tap, and others) are now excluded from the interface list.

Data Safety

RDM templates, RDM emulator profiles, and user profiles now use atomic file writes. If DMXRouter is interrupted during a save (power loss, crash, forced kill), the previous version of the file is preserved intact.

Bug Fixes

  • Fixed the process engine editor hanging for several seconds (and potentially crashing) on macOS when opening or switching modes.
  • Fixed a race condition where reconfiguring network interfaces while multicast joins were in progress could cause missed sACN universes.
  • Fixed the application closing and losing unsaved work when save-on-exit fails (e.g. writing to a folder without permissions) or when the user cancels the save dialog.
  • Fixed transport buttons in the web interface overflowing horizontally on mobile devices.
  • Fixed macOS showing internal system interfaces in the interface list.
  • Fixed a potential path traversal vulnerability in the web server.
  • Fixed a potential crash when the WebSocket watchdog removes a stale connection.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included.

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.6.1-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.6.1-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6 libqt6websockets6 libqt6openglwidgets6

# Fedora
sudo dnf install qt6-qtbase qt6-qtwebsockets

# Arch
sudo pacman -S qt6-base qt6-websockets

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later.

First launch: macOS quarantines apps downloaded from the internet. Double-click install.command (shipped alongside the app) to remove the quarantine and sign it locally — you only need to do this once. Alternatively, run manually in Terminal:

xattr -cr DMXRouter.app
codesign --force --deep --sign - DMXRouter.app

Important: Disable the macOS Application Layer Firewall for reliable real-time DMX operation (System Settings → Network → Firewall → OFF). If you need firewall protection, use PF (pfctl) instead — see the v1.5.6 release notes for details and example rules.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.6

20 Mar 22:02
8161244

Choose a tag to compare

DMXRouter v1.6.0 — Release Notes

Web Remote Control

DMXRouter now includes an embedded HTTP + WebSocket server with a built-in web interface that exposes the full application state and control surface over the network. Any device on the same network — phone, tablet, laptop, or automation system — can query status, control playback, manage process engines, trigger RDM operations, and receive real-time updates, all without touching the DMXRouter machine.

The server starts automatically on launch and listens on port 9090 (HTTP) and port 9091 (WebSocket) by default. The bind address is configurable — you can restrict the API to a specific network interface to keep DMX production networks clean. No external dependencies, no cloud services — it runs directly on Qt's event loop with zero impact on DMX performance.

Point any browser at http://<dmxrouter-ip>:9090 to open the web interface. The API is also directly usable from curl, Postman, Bitfocus Companion, custom scripts, or any HTTP client.

Web Interface

The built-in web interface is a responsive single-page application embedded in the binary (served from Qt resources — no external files needed). It uses the same dark professional theme as the desktop application. On desktop (≥768px) a sidebar provides direct navigation; on mobile a bottom tab bar with a "More" sub-menu is used.

Playback — Show management (create, rename, delete), cue list with inline editing (name, fade time, hold time, fade curve), cue reorder and cross-show copy, record cue with fade time. Full transport: ⏮️ Prev, ◀️ GoBack, ⏹️ Stop, Next ⏭️, GO, ▶️ Play / ⏸️ Pause (toggle), ◉ Take Snapshot, ⏺️ Rec, ✈️ Autopilot. Preset cue highlighted in orange, active cue in blue. Playback state shown inline per cue (▶️ Playing / ⏸️ Paused / FADING). Live progress bars for both crossfades (blue) and sequence playback (purple, with frame counter). Sequence cues show type badge, duration, and loop mode. Desktop: 2-column grid (transport | cues).

Engines — Process engine list with enable/disable toggles and expandable detail view (inputs, outputs, protocols, interfaces), snapshot and failsafe buttons, channel patch viewer with add/reset editing, global BLACKOUT/RELEASE button. 512-channel DMX output grid with color-coded intensity visualization and fullscreen mode. Desktop: 2-column grid (engines+patch | DMX grid).

RDM Devices — Enable/disable RDM toggle, force discovery, device list grouped by gateway with model, UID, DMX address range (start–end), personality, Fixture ID, probe progress, status indicators, and last seen time. DMX address conflicts are detected automatically and highlighted in red with a ⚠ warning — same overlap algorithm as the desktop. Inline SET forms for DMX address, personality, and device label. Identify button with visual state.

Stats & Log — Live PPS in/out, active universe count, error count (updated via WebSocket). Per-interface breakdown (Art-Net/sACN packets, PPS, errors per NIC). Scrollable log with color-coded severity levels. Desktop: stats in 4 columns.

More — Sub-menu (mobile) / sidebar links (desktop): Profiles (save, load, rename, duplicate, delete), Interfaces (enable/disable, no-link adapters shown dimmed) and VLANs (platform status, list, create, delete) in a single combined view, Nodes (discovery list), System (version, platform, Qt version, uptime, counters).

Features:

  • Responsive layout — sidebar navigation on desktop, bottom tabs on mobile. 2-column grids on wide screens, single column on narrow. Hover states on desktop.
  • Bidirectional sync — changes from the desktop GUI (engine toggle, show edits, RDM discovery, blackout, autopilot) are pushed to the web in real time via WebSocket. Changes from the web are pushed to the desktop via Qt signals.
  • PIN authentication — if the server has a PIN configured, the web UI shows a login overlay. PIN is saved in the browser for convenience.
  • WebSocket auto-reconnect (3s) with connection indicator in header (mobile) and sidebar (desktop).
  • PWA support — web app manifest and Apple touch icon. Add to home screen for a native app experience.
  • Zero external dependencies — vanilla HTML/CSS/JS, no build step, no CDN. Embedded in the binary.

Status Bar

The status bar shows a permanent Web API indicator at the right edge, next to the packet counter. It displays the HTTP port when the server is running (green) and the number of connected WebSocket clients when any are present (blue). When the server is stopped, it shows "API off" (dimmed).

REST API & WebSocket

The server exposes a full REST API covering system status, process engines, show cue playback (including all transport controls), RDM device management, profiles, network interfaces, VLANs, and nodes. Real-time updates are delivered over WebSocket on 6 channels (playback, stats, RDM, engines, log, interfaces). Optional PIN authentication protects both HTTP and WebSocket access. CORS headers are included for browser compatibility.

GET /api returns a self-describing JSON index of all endpoints and channels — point a browser or Postman at http://<ip>:9090/api to explore.

Configuration

Open Network → Web API... to configure the server: enable/disable, bind address, HTTP port, and PIN. Changes take effect immediately. Settings persist across sessions.


Network Interfaces

Disconnected adapters (no link) are now shown dimmed in the interface list instead of being hidden. The Enable checkbox remains active so you can pre-configure an interface before connecting the cable — it activates automatically when link is detected.

Improved filtering of non-Ethernet adapters on Windows: VPN, tunnel, TAP, and Bluetooth adapters are now identified by their hardware description (via GetAdaptersAddresses) even when the connection name is generic. Covers TAP-Windows, OpenVPN, WireGuard, Fortinet, Cisco AnyConnect, Palo Alto GlobalProtect, Tailscale, ZeroTier, Teredo, ISATAP, and Bluetooth PAN.

Fixture Database

The Fixture Database tab now includes a Recording toggle that lets you pause and resume database writes. When paused, RDM discovery and device probing continue normally but no fixture records or hour snapshots are written to disk. Existing data is preserved. The setting persists across sessions.

Channel Oscilloscope

Smoother waveform rendering: the oscilloscope now uses QOpenGLWidget with vsync-driven refresh at 60 fps, and all waveform coordinates use floating-point precision for sub-pixel positioning. The scrolling time axis no longer stutters between data samples.

Bug Fixes

  • Fixed a GUI freeze when fetching extended device info (Fetch Hours / Fetch Extended) with the fixture database active.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included.

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.6.0-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.6.0-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required (note the additional libqt6websockets6 and libqt6openglwidgets6 packages):

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6 libqt6websockets6 libqt6openglwidgets6

# Fedora
sudo dnf install qt6-qtbase qt6-qtwebsockets

# Arch
sudo pacman -S qt6-base qt6-websockets

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled, including WebSockets and OpenGL). Requires macOS 13.0 (Ventura) or later.

First launch: macOS quarantines apps downloaded from the internet. Double-click install.command (shipped alongside the app) to remove the quarantine and sign it locally — you only need to do this once. Alternatively, run manually in Terminal:

xattr -cr DMXRouter.app
codesign --force --deep --sign - DMXRouter.app

Important: Disable the macOS Application Layer Firewall for reliable real-time DMX operation (System Settings → Network → Firewall → OFF). If you need firewall protection, use PF (pfctl) instead — see the v1.5.6 release notes for details and example rules.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.5.6

17 Mar 23:47
13f09c0

Choose a tag to compare

🍎 macOS Installation Note
If you see a message stating that "DMXRouter is damaged and can’t be opened", this is a security restriction from macOS Gatekeeper on non-notarized apps. To fix this, move the app to your /Applications folder and run these two commands in your Terminal:

  • Remove the quarantine flag:
    sudo xattr -rd com.apple.quarantine /Applications/DMXRouter.app
  • Re-sign the app locally:
    sudo codesign --force --deep --sign - /Applications/DMXRouter.app

Note: These steps are required because DMXRouter now uses the native SystemConfiguration framework to manage IPs and VLANs. macOS requires a local signature to grant the app permission to interact with these system-level network APIs.

macOS — Native Network Stack

All network management on macOS has been migrated from command-line tools (networksetup) to Apple's native SystemConfiguration framework — the same API used by System Settings → Network

Interface names throughout the application (Interfaces tab, engine dropdowns, Show Cue selectors, VLAN Manager) now resolve correctly for all interface types — physical adapters, VLANs, bridges, and bonds. The "Physical NIC" dropdown in the VLAN Manager shows friendly names like Thunderbolt Ethernet (en4) instead of raw device names.

Set IP and Set DHCP on VLAN interfaces now work reliably. The previous shell-based approach failed silently on VLANs because macOS could not resolve the service name. The new implementation writes directly to the system network preferences via SCPreferencesCreateWithAuthorization, the same mechanism used by System Settings. Write operations (Set IP, Set DHCP) still prompt for your administrator password; read operations (checking DHCP state) require no elevation.

Interface type detection now uses SCNetworkInterfaceGetInterfaceType() to filter WiFi, Bluetooth, modem, and mobile data adapters. This replaces QNetworkInterface::type(), which incorrectly reports AirPort adapters as Ethernet on some macOS versions.

Windows and Linux are unaffected by these changes — they continue using their existing PowerShell / nmcli paths.

macOS — Performance

App Nap prevention. DMXRouter now holds a runtime activity token (NSActivityLatencyCritical) that prevents macOS from throttling timers and network I/O when the window is in the background or occluded. The NSAppSleepDisabled Info.plist key was already present but can be overridden by the system; the runtime token is the authoritative mechanism used by professional audio and lighting applications. The display is still allowed to sleep when idle. You can verify the protection in Activity Monitor → App Nap column: DMXRouter should always show "No".

Ad-hoc code signing. The macOS build now includes automatic ad-hoc code signing as a post-build step, giving the app a stable identity so the firewall only prompts once on first launch instead of on every run.

Firewall warning. When the macOS Application Layer Firewall (ALF) is enabled, DMXRouter now shows a warning at startup recommending to disable it. This is a known macOS limitation that affects all high-packet-rate UDP applications — lighting control, professional audio, amateur radio, and network capture tools like Wireshark all suffer from it. Even with an app explicitly allowed as an exception (and even with a full Apple Developer ID signature), the kernel-level socket filter (com.apple.nke.applicationfirewall) inspects every incoming UDP packet, adding latency and CPU overhead that is incompatible with real-time DMX control at 44 packets/second per universe.

There is no workaround within the ALF — neither ad-hoc signing, Developer ID signing, nor firewall exception rules eliminate the per-packet inspection overhead. Two options are available:

Option 1 — Disable ALF (recommended for dedicated lighting machines on isolated production networks):

System Settings → Network → Firewall → switch OFF.

Option 2 — Replace ALF with PF (for machines on shared or internet-connected networks that need firewall protection):

Disable ALF as above, then enable macOS's built-in Packet Filter (pfctl), which operates at network level (like iptables/nftables on Linux) without per-socket overhead. Example PF rules for a lighting machine:

# /etc/pf.conf — allow Art-Net and sACN, block everything else inbound
pass in proto udp from any to any port {6454, 5568}
pass in proto udp from any to any port 5569:5668
block in all

Enable with: sudo pfctl -e -f /etc/pf.conf

PF provides proper firewall protection without the performance penalty of ALF's application-layer socket filter.

The startup warning can be dismissed permanently.

Network Interface Hotplug Detection

DMXRouter now detects network changes in real time on all three platforms. Plugging in a USB-Ethernet adapter, disconnecting a cable, changing an IP from the OS network settings, or creating a VLAN from an external tool will automatically update the interface list — no need to click Refresh.

Each platform uses its native push-notification mechanism:

  • Linux — netlink socket subscribed to link and IPv4 address events, integrated into Qt's event loop.
  • macOSSCDynamicStore monitoring all network interface and IPv4 state changes.
  • WindowsNotifyAddrChange on a dedicated worker thread with clean shutdown support.

Events arrive in bursts (link down → IP removed → link up → DHCP assigned), so a 500ms debounce timer collapses them into a single interface refresh.

RDM Emulator

Device Hours and Power Cycles are now editable in the detail panel and in the Create/Edit Profile dialog.

Extended PID support. The emulator now responds to GET and SET for all standard RDM configuration parameters, allowing you to test template apply workflows end-to-end against emulated devices:

  • DisplayDISPLAY_INVERT (0x0500), DISPLAY_LEVEL (0x0501)
  • LampLAMP_STATE (0x0403), LAMP_ON_MODE (0x0404)
  • Pan/TiltPAN_INVERT (0x0600), TILT_INVERT (0x0601), PAN_TILT_SWAP (0x0602)
  • PowerPOWER_STATE (0x1010)
  • Dimmer (E1.37-1)CURVE (0x0343), OUTPUT_RESPONSE_TIME (0x0345), MODULATION_FREQUENCY (0x0347), MINIMUM_LEVEL (0x0341), MAXIMUM_LEVEL (0x0342)
  • DMX behaviorDMX_FAIL_MODE (0x0141), DMX_STARTUP_MODE (0x0142)

All PIDs are advertised in SUPPORTED_PARAMETERS, persisted to JSON, and initialized with sensible defaults (e.g., 4 dimmer curves, 3 response time settings, 3 modulation frequencies). SET operations validate range and return NR_DATA_OUT_OF_RANGE for invalid values.

RDM Templates — Extended Settings

The template system now supports all standard RDM SET parameters. Clicking the "N params ▸" button in the Settings column opens a dialog with grouped controls:

  • Display — Display Invert (Off / On / Auto), Display Level (0–255)
  • Lamp — Lamp On Mode (Off / DMX / On / After-Cal), Lamp State (Off / On / Strike / Standby)
  • Pan / Tilt — Pan Invert, Tilt Invert, Pan/Tilt Swap
  • Power — Power State (Full On / Shutdown / Standby / Normal)
  • Dimmer (E1.37-1) — Curve index, Output Response Time index, Modulation Frequency index, Minimum Level, Maximum Level. When a matching device has been discovered, the spin boxes show the device's supported range and current value in the tooltip. Minimum Level prevents LED flicker at low intensities; Maximum Level caps output for audience safety or power control.
  • DMX Behavior (E1.37-1) — DMX Fail Mode (Hold Last Look / Full Off), DMX Startup Mode (Hold Last Look / Full Off). Controls what the fixture does when it loses DMX signal and what it does on power-up before DMX arrives — critical for safety in permanent installations.

All settings use the standard "— (not set)" convention — only parameters you explicitly configure are sent to the device. Templates are applied via the existing "Apply to Selected" button or automatically on discovery when auto-apply is enabled.

RDM Alert Identify

A new "Identify fixtures on alert" toggle in the Templates tab enables automatic RDM Identify for fixtures that have a problem. When enabled, DMXRouter sends IDENTIFY_DEVICE ON to any fixture that meets either of these conditions:

  • Firmware mismatch — the fixture's software version doesn't match the version stored in its template
  • Lamp hours exceeded — the fixture's lamp hours exceed the limit defined in its template

The fixture flashes on the rig, letting the technician spot it without looking at the screen. This is especially useful during pre-show checks in large rigs where visually scanning for problems on a monitor isn't practical.

When a template has a lamp hours limit configured, DMXRouter now automatically fetches hours PIDs (Device Hours, Lamp Hours, Lamp Strikes, Power Cycles) immediately after the basic probe completes. Previously, lamp hours were only available after a manual extended fetch (double-click or button), which meant the alert system was effectively inactive unless the user intervened. The auto-fetch adds only 4 lightweight RDM requests (~200ms of bus time) per fixture — not the full extended fetch which includes personalities, slots, and sensors.

Identify is sent once per device per session — toggling RDM off and on, or clearing the device list, resets the tracking so alerts are re-evaluated on the next probe. The identify stays on until the technician turns it off manually (right-click → Identify Off, or via the Info tab). The setting persists across sessions.

The feature can also be toggled from the DMX Remote Control main channel: value 64–71 enables alert identify, value 72–79 disables it. This allows a technician to activate pre-show fixture checks from the desk without touching the DMXRouter interface. The checkbox in the Templates tab s...

Read more

DMXRouter 1.5.5

16 Mar 19:53
82a14ba

Choose a tag to compare

Show Cue — Undo

An Undo button now appears at the right end of the cue toolbar, with full Ctrl+Z (Cmd+Z on macOS) keyboard shortcut support. It restores the previous state after any destructive or editing operation on cues, with a stack depth of 20 levels.

Covered operations:

  • Delete — undoing a delete re-inserts the cue(s) at their original positions with all data intact, including sequence frames.
  • Edit — undoing an inline edit (name, fade time, hold, curve, loop mode, repeat count) restores the previous value.
  • Renumber — undoing a renumber (single or batch) restores the original cue numbers.

The undo button tooltip shows what will be undone (e.g. "Undo: Delete cue 3"). The stack is cleared when switching between shows, since undo entries are bound to a specific show.

VLAN — Set DHCP

The "Set IP" dialog now includes a Set DHCP toggle — in both the VLAN Manager and the Interfaces tab. When enabled, the IP Address and Subnet Mask fields are locked — pressing Apply switches the adapter back to automatic IP assignment (DHCP). When reopening the dialog on an adapter that's already using DHCP, the toggle is pre-activated so the current state is always visible. The IP and mask fields still show the current DHCP-assigned values for reference — if you deactivate DHCP, they're ready to use as a starting point.

VLAN — Physical NIC Persistence

The "Physical NIC" dropdown now correctly shows the parent adapter when restarting DMXRouter with existing VLAN infrastructure. Previously, on a machine with multiple Ethernet adapters, the combo could show a different NIC than the one actually hosting the VLANs — which was confusing even though the combo was disabled. The parent NIC is now detected from the OS during the capability check on each platform:

  • Windows — queried from the Hyper-V Virtual Switch's bound adapter
  • Linux — queried from the first existing DMXRouter VLAN's vlan.parent via nmcli
  • macOS — queried from ifconfig vlanX parent interface field

The adapter list is also now populated automatically on startup instead of requiring a manual refresh click.

VLAN — Table Improvements

  • Subnet Mask column. The VLAN table now shows a "Mask" column between IP Address and Status, so the full network configuration is visible at a glance. IP Address and Mask columns use ResizeToContents so they only take the space they need.
  • Set IP dialog pre-fills subnet mask. When opening "Set IP" from the VLAN Manager, the subnet mask is now resolved from the adapter's current configuration instead of defaulting to 255.255.0.0. If the adapter has no IP yet, the default is 255.255.255.0.
  • Auto-refresh after interface changes. The VLAN table now updates its IP/Mask columns whenever the interface list changes — including when clicking Refresh in the Interfaces tab or after creating a new VLAN. Previously the table only updated after creating a second VLAN or reopening the tab.

macOS & Linux — Friendly Interface Names

Network interfaces on macOS and Linux now display their user-friendly names instead of kernel device names:

  • macOS — "vlan0" becomes "DMXRouter_VLAN200", "en0" becomes "Thunderbolt Ethernet", matching what appears in System Settings → Network.
  • Linux — "enp3s0" becomes "Wired connection 1", "DMXRouter_VLAN200" stays as-is, matching what NetworkManager shows in nmcli or the GNOME/KDE network settings.

This applies everywhere interfaces appear: the Interfaces tab, interface dropdowns in RDM/sACN/Art-Net configuration, and Show Cue control source selectors. Windows was already showing friendly names via QNetworkInterface::humanReadableName() and is unaffected.

Routing — Faster Engine Enable/Disable

Toggling a process engine on or off in the routing table is now effectively instant. Previously, each checkbox toggle ran the full config-update pipeline: rebuilding the input index, pruning unreferenced source caches, recalculating play-input slot assignments, updating sACN multicast group memberships (kernel IGMP calls), and refreshing the Show Cue panel. None of that work is needed for a simple enable/disable — the routing topology hasn't changed, just whether the engine is being evaluated. The toggle now flips a single flag and refreshes the table.

Network & Performance

Larger Socket Buffers

Socket receive buffers increased from 512KB to 8MB (clamped by each OS to its maximum). This prevents packet loss during brief GUI stalls — at 1000 universes, the previous buffer could only hold ~18ms of traffic before dropping packets. The new buffer provides over 150ms of headroom, enough to absorb any normal application activity without data loss. Larger buffers do not add latency: packets are still processed immediately as they arrive; the extra space only matters as a safety net when the application is momentarily busy.

Send buffers also increased from 512KB to 2MB, preventing dropped output packets when a show cue triggers all universes simultaneously.

On Linux and macOS, the OS may limit buffer sizes below what DMXRouter requests. A warning appears in the log at startup with the command to fix it:

  • Linux: sudo sysctl -w net.core.rmem_max=8388608
  • macOS: sudo sysctl -w net.inet.udp.recvspace=8388608

Internal Processing

The per-packet processing path has been optimized to reduce CPU overhead at high universe counts. Interface lookups, statistics recording, and monitor updates now use cached data instead of recalculating on every packet. At 1000 universes these changes significantly reduce CPU usage, making DMXRouter suitable for large-scale productions on standard hardware.

Atomic Config Saves

Show configuration files are now written atomically. If the application crashes or power fails during a save, the previous config file remains intact — protecting hours of show programming from corruption.

Windows — VLAN Adapter Isolation on Creation

When Hyper-V creates a new ManagementOS adapter (Add-VMNetworkAdapter), Windows starts the DHCP client on it immediately — before the VLAN tag is applied by Set-VMNetworkAdapterVlan. During this brief window, the adapter operates in untagged mode and can pick up DHCP leases from the untagged network. Once the VLAN tag is applied, broadcast isolation works correctly (Access mode drops traffic that doesn't match the VLAN ID), but the stale DHCP lease persists.

DMXRouter now prevents this race condition:

  • DHCP disabled at creation time. After creating a VLAN adapter and applying the VLAN tag, the DHCP client is immediately disabled (Set-NetIPInterface -Dhcp Disabled) with a brief delay to ensure Windows has registered the interface. This prevents the adapter from acquiring a lease before the operator assigns a static IP.
  • DHCP also disabled when assigning a static IP. The Set IP command now explicitly disables DHCP before adding the address, in case the adapter was created by a previous version.
  • Strict subnet matching for Art-Net. As an additional safety layer, Art-Net DMX data packets are now matched exclusively by subnet: a broadcast from 192.168.1.x can only reach an interface with a 192.168.1.x address, never a 2.x.x.x VLAN interface. Previously, a cross-subnet fallback silently routed unmatched packets to all active interfaces. Discovery and RDM packets (ArtPollReply, ArtTodData, ArtRdm) bypass this filter so that nodes on a different subnet — a common field scenario with factory-default IPs or misconfigurations — still appear in the device tree. sACN is unaffected — it uses multicast, where the group join is the isolation mechanism.

Windows & Linux — Static IP Routing Metric

When assigning a static IP via "Set IP", DMXRouter now sets a high routing metric (9999) on the adapter and removes any default gateway. This prevents static Art-Net/sACN adapters from competing with the DHCP interface for internet routing — a common issue on Windows with Hyper-V when multiple virtual adapters share the same physical NIC and get equal automatic metrics.

When switching back to DHCP via "Set DHCP", the metric is restored to automatic so the adapter's gateway gets normal priority.

  • WindowsInterfaceMetric 9999 on static, AutomaticMetric Enabled on DHCP. Default route removed on static.
  • Linuxipv4.route-metric 9999 on static, reset to default on DHCP. Gateway cleared on static.
  • macOS — No change needed: networksetup -setmanual doesn't add a default gateway, and macOS uses service ordering for routing priority.

VLAN — macOS IP Assignment Fix

  • "Set IP" now works reliably for VLAN interfaces on macOS. The previous implementation cleared the adapter to DHCP before assigning the new static IP. On VLAN interfaces, macOS's configd was still processing the DHCP switch when the manual IP command arrived, silently ignoring it and leaving the adapter stuck in DHCP mode. The assignment is now a single atomic operation — networksetup -setmanual already replaces whatever configuration was active (DHCP or previous manual IP), so the preliminary clear was unnecessary and counterproductive.

VLAN — Set DHCP Fixes (All Platforms)

While implementing the Set DHCP feature, the underlying "clear IP" commands were reviewed and corrected on all three platforms:

  • Windows — Previously only removed manual IP addresses without re-enabling the DHCP client. Now enables DHCP, restores automatic interface metric, and runs ipconfig /renew to force a DHCP lease request.
  • Linux — Previously set ipv4.method disabled, which turned off IPv4 entirely on the adapter. Now correctly sets ipv4.method auto to enable DHCP, and resets gateway and route metric to defaults.
  • macOS — Already correct (networksetup -setdhcp), no change needed.

Platform Availability

Windows

Download and run `DMXRouter-S...

Read more

DMXRouter 1.5.4

15 Mar 14:44
80f3703

Choose a tag to compare

RDM — Fixture ID (E1.37-5: DEVICE_UNIT_NUMBER)

Support for PID 0x0656 DEVICE_UNIT_NUMBER from ANSI E1.37-5. This PID — commonly known as Fixture ID — is designed to give each fixture a unique numeric identifier independent of its DMX address, making it possible to track individual units across different shows, venues, and address schemes.

  • Fixture ID column in the device tree. A new "FID" column appears between DMX and Personality, showing the fixture ID of each discovered device. Robert Juliat and other manufacturers implementing this PID consider it "as important as the DMX address" — the tree reflects this by placing them side by side.
  • Fixture ID in the Info tab. Displayed below Sub-Devices, immediately visible without needing "Fetch Advanced".
  • Fixture ID in the Config tab. A spin box (0–65534) with a Set button lets you assign a fixture ID from DMXRouter, just like setting a DMX address. The value is sent via SET DEVICE_UNIT_NUMBER and confirmed with a re-read.
  • Fetched automatically as part of "Fetch Advanced" alongside all other E1.37 PIDs.
  • RDM Emulator support. Emulated devices respond to GET and SET DEVICE_UNIT_NUMBER. The value is persisted to disk, captured when snapshotting a real device, and advertised in SUPPORTED_PARAMETERS.

RDM — Automatic Status Message Drain (E1.20 §5.3.3)

E1.20 specifies that when a device has queued messages, it sets messageCount > 0 in the response header of any RDM transaction. The controller should then drain those messages by sending GET QUEUED_MESSAGE. DMXRouter now does this automatically.

  • Auto-drain on every RDM response. When any successful RDM response arrives with messageCount > 0, DMXRouter begins draining the device's output queue by sending GET QUEUED_MESSAGE in a loop (50ms spacing) until messageCount reaches 0. This happens transparently in the background — no user action required.
  • Status messages are accumulated per device. Drained STATUS_MESSAGES responses are decoded and stored in the device's data structure, persisting as long as the device remains discovered. Other queued PID responses (non-status) are logged for diagnostics.
  • Concurrency protection. Only one drain loop runs per device at a time. A depth limit of 20 messages per burst prevents runaway loops from misbehaving responders.

This is particularly important for fixtures that use status messages to report selftest results, sensor alerts, or configuration changes made via their own web interface — the controller now picks these up automatically instead of requiring the operator to manually poll.

RDM — Status Message Indicators in the Device Tree

Status messages are now visible at a glance in the device tree, without needing to open the Status tab:

  • The Status column now reflects accumulated status messages. After probe completion (✔), the indicator changes if the device has reported status messages:
    • ⚠ red — one or more errors (STATUS_ERROR / STATUS_ERROR_CLEARED)
    • ⚠ orange — warnings present, no errors (STATUS_WARNING / STATUS_WARNING_CLEARED)
    • ℹ green — advisories only (STATUS_ADVISORY / STATUS_ADVISORY_CLEARED)
    • ✔ green — probe complete, no status messages
  • Tooltip on the Status column summarises the message counts (e.g. "2 errors, 1 warning — select device and open Status tab for details").

This means that when a fixture sends a status message after a selftest, a sensor alert, or a configuration change, the operator sees it immediately in the tree — exactly what professional workflows need.

RDM — Status Tab Improvements

  • Status tab auto-populates when selecting a device. Previously the table was always empty until you clicked "Fetch Status". Now, if the device has accumulated status messages (from auto-drain or previous manual fetches), they appear immediately when you select the device.
  • Manual "Fetch Status" and "GET Queued" also feed the device accumulator. Messages fetched manually are stored alongside auto-drained messages, so the tree indicator updates in real time.
  • "Clear Status" clears both the table and the device accumulator. After sending SET CLEAR_STATUS_ID to the device, the accumulated messages are removed from memory, the tree indicator reverts to ✔, and the table is emptied.
  • Live update during auto-drain. If a device is currently selected and status messages arrive via auto-drain, the Status tab updates immediately with an "(auto-drained)" label in the message count.

RDM — Probe Progress Bar Cleanup

  • The probe progress bar and its status label now hide entirely when discovery finishes, instead of remaining visible as a centered "Idle" / "N devices — ready" label occupying a full-width row. Device count is already shown in the header — the progress bar only appears while probing is actively in progress.

RDM Templates — Lamp Hours Warning

  • Lamp hours limit per model. A new "Lamp Limit" column in the Templates table lets you set a warning threshold in hours (e.g. 2000h for a specific fixture model). The value is stored in the template and persisted to disk.
  • Warning in the device tree. When a discovered device's lamp hours exceed its model's template limit, the device name turns orange and a tooltip shows "Lamp hours: 2150 (limit: 2000h)".
  • Warning in the Info tab. The Lamp Hours row turns red and shows "2150 ⚠ exceeds 2000h limit" when the threshold is exceeded.
  • Set the limit to 0 (shown as "—") to disable the warning for a model.

RDM Templates — Firmware Mismatch Warning

  • Templates now capture the device's firmware version (SOFTWARE_VERSION_LABEL) at save time.
  • Warning on manual apply: when applying a template to a device running a different firmware than the one the template was saved from, a warning dialog explains that personalities, channels, or behavior may have changed, and asks for confirmation before proceeding.
  • Warning on auto-apply: during automatic template application on discovery, firmware mismatches are logged in the RDM transaction log so the operator can review them after probing completes.
  • Visual indicator in the Templates table: the Model column shows an orange text when a discovered device of the same model has a different firmware than the template. Hover the Model cell to see both versions.

UI Polish

  • Improved table layouts across the application. Columns that contain variable-length text (device name, model, label, description) now stretch to use available space, while fixed-width columns (status indicators, timestamps, IDs) no longer waste space. This applies to the RDM device tree, Node Config tree, Fixture DB, PID Browser, Slots, personality tables (RDM, LLRP, RDMNet), and the Show Cue table.
  • RDM device tree Status column now shows ✔ (checkmark) on all platforms instead of 💾 (floppy disk emoji) which had no obvious meaning.
  • RDM and Node Config splitter proportions adjusted so the device tree gets enough room for all columns by default.
  • Show Cue Curve/Loop dropdowns no longer clip on macOS — columns and combo boxes widened to accommodate the dropdown arrow.
  • Interfaces tab font sizes reduced to match the rest of the application. Previously the tab appeared noticeably larger than other tabs, especially on macOS.

macOS — VLAN IP Assignment Fix

  • "Set IP" now works for VLAN interfaces on macOS. Previously, assigning an IP to a VLAN adapter failed with "SERVICE_NOT_FOUND" because the BSD device name (vlan0) was only looked up in hardware ports, where VLANs don't appear. A third lookup path via networksetup -listVLANs now resolves the correct network service name. Physical interfaces (en0) continue to work as before via the hardware ports path.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included.

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.5.4-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.5.4-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6

# Fedora
sudo dnf install qt6-qtbase

# Arch
sudo pacman -S qt6-base

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later. On first launch, allow it in System Settings → Privacy & Security.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.5.3

14 Mar 15:39
f6f4fcc

Choose a tag to compare

RDM Emulator — Multi-Selection & Batch Operations

  • Multi-selection in the device profile table. Ctrl+Click, Shift+Click, and drag-select now work. When multiple profiles are selected, the detail panel switches to a batch summary showing all selected devices with their status, UID, and model name.
  • Batch operations: Activate All, Deactivate All, Duplicate All, Export All, and Remove All — available both from the batch panel buttons and from the right-click context menu. The context menu adapts its entries based on whether one or multiple profiles are selected.
  • Multi-profile export produces a single .dmxrprofile file containing all selected profiles. Import recognises this format automatically alongside single-profile files.

RDM Emulator — Template Library

  • New "Template Library" tab alongside the Devices tab. Templates are reusable fixture definitions — they contain the manufacturer, model, personalities, channel map, and supported PIDs, but no instance data (UID, port, DMX address, active state).
  • Save as Template: right-click any device (or multiple devices) and choose "Save as Template…" to add it to the library. For single selection, a dialog asks for the template name.
  • Create from Template: the "From Template…" button in the Devices tab opens a picker dialog, then asks how many instances to create (1–100) with a personality selector. Each instance gets a unique virtual UID.
  • Personality selector in the "Create Instances" dialog — a dropdown listing all personalities with their channel count. A live label shows the DMX footprint of the selected personality. Templates with a single personality show the combo disabled.
  • Template file format (.dmxrtemplate): export and import templates independently from device profiles. Single-template and multi-template files are both supported.
  • Templates are persisted automatically to rdm_emulator_templates.json in the data directory.

RDM — Complete E1.20 PID Support

DMXRouter now handles every standard PID defined in ANSI E1.20-2010:

  • STATUS_MESSAGES / STATUS_ID_DESCRIPTION / CLEAR_STATUS_ID / QUEUED_MESSAGE: new "Status" tab in the RDM inspector. Query device status messages filtered by severity (Advisory / Warning / Error). Messages are color-coded. Click a row to fetch the human-readable description for that status ID. "GET Queued" drains the device output queue one message at a time, showing the messageCount from each response. "Clear" sends SET CLEAR_STATUS_ID.
  • PARAMETER_DESCRIPTION: when "Fetch Advanced" retrieves a device's supported PID list and finds manufacturer-specific PIDs (0x8000–0xFFDF), it automatically queries PARAMETER_DESCRIPTION for each one. The PID Browser then shows the manufacturer's own name, data type, access mode (GET/SET), unit, and valid range for these PIDs — instead of just "Unknown PID".
  • COMMS_STATUS: displayed in the Info tab (short message count, length mismatch, checksum failures). "Clear Comms" button in the Config tab resets the counters.
  • PRODUCT_DETAIL_ID_LIST: displayed in the Info tab with human-readable names.
  • BOOT_SOFTWARE_VERSION_ID / BOOT_SOFTWARE_VERSION_LABEL: displayed in the Info tab.
  • FACTORY_DEFAULTS: GET displayed in Info tab, SET via "Factory Reset" button (with confirmation dialog).
  • LANGUAGE / LANGUAGE_CAPABILITIES: displayed in Info tab (current language + number of available languages).
  • DEFAULT_SLOT_VALUE: cached per device for reference.
  • PROXIED_DEVICES / PROXIED_DEVICE_COUNT: displayed in Info tab for gateways that act as RDM proxies.
  • REAL_TIME_CLOCK: displayed in Info tab. "Sync Clock" button sets the device clock to the current system time.
  • POWER_ON_SELF_TEST / PERFORM_SELFTEST / SELF_TEST_DESCRIPTION: power-on self-test status shown in Info tab.
  • RECORD_SENSORS: "Record All" button in the Sensors tab captures the current sensor values as reference.
  • SUB_DEVICE_STATUS_REPORT_THRESHOLD: GET/SET supported.
  • RESET_DEVICE: "Warm Reset" and "Cold Reset" buttons in Config tab (with confirmation dialogs).
  • PRESET_PLAYBACK / PRESET_MERGEMODE / PRESET_INFO / PRESET_STATUS / CAPTURE_PRESET: preset state displayed in Info tab. All SET commands implemented.

RDM — E1.37-1 Dimmer Message Set

Full support for the dimmer-specific PIDs defined in ANSI E1.37-1:

  • CURVE / CURVE_DESCRIPTION: current dimming curve displayed in Info tab. SET supported.
  • OUTPUT_RESPONSE_TIME / OUTPUT_RESPONSE_TIME_DESCRIPTION: GET/SET supported.
  • MODULATION_FREQUENCY / MODULATION_FREQUENCY_DESCRIPTION: GET/SET supported.
  • MINIMUM_LEVEL / MAXIMUM_LEVEL: displayed in Info tab (increasing/decreasing values).
  • BURN_IN: GET/SET supported.
  • LOCK_STATE / LOCK_STATE_DESCRIPTION / LOCK_PIN: lock state displayed.
  • DMX_FAIL_MODE / DMX_STARTUP_MODE: displayed in Info tab (scene, delay, hold). SET supported.
  • DIMMER_INFO: full dimmer configuration summary in Info tab.

All dimmer PIDs are automatically queried when clicking "Fetch Advanced".

RDM — "Fetch Advanced" Button

New button in the Config tab that queries all E1.20 advanced PIDs and E1.37-1 dimmer PIDs in a single staggered burst (50ms spacing per PID to respect half-duplex gateways). This populates the Info tab's Advanced section, the Status tab, and the PID Browser's manufacturer PID metadata. Devices that don't support a PID simply NACK and the field shows "—".

LLRP — Identify Fixes

  • Identify button is now a toggle — pressing it sends IDENTIFY ON; pressing again sends IDENTIFY OFF. The button highlights orange when active, matching the RDM panel behavior.
  • Identify state is now fetched from the target (GET IDENTIFY_DEVICE) when selecting a device or clicking "Get Info".
  • Context menu Identify ON/OFF now syncs the toggle button state.
  • SET ACK for IDENTIFY triggers a re-read to confirm the device state.

Cross-Platform UI — Conditional Icons

  • Emoji restored on macOS and Windows — all 22 UI icons (💡🔍🔄📋📥📤🤖💾📸📊🎬📈🔧🌐📡📂🔢 etc.) now render as their original colorful emoji on macOS and Windows, restoring the visual personality of the interface.
  • BMP fallbacks on Linux only — Linux builds use safe BMP Unicode symbols (☀⌕↻☰⤓⤒⚙✔⊚▦▶↗☷№✕) that render reliably across all Linux font configurations.
  • AppStyle::Icons namespace — all icon constants are defined in a single place with #ifdef Q_OS_LINUX conditional. GUI files use IC::Identify, IC::Search, etc. via a namespace alias, making it trivial to adjust icons per platform.

Config Tab — Device Control

New "Device Control" section at the bottom of the Config tab with one-click actions:

  • Warm Reset — software restart (RESET_DEVICE warm)
  • Cold Reset — full hardware restart (RESET_DEVICE cold)
  • Factory Reset — restore factory defaults (SET FACTORY_DEFAULTS)
  • Clear Comms — reset communication error counters (SET COMMS_STATUS)
  • Sync Clock — set device clock to system time (SET REAL_TIME_CLOCK)

All destructive operations require confirmation.

RDM — Remove Lost Devices

  • "Remove Lost" button in the RDM panel header — removes all devices that haven't responded in over 30 seconds, instead of waiting for the default 5-minute timeout. Useful after disconnecting fixtures or reconfiguring a rig.
  • "Remove Device" in the right-click context menu — immediately removes a single device from the discovered list.
  • "Remove Lost Devices (not seen >30s)" in the context menu — same as the header button.
  • "Last seen" indicator in the context menu shows how long ago the device last responded, helping identify lost fixtures before removing them.

RDM Templates — Export & Import

  • "↑ Export…" button in the Templates tab — exports all RDM configuration templates to a JSON file for sharing or backup.
  • "↓ Import…" button — imports templates from a previously exported file. Supports multiple formats: the export wrapper, the internal DMXRouter storage format, and raw JSON arrays. Existing templates with the same model key are updated.

RDM Templates — Personality Dropdown

  • The Personality column in the Templates table is now a dropdown menu instead of a static text field. When a device of the same model has been discovered, the combo lists all available personalities with their description and channel count (e.g. "1 — 8-bit Mode (4 ch)"). Selecting a personality immediately updates the template. The first entry "—" clears the personality setting.

RDM — Probe Progress Feedback

  • Progress bar below the header — shows a green progress bar during device probing with "12 / 58 devices" format. Hidden when all devices are probed.
  • Status label next to the progress bar — shows "Probing 12/58 devices…" in orange during probing, switches to "58 devices — ready" in green when complete.
  • Discover button flashes orange while probing is in progress, providing a visual heartbeat that RDM activity is happening.
  • "Status" column in the device tree — shows per-device probe progress: "…" (waiting), "3/6" (receiving PIDs), or "✔" (complete). The indicator is orange while probing and green when complete, making it easy to spot which fixtures have been fully queried.

Show Cue — Playback Time & Repeat Feedback

  • Fade time countdown in the status label — during crossfading, the status now shows elapsed and total time (e.g. "FADING Show 1 · Cue 3 · 1.2s / 5.0s") instead of just a percentage, so you know exactly how long remains.
  • Sequence playback timing — for sequence cues (recorded timelines), the status shows elapsed and total duration (e.g. "▶ PLAYING Show 1 · Cue 5 · 12.3s / 45.0s"). The progress bar also fills during sequence playback, not just during crossfades.
  • Repeat counter in the status label — when autopilot is active and the current cue has mul...
Read more

DMXRouter 1.5.2

09 Mar 06:31
348d826

Choose a tag to compare

Show Cue Playback — Sequential Slot Mapping

  • Show playback no longer requires matching engine indices. Previously, a recorded show would only output correctly if the subscribing engines had the same indices as the engines that were active during recording. In practice this meant you had to delete input-only engines to make outputs work, or set up engines in the exact same order as when the show was recorded.
  • Now, when an engine selects a show as its input source, it is automatically assigned the next available slot in recording order. The first engine to subscribe to Show 1 gets the first recorded PE's data, the second gets the second, and so on — regardless of their engine index. Disabled engines do not consume a slot.
  • Recorded PE indices are sorted into a canonical order per show, so the mapping is consistent across cues, crossfades, sequence playback, blackouts, and keep-alive frames.
  • Recording feedback loop protection: engines that have a play input subscribed to the show being recorded are automatically excluded from capture. This prevents the show's own playback data from being re-recorded into itself.
  • Show removal during recording: removing a show that is being sequence-recorded now stops the recording first. Removing a show before the recording target adjusts the index correctly.

Show Cue — UI Redesign

  • "⏺ REC" → "◉ Take" — the snapshot capture button is now called "Take" to clearly convey it captures a single instant, not a time-based recording.
  • "⏺ SEQ" → "⏺ Rec" — the sequence recording button is now "Rec", which is the intuitive label for time-based recording. During recording it shows "⏹ Stop Rec".
  • DMX remote trigger for sequence recording — the Record Trigger channel now accepts values 141–180 to start/stop sequence recording for shows 1–40 (in addition to 101–140 for snapshot takes). Sending the value again while recording stops it. If recording a different show, the current recording is stopped first.
  • Collapsible trigger config — the Play Control and Take/Rec Trigger configuration panels are now behind a "▸ DMX Trigger Config" toggle at the bottom, collapsed by default. The cue table gets the full height when triggers are already configured.
  • Compact address fields — Net, Subnet, Universe, and Absolute are now on a single row instead of four separate rows. Protocol and Channel share a row. Switching to sACN collapses the Art-Net fields cleanly. Universe and Absolute spins have a minimum width of 75 px to fit 5-digit sACN values.
  • Save/Load moved to top bar — Save… and Load… buttons are now in the show toolbar next to +/− instead of buried in the config panel.
  • Status label moved to transport bar — the playback status (STOPPED / PLAYING / Recording…) is now next to the Autopilot button where it has more space, instead of competing with Save/Load.
  • Top bar layout — show controls are left-aligned, default cue settings are right-aligned, with a stretch separator between them.

Show Cue Table Improvements

  • Cue type "Snap" renamed to "Snapshot" — the Type column now shows "Snapshot" instead of "Snap" to clearly distinguish it from the "Snap" fade curve, which remains unchanged.
  • Column header tooltips — all 10 columns now have descriptive tooltips explaining their purpose: Reps (repeat count for autopilot), PEs (number of Process Engines in the cue), Hold (auto-advance delay), Curve (fade shape), Loop (sequence play mode), and others.
  • Row height increased — from the default to 34 px so the embedded Curve and Loop combo boxes are fully visible instead of being clipped.
  • Hover selection fixed — moving the mouse over the cue table no longer auto-selects rows, matching the fix applied to other tables with embedded widgets.
  • Hold column: spin box instead of text — the Hold column now uses a numeric spin box with "Manual" displayed at value 0, instead of requiring the user to type "Manual" as text. Arrows and direct input both work.
  • Double-click GO on editable columns — double-clicking the Name, Fade, Hold, Curve, Loop, or Reps column no longer fires the cue. GO is only triggered on read-only columns (Number, Type, PEs, Recorded).
  • Disabled cell shading — Hold is shaded for Sequence cues, Loop and Reps are shaded for Snapshot cues, making it visually clear which fields don't apply to which cue type. Playback highlighting overrides the shading and restores it when the cue is no longer active.

Engine Editor Improvements

  • Input fields shaded when source is internal/play — Protocol, Net, Subnet, Universe, Absolute, and Source IP fields are now visually dimmed when the input source is an engine or a show, since these fields don't apply to internal routing.
  • Output Tx Mode column widened — from 95 to 110 px so "Broadcast" is no longer clipped.

Keyboard Shortcuts

  • Alt+8 now opens the RDM Emulator panel (previously had no shortcut).
  • Broker moved to Alt+9, LLRP to Alt+0. Remote Control no longer has a shortcut.

Template Table Fixes

  • Row height: the editable DMX Address spin box was clipped inside the 22-pixel default row height. Increased to 34 px.
  • Column widths: "DMX Addr" widened to 95 px, "Settings" widened to 120 px to prevent text truncation.
  • Hover selection: moving the mouse over the template table no longer auto-selects rows.
  • Settings count: the DMX address is only counted as an active parameter when the global "Apply DMX address" toggle is on. Toggling the checkbox updates the count immediately.

RDM Emulator Fixes

  • Protocol toggle Art-Net ↔ sACN addressing: the emulator was using sACN universe = PA (Port-Address) while the rest of the application uses sACN universe = PA+1 (matching Art-Net Absolute). This caused the universe number to drop by 1 every time the protocol was toggled, and PA=0 (Art-Net Absolute 1) produced an invalid sACN universe of 0. All four display and save paths now use the PA+1 convention.
  • Create/Edit dialog table rows: row height increased to 38 px so descender letters like "p" and "g" are no longer clipped.
  • DEVICE_HOURS and DEVICE_POWER_CYCLES: emulated devices now respond to these PIDs. Values are captured from real devices and default to 0 for manually created profiles.