artnet2usb-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.de.md +149 -0
- package/README.es.md +149 -0
- package/README.fr.md +149 -0
- package/README.it.md +149 -0
- package/README.ja.md +149 -0
- package/README.md +149 -0
- package/README.pt-BR.md +149 -0
- package/README.ru.md +149 -0
- package/README.tr.md +149 -0
- package/README.zh-Hans.md +149 -0
- package/dist/main/main.js +518 -0
- package/dist-cli/app/artnet.js +158 -0
- package/dist-cli/app/dmxOutput.js +203 -0
- package/dist-cli/cli/autoRoute.js +43 -0
- package/dist-cli/cli/bridge.js +46 -0
- package/dist-cli/cli/configDir.js +49 -0
- package/dist-cli/cli/doctor.js +42 -0
- package/dist-cli/cli/index.js +422 -0
- package/dist-cli/cli/routeCommands.js +80 -0
- package/dist-cli/cli/serviceInstall.js +181 -0
- package/dist-cli/shared/portableConfig.js +52 -0
- package/dist-cli/shared/store.js +76 -0
- package/dist-cli/shared/types.js +3 -0
- package/package.json +122 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Remana
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.de.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="src/public/logo.svg" alt="Relackout ArtNet 2 USB" width="96" height="96">
|
|
4
|
+
|
|
5
|
+
# Relackout ArtNet 2 USB
|
|
6
|
+
|
|
7
|
+
**Eine kostenlose, fokussierte Art-Net-→-USB-DMX-Bridge mit Desktop-GUI und Headless-CLI.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Download](https://relackout.com/usb-dmx) · [CLI-Nutzung](#cli-usage) · [Aus dem Quellcode erstellen](#building-from-source) · [Architektur](#architecture)
|
|
14
|
+
|
|
15
|
+
[English](README.md) · [Türkçe](README.tr.md) · **Deutsch** · [Español](README.es.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Português](README.pt-BR.md) · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Was ist das?
|
|
22
|
+
|
|
23
|
+
Die meisten Lichtsteuerungs-Programme sprechen **Art-Net** über das Netzwerk, aber viele USB-DMX-Interfaces — Enttecs DMX USB Pro (und kompatible Geräte), generische Open-DMX-/FTDI-Dongles — benötigen weiterhin etwas auf dem Tisch, das dieses Netzwerksignal empfängt und über USB ausgibt.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** ist genau das: eine kleine, fokussierte Bridge, die Sie im Hintergrund laufen lassen. Sie kostet nichts, erfordert kein Konto und wurde entwickelt, um den Umgang mit dem gesamten Art-Net-Ökosystem zu erleichtern — auch mit Konsolen und Software, die nicht von [Relackout](https://relackout.com) stammen.
|
|
26
|
+
|
|
27
|
+
Es gibt sie in zwei Varianten:
|
|
28
|
+
- **Eine Desktop-GUI** — automatische Erkennung, eine Live-Vorschau aller 512 Kanäle und eine visuelle Routing-Tabelle.
|
|
29
|
+
- **Eine Headless-CLI** (`artnet2usb-cli`) — genau dieselbe Routing-Engine, ohne UI, gedacht für einen Raspberry Pi hinter einer Traverse, einen Backstage-Server ohne Monitor oder das Skripten einer kompletten Show-Konfiguration im Voraus. Beide lesen und schreiben dieselbe Konfigurationsdatei, sodass Sie Routen in der GUI anlegen und headless ausführen können — oder umgekehrt.
|
|
30
|
+
|
|
31
|
+
## Funktionen
|
|
32
|
+
|
|
33
|
+
- **Automatische Erkennung** — lauscht passiv auf UDP 6454 und listet jedes im Netzwerk gesendete Art-Net-Universum auf, samt Quell-IP und einer Live-Anzeige der Framerate; `ArtPoll`/`ArtPollReply`-Node-Scanning findet auch Geräte, die noch kein DMX senden.
|
|
34
|
+
- **Live-Kanalvorschau** — beobachten Sie alle 512 Kanäle eines erkannten Universums in Echtzeit, bevor Sie überhaupt etwas routen.
|
|
35
|
+
- **Visuelle Routing-Tabelle** — jede Zeile ist eine Regel: Art-Net-Universum → USB-Gerät + Protokoll + Aktualisierungsrate (1–44 Hz).
|
|
36
|
+
- **Zwei Protokolle** — Enttec DMX USB Pro (und firmwarekompatible Klone) sowie rohe Open-DMX-/FTDI-Ausgabe.
|
|
37
|
+
- **Dauerhafte Geräteidentität** — USB-Interfaces werden anhand ihrer Hardware-Identität (Vendor-ID, Product-ID, Seriennummer) erkannt, nicht anhand ihres OS-Port-Pfads. Benennen Sie ein Gerät einmal um, und Name sowie zugehörige Routen bleiben erhalten, selbst wenn das Gerät abgesteckt und an einem anderen Port wieder angeschlossen wird.
|
|
38
|
+
- **Kanal-Patch-Offset** — gleicht die eigene DMX-Startadresse eines Scheinwerfers oder eine abweichende Kanalnummerierung einer Konsole pro Route aus (`-511..511`). Das Universum wird **zirkulär** innerhalb seiner 512 Kanäle verschoben — es gehen dabei nie Kanaldaten verloren, sie laufen stattdessen um.
|
|
39
|
+
- **Verhalten bei Signalverlust** — legen Sie fest, ob die Ausgabe das letzte Frame hält oder abdunkelt, sobald die Art-Net-Quelle verschwindet.
|
|
40
|
+
- **Portable Konfiguration** — läuft ohne jede Installation von einem USB-Stick; siehe [Portable Konfiguration](#portable-config) unten.
|
|
41
|
+
- **5 Sprachen in der GUI** — Englisch, Deutsch, Französisch, Italienisch, Türkisch.
|
|
42
|
+
|
|
43
|
+
## Download
|
|
44
|
+
|
|
45
|
+
Vorgefertigte Single-File-Binärdateien ohne Installer für Windows, macOS und Linux (einschließlich Raspberry Pi für die CLI) finden Sie unter **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** sowie auf der Seite [GitHub Releases](../../releases).
|
|
46
|
+
|
|
47
|
+
| | Datei | Hinweise |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portabel — kein Installer, einfach ausführen. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Drag & Drop, kein Installer. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` und ausführen. |
|
|
52
|
+
| CLI · alle Plattformen | `artnet2usb-cli-<ver>-<platform>[.exe]` | Ein echtes eigenständiges Binary — kein Node.js erforderlich. Deckt macOS (arm64/x64), Linux (x64/arm64/armv7l — einschließlich Raspberry Pi) und Windows (x64) ab. |
|
|
53
|
+
|
|
54
|
+
> **Unsignierte Builds.** Die Releases sind nicht code-signiert. Beim ersten Start verlangt macOS *Rechtsklick → Öffnen*, und der Windows SmartScreen verlangt *Weitere Informationen → Trotzdem ausführen*.
|
|
55
|
+
|
|
56
|
+
## CLI-Nutzung
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # no args → interactive terminal wizard
|
|
60
|
+
artnet2usb-cli --help # full command reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Befehl | Was er tut |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Interaktiver Assistent zum Hinzufügen/Entfernen von Routen und optional zum Starten der Bridge. |
|
|
66
|
+
| `auto` | Erkennt automatisch ein einzelnes Art-Net-Universum und USB-Gerät, speichert die Route und startet sie (`--no-start`, um den Start zu überspringen). |
|
|
67
|
+
| `run` | Startet die Bridge mit den gespeicherten Routen und läuft, bis sie gestoppt wird (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Verwaltet Routen nicht-interaktiv — skriptfähig aus einem Shell-Skript oder einem Ansible-Playbook heraus. |
|
|
69
|
+
| `list-ports` | Listet angeschlossene USB-Seriell-Geräte auf. |
|
|
70
|
+
| `list-nodes` | Lauscht im Netzwerk nach Art-Net-Nodes (~3 s) und listet sie auf. |
|
|
71
|
+
| `doctor` | Meldet getrennte Geräte, widersprüchliche Routen und Einstellungen außerhalb des gültigen Bereichs in der gespeicherten Konfiguration. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Erzeugt (und gibt aus, wendet aber nie stillschweigend an) eine systemd-Unit (Linux) oder einen launchd-Agent (macOS), damit die Bridge nach einem Neustart oder Absturz automatisch wieder startet. |
|
|
73
|
+
|
|
74
|
+
Ein-Befehl-Headless-Einrichtung auf einem Rechner mit genau einem Art-Net-Universum und einem USB-DMX-Interface:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Jeder Befehl akzeptiert `--config <dir>`, um ein bestimmtes Konfigurationsverzeichnis anzugeben, und `run`/`auto` akzeptieren `--json`, um newline-delimited JSON-Status statt menschenlesbarem Text auszugeben (praktisch, um den Prozess aus einem anderen Skript heraus zu überwachen).
|
|
81
|
+
|
|
82
|
+
## Portable Konfiguration
|
|
83
|
+
|
|
84
|
+
Die App sucht zuerst neben der ausführbaren Datei nach `config.json`, damit sie auf einem USB-Stick zwischen Rechnern wandern kann. Ist dieses Verzeichnis nicht beschreibbar (z. B. wegen Gatekeepers „App-Translokation" bei einer unsignierten macOS-App), weicht sie auf das für das Betriebssystem übliche, benutzerbezogene Konfigurationsverzeichnis aus. GUI und CLI teilen sich dieselbe `config.json`, wenn sie aus demselben Ordner heraus ausgeführt werden — legen Sie Routen visuell an und führen Sie sie dann headless aus, oder umgekehrt.
|
|
85
|
+
|
|
86
|
+
## Aus dem Quellcode erstellen
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev # GUI, electron-vite dev server
|
|
91
|
+
npm test # unit tests (parser, framing, device uid, config)
|
|
92
|
+
npm run typecheck # tsc --noEmit
|
|
93
|
+
npm run dist # package the GUI for the host platform (electron-builder)
|
|
94
|
+
npm run dev:cli # run the CLI from source (tsx)
|
|
95
|
+
npm run build:cli # compile the CLI to dist-cli/
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Eigenständige Single-File-Builds
|
|
99
|
+
|
|
100
|
+
Alle eigenständigen Build-Ergebnisse landen in `dist-standalone/`; jedes Artefakt ist eine einzelne Datei ohne Installation:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run dist:standalone # host platform: GUI + CLI
|
|
104
|
+
node scripts/build-standalone.mjs --cli --all-targets # CLI: every platform in one pass
|
|
105
|
+
node scripts/build-standalone.mjs --gui --mac --win # GUI: selected platforms only
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Die CLI wird mit `esbuild` gebündelt und mit [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) zu echten Binärdateien gepackt (zum Ausführen ist kein Node.js nötig); die GUI wird mit `electron-builder` gepackt.
|
|
109
|
+
|
|
110
|
+
## Architektur
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
app/ Electron main process
|
|
114
|
+
artnet.ts Art-Net listener/parser — no external protocol library, hand-rolled to spec
|
|
115
|
+
dmxOutput.ts output engine + protocol drivers (Enttec Pro, Open DMX), via `serialport`
|
|
116
|
+
store.ts device names / routes / settings, portable-config-first
|
|
117
|
+
main.ts, preload.ts Electron app lifecycle + the IPC bridge exposed to the renderer
|
|
118
|
+
|
|
119
|
+
cli/ Headless CLI (compiles separately, see tsconfig.cli.json)
|
|
120
|
+
index.ts command definitions (commander) + the interactive wizard (@clack/prompts)
|
|
121
|
+
bridge.ts, autoRoute.ts shared bridge start-up and single-universe/device auto-pick logic
|
|
122
|
+
routeCommands.ts `route add/list/remove` — scriptable route management
|
|
123
|
+
serviceInstall.ts systemd/launchd unit generation
|
|
124
|
+
doctor.ts, configDir.ts config health checks + config-directory resolution
|
|
125
|
+
|
|
126
|
+
shared/ Code shared between the GUI and the CLI
|
|
127
|
+
types.ts RouteConfig, UsbDevice, and the rest of the shared type surface
|
|
128
|
+
store.ts, portableConfig.ts the config file itself + the portable-vs-per-user directory rule
|
|
129
|
+
|
|
130
|
+
scripts/build-standalone.mjs the single-file distribution pipeline (esbuild + @yao-pkg/pkg + electron-builder)
|
|
131
|
+
scripts/embed-win-resources.mjs embeds an icon + version metadata into the Windows CLI .exe (via resedit)
|
|
132
|
+
src/ React + Tailwind renderer (GUI), including src/locales/ for the 5 supported languages
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Mitwirken
|
|
136
|
+
|
|
137
|
+
Issues und Pull Requests sind willkommen. Bevor Sie einen PR öffnen, stellen Sie bitte sicher, dass sowohl `npm test` als auch `npm run typecheck` erfolgreich durchlaufen.
|
|
138
|
+
|
|
139
|
+
## Lizenz
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Teil des [Relackout](https://relackout.com) Lichtsteuerungs-Ökosystems.
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.es.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="src/public/logo.svg" alt="Relackout ArtNet 2 USB" width="96" height="96">
|
|
4
|
+
|
|
5
|
+
# Relackout ArtNet 2 USB
|
|
6
|
+
|
|
7
|
+
**Un puente Art-Net → USB DMX gratuito y enfocado, con una interfaz gráfica de escritorio y una CLI sin interfaz.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Descarga](https://relackout.com/usb-dmx) · [Uso de la CLI](#cli-usage) · [Compilar desde el código fuente](#building-from-source) · [Arquitectura](#architecture)
|
|
14
|
+
|
|
15
|
+
[English](README.md) · [Türkçe](README.tr.md) · [Deutsch](README.de.md) · **Español** · [Français](README.fr.md) · [Italiano](README.it.md) · [Português](README.pt-BR.md) · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## ¿Qué es esto?
|
|
22
|
+
|
|
23
|
+
La mayoría del software de iluminación se comunica mediante **Art-Net** a través de la red, pero muchas interfaces USB DMX — la DMX USB Pro de Enttec (y sus compatibles), o los adaptadores genéricos Open DMX / FTDI — todavía necesitan algo en el escritorio que reciba esa señal de red y la envíe por USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** es exactamente eso: un puente pequeño y enfocado que mantienes ejecutándose en segundo plano. No cuesta nada, no requiere ninguna cuenta, y está diseñado para facilitar el trabajo con todo el ecosistema Art-Net, incluyendo consolas y software que no son de [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
Se distribuye de dos maneras:
|
|
28
|
+
- **Una interfaz gráfica de escritorio** — descubrimiento automático, una vista previa en vivo de 512 canales y una tabla de enrutamiento visual.
|
|
29
|
+
- **Una CLI sin interfaz** (`artnet2usb-cli`) — exactamente el mismo motor de enrutamiento, sin interfaz gráfica, pensada para una Raspberry Pi detrás de una estructura de truss, un servidor de backstage sin monitor, o para automatizar todo un montaje antes de un espectáculo. Ambas leen y escriben el **mismo archivo de configuración**, así que puedes crear las rutas en la interfaz gráfica y ejecutarlas sin interfaz, o al revés.
|
|
30
|
+
|
|
31
|
+
## Características
|
|
32
|
+
|
|
33
|
+
- **Descubrimiento automático** — escucha de forma pasiva en el puerto UDP 6454 y lista cada universo Art-Net que se transmite en la red, con la IP de origen y una lectura en vivo de la tasa de fotogramas; el escaneo de nodos `ArtPoll`/`ArtPollReply` encuentra dispositivos que todavía no transmiten DMX.
|
|
34
|
+
- **Vista previa de canales en vivo** — observa cómo se actualizan en tiempo real los 512 canales de cualquier universo detectado, antes de enrutar nada.
|
|
35
|
+
- **Tabla de enrutamiento visual** — cada fila es una regla: universo Art-Net → dispositivo USB + protocolo + frecuencia de actualización (1–44 Hz).
|
|
36
|
+
- **Dos protocolos** — Enttec DMX USB Pro (y sus clones compatibles a nivel de firmware) y salida Open DMX / FTDI en bruto.
|
|
37
|
+
- **Identidad persistente del dispositivo** — las interfaces USB se recuerdan por su identidad de hardware (ID de proveedor, ID de producto, número de serie), no por la ruta de puerto del sistema operativo. Renombra un dispositivo una sola vez, y ese nombre y sus rutas sobreviven a que se desconecte y se conecte a un puerto distinto.
|
|
38
|
+
- **Desplazamiento de parche de canales** — compensa la dirección de inicio DMX propia de un fixture o una numeración de canales distinta en una consola, por ruta (`-511..511`). El universo se desplaza de forma **circular** dentro de sus 512 canales — no se pierde ningún dato de canal, simplemente da la vuelta.
|
|
39
|
+
- **Comportamiento ante pérdida de señal** — elige si la salida mantiene el último fotograma o se apaga (blackout) cuando la fuente Art-Net desaparece.
|
|
40
|
+
- **Configuración portátil** — se ejecuta desde una memoria USB sin necesidad de instalación; consulta [Configuración portátil](#portable-config) más abajo.
|
|
41
|
+
- **5 idiomas en la interfaz gráfica** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Descarga
|
|
44
|
+
|
|
45
|
+
Los binarios precompilados, de un solo archivo y sin instalador para Windows, macOS y Linux (incluyendo Raspberry Pi para la CLI) están disponibles en **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** y en la página de [GitHub Releases](../../releases).
|
|
46
|
+
|
|
47
|
+
| | Archivo | Notas |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portátil — sin instalador, solo ejecútalo. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Arrastrar y soltar, sin instalador. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` y ejecútalo. |
|
|
52
|
+
| CLI · todas las plataformas | `artnet2usb-cli-<ver>-<platform>[.exe]` | Un binario independiente real — no requiere Node.js. Cubre macOS (arm64/x64), Linux (x64/arm64/armv7l — incluyendo Raspberry Pi) y Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Compilaciones sin firmar.** Las versiones publicadas no están firmadas digitalmente. En el primer inicio, macOS requiere *clic derecho → Abrir*, y Windows SmartScreen requiere *Más información → Ejecutar de todos modos*.
|
|
55
|
+
|
|
56
|
+
## Uso de la CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # sin argumentos → asistente de terminal interactivo
|
|
60
|
+
artnet2usb-cli --help # referencia completa de comandos
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Comando | Qué hace |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Asistente interactivo para añadir/eliminar rutas y, opcionalmente, iniciar el puente. |
|
|
66
|
+
| `auto` | Detecta automáticamente un único universo Art-Net y un dispositivo USB, guarda la ruta y la inicia (`--no-start` para omitir el inicio). |
|
|
67
|
+
| `run` | Inicia el puente usando las rutas guardadas y se ejecuta hasta que se detenga (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Gestiona las rutas de forma no interactiva — apto para automatizar desde un script de shell o un playbook de Ansible. |
|
|
69
|
+
| `list-ports` | Lista los dispositivos serie USB conectados. |
|
|
70
|
+
| `list-nodes` | Escucha los nodos Art-Net en la red (~3 s) y los lista. |
|
|
71
|
+
| `doctor` | Detecta dispositivos desconectados, rutas en conflicto y ajustes fuera de rango en la configuración guardada. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Genera (e imprime, nunca aplica silenciosamente) una unidad systemd (Linux) o un agente launchd (macOS) para que el puente se reinicie automáticamente tras un reinicio o un fallo. |
|
|
73
|
+
|
|
74
|
+
Configuración sin interfaz en un solo comando, en una máquina con exactamente un universo Art-Net y una interfaz USB DMX:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Todos los comandos aceptan `--config <dir>` para apuntar a un directorio de configuración específico, y `run`/`auto` aceptan `--json` para emitir el estado como JSON delimitado por saltos de línea en lugar de texto legible por personas (útil para supervisar el proceso desde otro script).
|
|
81
|
+
|
|
82
|
+
## Configuración portátil
|
|
83
|
+
|
|
84
|
+
La aplicación busca primero `config.json` junto al ejecutable, para poder llevarla en una memoria USB de una máquina a otra. Si ese directorio no es escribible (por ejemplo, por la "app translocation" de Gatekeeper en una app de macOS sin firmar), recurre al directorio de configuración por usuario estándar del sistema operativo. La interfaz gráfica y la CLI comparten exactamente el mismo `config.json` cuando se ejecutan desde la misma carpeta — crea las rutas de forma visual y luego ejecútalas sin interfaz, o viceversa.
|
|
85
|
+
|
|
86
|
+
## Compilar desde el código fuente
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev # GUI, servidor de desarrollo electron-vite
|
|
91
|
+
npm test # pruebas unitarias (parser, framing, device uid, config)
|
|
92
|
+
npm run typecheck # tsc --noEmit
|
|
93
|
+
npm run dist # empaqueta la GUI para la plataforma local (electron-builder)
|
|
94
|
+
npm run dev:cli # ejecuta la CLI desde el código fuente (tsx)
|
|
95
|
+
npm run build:cli # compila la CLI en dist-cli/
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Compilaciones independientes de un solo archivo
|
|
99
|
+
|
|
100
|
+
Toda la salida independiente se genera en `dist-standalone/`; cada artefacto es un único archivo sin nada que instalar:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run dist:standalone # plataforma local: GUI + CLI
|
|
104
|
+
node scripts/build-standalone.mjs --cli --all-targets # CLI: todas las plataformas en una sola pasada
|
|
105
|
+
node scripts/build-standalone.mjs --gui --mac --win # GUI: solo las plataformas seleccionadas
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
La CLI se empaqueta con `esbuild` y se convierte en binarios reales con [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (no se necesita Node.js para ejecutarlos); la GUI se empaqueta con `electron-builder`.
|
|
109
|
+
|
|
110
|
+
## Arquitectura
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
app/ Proceso principal de Electron
|
|
114
|
+
artnet.ts Listener/parser de Art-Net — sin librería de protocolo externa, hecho a mano según la especificación
|
|
115
|
+
dmxOutput.ts motor de salida + drivers de protocolo (Enttec Pro, Open DMX), vía `serialport`
|
|
116
|
+
store.ts nombres de dispositivos / rutas / ajustes, con prioridad a la configuración portátil
|
|
117
|
+
main.ts, preload.ts ciclo de vida de la app Electron + el puente IPC expuesto al renderer
|
|
118
|
+
|
|
119
|
+
cli/ CLI sin interfaz (se compila por separado, ver tsconfig.cli.json)
|
|
120
|
+
index.ts definiciones de comandos (commander) + el asistente interactivo (@clack/prompts)
|
|
121
|
+
bridge.ts, autoRoute.ts arranque compartido del puente y lógica de selección automática de universo/dispositivo único
|
|
122
|
+
routeCommands.ts `route add/list/remove` — gestión de rutas automatizable
|
|
123
|
+
serviceInstall.ts generación de unidades systemd/launchd
|
|
124
|
+
doctor.ts, configDir.ts comprobaciones de salud de la configuración + resolución del directorio de configuración
|
|
125
|
+
|
|
126
|
+
shared/ Código compartido entre la GUI y la CLI
|
|
127
|
+
types.ts RouteConfig, UsbDevice, y el resto de la superficie de tipos compartida
|
|
128
|
+
store.ts, portableConfig.ts el propio archivo de configuración + la regla de directorio portátil frente a por usuario
|
|
129
|
+
|
|
130
|
+
scripts/build-standalone.mjs el pipeline de distribución de archivo único (esbuild + @yao-pkg/pkg + electron-builder)
|
|
131
|
+
scripts/embed-win-resources.mjs incrusta un icono + metadatos de versión en el .exe de la CLI de Windows (mediante resedit)
|
|
132
|
+
src/ Renderer de la GUI en React + Tailwind, incluyendo src/locales/ para los 5 idiomas soportados
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Contribuir
|
|
136
|
+
|
|
137
|
+
Los issues y pull requests son bienvenidos. Antes de abrir un PR, asegúrate de que `npm test` y `npm run typecheck` pasen correctamente.
|
|
138
|
+
|
|
139
|
+
## Licencia
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Parte del ecosistema de control de iluminación [Relackout](https://relackout.com).
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.fr.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="src/public/logo.svg" alt="Relackout ArtNet 2 USB" width="96" height="96">
|
|
4
|
+
|
|
5
|
+
# Relackout ArtNet 2 USB
|
|
6
|
+
|
|
7
|
+
**Un pont Art-Net → USB DMX gratuit et ciblé, avec une interface graphique de bureau et une CLI sans interface.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Téléchargement](https://relackout.com/usb-dmx) · [Utilisation de la CLI](#cli-usage) · [Compilation depuis les sources](#building-from-source) · [Architecture](#architecture)
|
|
14
|
+
|
|
15
|
+
[English](README.md) · [Türkçe](README.tr.md) · [Deutsch](README.de.md) · [Español](README.es.md) · **Français** · [Italiano](README.it.md) · [Português](README.pt-BR.md) · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Qu'est-ce que c'est ?
|
|
22
|
+
|
|
23
|
+
La plupart des logiciels d'éclairage communiquent en **Art-Net** sur le réseau, mais de nombreuses interfaces USB DMX — le DMX USB Pro d'Enttec (et ses compatibles), les dongles génériques Open DMX / FTDI — ont encore besoin d'un appareil sur le bureau pour recevoir ce signal réseau et le renvoyer en USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** est exactement cela : un petit pont ciblé que vous laissez tourner en arrière-plan. Il ne coûte rien, ne nécessite aucun compte, et a été conçu pour faciliter le travail avec tout l'écosystème Art-Net — y compris les consoles et logiciels qui ne sont pas [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
Il est disponible sous deux formes :
|
|
28
|
+
- **Une interface graphique de bureau** — découverte automatique, aperçu en direct des 512 canaux et table de routage visuelle.
|
|
29
|
+
- **Une CLI sans interface** (`artnet2usb-cli`) — exactement le même moteur de routage, sans aucune interface, conçue pour un Raspberry Pi caché derrière un pont, un serveur en coulisses sans écran, ou pour scripter l'intégralité d'une installation avant un spectacle. Les deux lisent et écrivent le **même fichier de configuration**, ce qui permet de construire des routes dans l'interface graphique et de les exécuter en mode sans interface, ou inversement.
|
|
30
|
+
|
|
31
|
+
## Fonctionnalités
|
|
32
|
+
|
|
33
|
+
- **Découverte automatique** — écoute passivement le port UDP 6454 et liste chaque univers Art-Net diffusé sur le réseau, avec l'IP source et un débit d'images en direct ; le balayage de nœuds `ArtPoll`/`ArtPollReply` détecte les appareils qui ne diffusent pas encore de DMX.
|
|
34
|
+
- **Aperçu des canaux en direct** — observez la mise à jour en temps réel des 512 canaux de n'importe quel univers découvert, avant même de router quoi que ce soit.
|
|
35
|
+
- **Table de routage visuelle** — chaque ligne est une règle : univers Art-Net → appareil USB + protocole + fréquence de rafraîchissement (1 à 44 Hz).
|
|
36
|
+
- **Deux protocoles** — Enttec DMX USB Pro (et ses clones compatibles au niveau du firmware) et sortie brute Open DMX / FTDI.
|
|
37
|
+
- **Identité persistante des appareils** — les interfaces USB sont mémorisées par leur identité matérielle (identifiant fournisseur, identifiant produit, numéro de série), et non par leur chemin de port système. Renommez un appareil une seule fois : le nom et ses routes survivent au débranchement et au déplacement vers un autre port.
|
|
38
|
+
- **Décalage de patch de canaux** — compense l'adresse de départ DMX propre à un projecteur ou une numérotation de canaux différente sur une console, par route (`-511..511`). L'univers est décalé **circulairement** au sein de ses 512 canaux — aucune donnée de canal n'est jamais perdue, elle boucle simplement.
|
|
39
|
+
- **Comportement en cas de perte de signal** — choisissez si la sortie conserve la dernière image ou passe au noir lorsque la source Art-Net disparaît.
|
|
40
|
+
- **Configuration portable** — s'exécute depuis une clé USB sans aucune installation ; voir [Configuration portable](#portable-config) ci-dessous.
|
|
41
|
+
- **5 langues dans l'interface graphique** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Téléchargement
|
|
44
|
+
|
|
45
|
+
Des binaires précompilés, en fichier unique et sans installateur, pour Windows, macOS et Linux (y compris Raspberry Pi pour la CLI) sont disponibles sur **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** et sur la page des [Releases GitHub](../../releases).
|
|
46
|
+
|
|
47
|
+
| | Fichier | Remarques |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portable — aucun installateur, il suffit de l'exécuter. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Glisser-déposer, aucun installateur. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` puis exécuter. |
|
|
52
|
+
| CLI · toutes plateformes | `artnet2usb-cli-<ver>-<platform>[.exe]` | Un véritable binaire autonome — Node.js n'est pas requis. Couvre macOS (arm64/x64), Linux (x64/arm64/armv7l — y compris Raspberry Pi) et Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Binaires non signés.** Les versions publiées ne sont pas signées. Au premier lancement, macOS nécessite un *clic droit → Ouvrir*, et Windows SmartScreen nécessite *Informations complémentaires → Exécuter quand même*.
|
|
55
|
+
|
|
56
|
+
## Utilisation de la CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # no args → interactive terminal wizard
|
|
60
|
+
artnet2usb-cli --help # full command reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Commande | Ce qu'elle fait |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Assistant interactif pour ajouter/supprimer des routes et démarrer le pont si besoin. |
|
|
66
|
+
| `auto` | Détecte automatiquement un univers Art-Net et un appareil USB uniques, enregistre la route et la démarre (`--no-start` pour ne pas la démarrer). |
|
|
67
|
+
| `run` | Démarre le pont à partir des routes enregistrées et l'exécute jusqu'à l'arrêt (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Gère les routes de façon non interactive — scriptable depuis un script shell ou un playbook Ansible. |
|
|
69
|
+
| `list-ports` | Liste les appareils série USB connectés. |
|
|
70
|
+
| `list-nodes` | Écoute les nœuds Art-Net sur le réseau (~3 s) et les liste. |
|
|
71
|
+
| `doctor` | Signale les appareils déconnectés, les routes en conflit et les réglages hors limites dans la configuration enregistrée. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Génère (et affiche, sans jamais l'appliquer silencieusement) une unité systemd (Linux) ou un agent launchd (macOS) afin que le pont redémarre automatiquement après un redémarrage ou un plantage. |
|
|
73
|
+
|
|
74
|
+
Configuration sans interface en une seule commande sur une machine disposant d'exactement un univers Art-Net et une interface USB DMX :
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Chaque commande accepte `--config <dir>` pour pointer vers un répertoire de configuration spécifique, et `run`/`auto` acceptent `--json` pour émettre un statut au format JSON délimité par des retours à la ligne plutôt qu'un texte lisible par un humain (pratique pour superviser le processus depuis un autre script).
|
|
81
|
+
|
|
82
|
+
## Configuration portable
|
|
83
|
+
|
|
84
|
+
L'application recherche d'abord `config.json` à côté de l'exécutable, afin de pouvoir voyager sur une clé USB entre plusieurs machines. Si ce répertoire n'est pas accessible en écriture (par exemple à cause de la « translocation d'application » de Gatekeeper pour une app macOS non signée), elle se rabat sur le répertoire de configuration standard par utilisateur du système d'exploitation. L'interface graphique et la CLI partagent exactement le même `config.json` lorsqu'elles sont exécutées depuis le même dossier — construisez des routes visuellement, puis exécutez-les sans interface, ou inversement.
|
|
85
|
+
|
|
86
|
+
## Compilation depuis les sources
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev # GUI, electron-vite dev server
|
|
91
|
+
npm test # unit tests (parser, framing, device uid, config)
|
|
92
|
+
npm run typecheck # tsc --noEmit
|
|
93
|
+
npm run dist # package the GUI for the host platform (electron-builder)
|
|
94
|
+
npm run dev:cli # run the CLI from source (tsx)
|
|
95
|
+
npm run build:cli # compile the CLI to dist-cli/
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Compilations autonomes, fichier unique
|
|
99
|
+
|
|
100
|
+
Toutes les sorties autonomes sont générées dans `dist-standalone/` ; chaque artefact est un fichier unique, sans rien à installer :
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run dist:standalone # host platform: GUI + CLI
|
|
104
|
+
node scripts/build-standalone.mjs --cli --all-targets # CLI: every platform in one pass
|
|
105
|
+
node scripts/build-standalone.mjs --gui --mac --win # GUI: selected platforms only
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
La CLI est empaquetée avec `esbuild` puis transformée en véritables binaires avec [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (aucun Node.js requis pour les exécuter) ; l'interface graphique est empaquetée avec `electron-builder`.
|
|
109
|
+
|
|
110
|
+
## Architecture
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
app/ Electron main process
|
|
114
|
+
artnet.ts Art-Net listener/parser — no external protocol library, hand-rolled to spec
|
|
115
|
+
dmxOutput.ts output engine + protocol drivers (Enttec Pro, Open DMX), via `serialport`
|
|
116
|
+
store.ts device names / routes / settings, portable-config-first
|
|
117
|
+
main.ts, preload.ts Electron app lifecycle + the IPC bridge exposed to the renderer
|
|
118
|
+
|
|
119
|
+
cli/ Headless CLI (compiles separately, see tsconfig.cli.json)
|
|
120
|
+
index.ts command definitions (commander) + the interactive wizard (@clack/prompts)
|
|
121
|
+
bridge.ts, autoRoute.ts shared bridge start-up and single-universe/device auto-pick logic
|
|
122
|
+
routeCommands.ts `route add/list/remove` — scriptable route management
|
|
123
|
+
serviceInstall.ts systemd/launchd unit generation
|
|
124
|
+
doctor.ts, configDir.ts config health checks + config-directory resolution
|
|
125
|
+
|
|
126
|
+
shared/ Code shared between the GUI and the CLI
|
|
127
|
+
types.ts RouteConfig, UsbDevice, and the rest of the shared type surface
|
|
128
|
+
store.ts, portableConfig.ts the config file itself + the portable-vs-per-user directory rule
|
|
129
|
+
|
|
130
|
+
scripts/build-standalone.mjs the single-file distribution pipeline (esbuild + @yao-pkg/pkg + electron-builder)
|
|
131
|
+
scripts/embed-win-resources.mjs embeds an icon + version metadata into the Windows CLI .exe (via resedit)
|
|
132
|
+
src/ React + Tailwind renderer (GUI), including src/locales/ for the 5 supported languages
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Contribution
|
|
136
|
+
|
|
137
|
+
Les issues et les pull requests sont les bienvenues. Avant d'ouvrir une PR, assurez-vous que `npm test` et `npm run typecheck` passent tous les deux.
|
|
138
|
+
|
|
139
|
+
## Licence
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Fait partie de l'écosystème de contrôle d'éclairage [Relackout](https://relackout.com).
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.it.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="src/public/logo.svg" alt="Relackout ArtNet 2 USB" width="96" height="96">
|
|
4
|
+
|
|
5
|
+
# Relackout ArtNet 2 USB
|
|
6
|
+
|
|
7
|
+
**Un bridge Art-Net → USB DMX gratuito e mirato, con GUI desktop e CLI headless.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Download](https://relackout.com/usb-dmx) · [Uso della CLI](#cli-usage) · [Compilazione dai sorgenti](#building-from-source) · [Architettura](#architecture)
|
|
14
|
+
|
|
15
|
+
[English](README.md) · [Türkçe](README.tr.md) · [Deutsch](README.de.md) · [Español](README.es.md) · [Français](README.fr.md) · **Italiano** · [Português](README.pt-BR.md) · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Cos'è
|
|
22
|
+
|
|
23
|
+
La maggior parte dei software di illuminazione parla **Art-Net** in rete, ma molte interfacce USB DMX — il DMX USB Pro di Enttec (e i suoi compatibili), i dongle generici Open DMX / FTDI — hanno ancora bisogno di qualcosa sulla scrivania che riceva quel segnale di rete e lo inoltri via USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** è esattamente questo: un bridge piccolo e mirato che tieni in esecuzione in background. Non costa nulla, non richiede un account, ed è pensato per rendere l'intero ecosistema Art-Net più semplice da usare — comprese le console e i software che non sono [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
Viene distribuito in due modalità:
|
|
28
|
+
- **Una GUI desktop** — auto-discovery, un'anteprima live a 512 canali e una tabella di routing visuale.
|
|
29
|
+
- **Una CLI headless** (`artnet2usb-cli`) — lo stesso identico motore di routing, senza interfaccia grafica, pensata per un Raspberry Pi dietro un traliccio, un server backstage senza monitor, o per scriptare un intero rig prima di uno spettacolo. Entrambe leggono e scrivono lo **stesso file di configurazione**, quindi puoi costruire i routing nella GUI ed eseguirli in headless, o viceversa.
|
|
30
|
+
|
|
31
|
+
## Funzionalità
|
|
32
|
+
|
|
33
|
+
- **Auto-discovery** — resta in ascolto passivo su UDP 6454 ed elenca ogni universo Art-Net trasmesso sulla rete, con IP sorgente e frame-rate letto in tempo reale; la scansione dei nodi `ArtPoll`/`ArtPollReply` individua anche i dispositivi che non trasmettono ancora DMX.
|
|
34
|
+
- **Anteprima live dei canali** — osserva in tempo reale tutti i 512 canali di qualsiasi universo rilevato, prima ancora di configurare un routing.
|
|
35
|
+
- **Tabella di routing visuale** — ogni riga è una regola: universo Art-Net → dispositivo USB + protocollo + frequenza di aggiornamento (1–44 Hz).
|
|
36
|
+
- **Due protocolli** — Enttec DMX USB Pro (e i cloni compatibili a livello firmware) e output Open DMX / FTDI grezzo.
|
|
37
|
+
- **Identità persistente del dispositivo** — le interfacce USB vengono riconosciute dalla loro identità hardware (vendor ID, product ID, numero di serie), non dal percorso della porta del sistema operativo. Rinomina un dispositivo una sola volta: il nome e i suoi routing sopravvivono anche se viene scollegato e spostato su un'altra porta.
|
|
38
|
+
- **Offset di patch dei canali** — compensa l'indirizzo DMX iniziale di un fixture o una numerazione dei canali diversa su una console, per ogni singolo routing (`-511..511`). L'universo viene spostato in modo **circolare** all'interno dei suoi 512 canali — nessun dato di canale viene mai perso, semplicemente ricomincia dall'altro capo.
|
|
39
|
+
- **Comportamento in caso di perdita del segnale** — scegli se l'output mantiene l'ultimo frame oppure va a nero quando la sorgente Art-Net scompare.
|
|
40
|
+
- **Configurazione portatile** — funziona da una chiavetta USB senza alcuna installazione; vedi [Configurazione portatile](#portable-config) più sotto.
|
|
41
|
+
- **5 lingue nella GUI** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Download
|
|
44
|
+
|
|
45
|
+
Binari precompilati, a file singolo e senza installer per Windows, macOS e Linux (incluso Raspberry Pi per la CLI) sono disponibili su **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** e nella pagina [GitHub Releases](../../releases).
|
|
46
|
+
|
|
47
|
+
| | File | Note |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portabile — nessun installer, basta eseguirlo. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Trascina e rilascia, nessun installer. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` ed esegui. |
|
|
52
|
+
| CLI · tutte le piattaforme | `artnet2usb-cli-<ver>-<platform>[.exe]` | Un vero binario standalone — non serve Node.js. Copre macOS (arm64/x64), Linux (x64/arm64/armv7l — incluso Raspberry Pi) e Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Build non firmate.** Le release non sono firmate digitalmente. Al primo avvio, macOS richiede *tasto destro → Apri*, mentre Windows SmartScreen richiede *Ulteriori informazioni → Esegui comunque*.
|
|
55
|
+
|
|
56
|
+
## Uso della CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # nessun argomento → wizard interattivo da terminale
|
|
60
|
+
artnet2usb-cli --help # riferimento completo dei comandi
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Comando | Cosa fa |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Wizard interattivo per aggiungere/rimuovere routing e, facoltativamente, avviare il bridge. |
|
|
66
|
+
| `auto` | Rileva automaticamente un singolo universo Art-Net e dispositivo USB, salva il routing e lo avvia (`--no-start` per non avviarlo). |
|
|
67
|
+
| `run` | Avvia il bridge usando i routing salvati ed esegue finché non viene fermato (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Gestisce i routing in modo non interattivo — scriptabile da uno shell script o da un playbook Ansible. |
|
|
69
|
+
| `list-ports` | Elenca i dispositivi seriali USB collegati. |
|
|
70
|
+
| `list-nodes` | Resta in ascolto dei nodi Art-Net sulla rete (~3s) e li elenca. |
|
|
71
|
+
| `doctor` | Segnala dispositivi scollegati, routing in conflitto e impostazioni fuori intervallo nella configurazione salvata. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Genera (e stampa a video, senza mai applicarla in silenzio) un'unità systemd (Linux) o un agente launchd (macOS) in modo che il bridge si riavvii automaticamente dopo un riavvio del sistema o un crash. |
|
|
73
|
+
|
|
74
|
+
Configurazione headless in un solo comando su una macchina con esattamente un universo Art-Net e un'interfaccia USB DMX:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Ogni comando accetta `--config <dir>` per puntare a una specifica directory di configurazione, e `run`/`auto` accettano `--json` per emettere lo stato come JSON delimitato da newline invece che come testo leggibile (comodo per supervisionare il processo da un altro script).
|
|
81
|
+
|
|
82
|
+
## Configurazione portatile
|
|
83
|
+
|
|
84
|
+
L'app cerca prima `config.json` accanto all'eseguibile, così può viaggiare su una chiavetta USB tra diverse macchine. Se quella directory non è scrivibile (ad esempio a causa della "app translocation" di Gatekeeper per un'app macOS non firmata), l'app ricade sulla directory di configurazione per-utente standard del sistema operativo. La GUI e la CLI condividono esattamente lo stesso `config.json` quando vengono eseguite dalla stessa cartella — costruisci i routing visualmente, poi eseguili in headless, o viceversa.
|
|
85
|
+
|
|
86
|
+
## Compilazione dai sorgenti
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev # GUI, electron-vite dev server
|
|
91
|
+
npm test # test unitari (parser, framing, device uid, config)
|
|
92
|
+
npm run typecheck # tsc --noEmit
|
|
93
|
+
npm run dist # pacchettizza la GUI per la piattaforma host (electron-builder)
|
|
94
|
+
npm run dev:cli # esegue la CLI dai sorgenti (tsx)
|
|
95
|
+
npm run build:cli # compila la CLI in dist-cli/
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Build standalone a file singolo
|
|
99
|
+
|
|
100
|
+
Tutti gli output standalone finiscono in `dist-standalone/`; ogni artefatto è un unico file, senza nulla da installare:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run dist:standalone # piattaforma host: GUI + CLI
|
|
104
|
+
node scripts/build-standalone.mjs --cli --all-targets # CLI: ogni piattaforma in un solo passaggio
|
|
105
|
+
node scripts/build-standalone.mjs --gui --mac --win # GUI: solo le piattaforme selezionate
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
La CLI viene impacchettata con `esbuild` e trasformata in binari veri e propri con [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (non serve Node.js per eseguirli); la GUI viene pacchettizzata con `electron-builder`.
|
|
109
|
+
|
|
110
|
+
## Architettura
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
app/ Processo main di Electron
|
|
114
|
+
artnet.ts Listener/parser Art-Net — nessuna libreria di protocollo esterna, scritto a mano seguendo la spec
|
|
115
|
+
dmxOutput.ts motore di output + driver di protocollo (Enttec Pro, Open DMX), tramite `serialport`
|
|
116
|
+
store.ts nomi dispositivi / routing / impostazioni, con priorità alla configurazione portatile
|
|
117
|
+
main.ts, preload.ts ciclo di vita dell'app Electron + il bridge IPC esposto al renderer
|
|
118
|
+
|
|
119
|
+
cli/ CLI headless (compilata separatamente, vedi tsconfig.cli.json)
|
|
120
|
+
index.ts definizioni dei comandi (commander) + wizard interattivo (@clack/prompts)
|
|
121
|
+
bridge.ts, autoRoute.ts logica condivisa di avvio del bridge e di auto-selezione singolo universo/dispositivo
|
|
122
|
+
routeCommands.ts `route add/list/remove` — gestione scriptabile dei routing
|
|
123
|
+
serviceInstall.ts generazione dell'unità systemd/launchd
|
|
124
|
+
doctor.ts, configDir.ts controlli di salute della configurazione + risoluzione della directory di configurazione
|
|
125
|
+
|
|
126
|
+
shared/ Codice condiviso tra GUI e CLI
|
|
127
|
+
types.ts RouteConfig, UsbDevice, e il resto della superficie dei tipi condivisi
|
|
128
|
+
store.ts, portableConfig.ts il file di configurazione stesso + la regola portatile-vs-per-utente per la directory
|
|
129
|
+
|
|
130
|
+
scripts/build-standalone.mjs la pipeline di distribuzione a file singolo (esbuild + @yao-pkg/pkg + electron-builder)
|
|
131
|
+
scripts/embed-win-resources.mjs incorpora un'icona + metadati di versione nell'.exe della CLI Windows (tramite resedit)
|
|
132
|
+
src/ Renderer React + Tailwind (GUI), incluso src/locales/ per le 5 lingue supportate
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Contribuire
|
|
136
|
+
|
|
137
|
+
Issue e pull request sono benvenute. Prima di aprire una PR, assicurati che `npm test` e `npm run typecheck` passino entrambi.
|
|
138
|
+
|
|
139
|
+
## Licenza
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Parte dell'ecosistema di controllo luci [Relackout](https://relackout.com).
|
|
148
|
+
|
|
149
|
+
</div>
|