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/README.ja.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
|
+
**無料でシンプルな Art-Net → USB DMX ブリッジ。デスクトップ GUI とヘッドレス CLI を備えています。**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[ダウンロード](https://relackout.com/usb-dmx) · [CLI の使い方](#cli-usage) · [ソースからのビルド](#building-from-source) · [アーキテクチャ](#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](README.it.md) · [Português](README.pt-BR.md) · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · **日本語**
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## これは何ですか?
|
|
22
|
+
|
|
23
|
+
多くの照明制御ソフトウェアはネットワーク経由で **Art-Net** を使用しますが、Enttec の DMX USB Pro(および互換機)や汎用の Open DMX / FTDI ドングルなど、多くの USB DMX インターフェースは、そのネットワーク信号を受信して USB 経由で出力するための何かを、依然として手元に必要としています。
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** はまさにそのためのツールです。バックグラウンドで動かし続ける、小さく用途を絞ったブリッジです。無料で、アカウント登録も不要。[Relackout](https://relackout.com) 以外のコンソールやソフトウェアも含め、Art-Net エコシステム全体を扱いやすくすることを目的として作られています。
|
|
26
|
+
|
|
27
|
+
提供形態は2つあります。
|
|
28
|
+
- **デスクトップ GUI** — 自動検出、512 チャンネルのライブプレビュー、視覚的なルーティングテーブルを備えています。
|
|
29
|
+
- **ヘッドレス CLI**(`artnet2usb-cli`) — GUI とまったく同じルーティングエンジンを、UI なしで提供します。トラスの裏に隠れた Raspberry Pi、モニターのないバックステージサーバー、あるいは本番前に照明システム全体をスクリプトで組み上げる用途を想定しています。GUI と CLI はどちらも**同じ設定ファイル**を読み書きするため、GUI でルートを作成してヘッドレスで実行することも、その逆も可能です。
|
|
30
|
+
|
|
31
|
+
## 機能
|
|
32
|
+
|
|
33
|
+
- **自動検出** — UDP 6454 をパッシブに監視し、ネットワーク上でブロードキャストされているすべての Art-Net ユニバースを、送信元 IP とリアルタイムのフレームレート表示とともにリストアップします。`ArtPoll`/`ArtPollReply` によるノードスキャンにより、まだ DMX をブロードキャストしていないデバイスも検出できます。
|
|
34
|
+
- **ライブチャンネルプレビュー** — ルーティングを設定する前に、検出したユニバースの 512 チャンネルすべてがリアルタイムに更新される様子を確認できます。
|
|
35
|
+
- **視覚的なルーティングテーブル** — 各行が1つのルールです:Art-Net ユニバース → USB デバイス + プロトコル + リフレッシュレート(1〜44 Hz)。
|
|
36
|
+
- **2つのプロトコル** — Enttec DMX USB Pro(およびファームウェア互換のクローン)と、生の Open DMX / FTDI 出力に対応しています。
|
|
37
|
+
- **永続的なデバイス識別** — USB インターフェースは OS 上のポートパスではなく、ハードウェア識別情報(ベンダー ID、プロダクト ID、シリアル番号)で記憶されます。一度デバイスに名前を付ければ、抜き差しして別のポートに接続しても、その名前とルートはそのまま保持されます。
|
|
38
|
+
- **チャンネルパッチオフセット** — 機材固有の DMX 開始アドレスや、コンソール側と異なるチャンネル番号付けを、ルートごとに補正できます(`-511..511`)。ユニバースは 512 チャンネル内で**循環的に**シフトされるため、チャンネルデータが失われることはなく、端まで来ると折り返します。
|
|
39
|
+
- **信号ロス時の挙動** — Art-Net の送信元が失われた際に、出力が最後のフレームを保持し続けるか、ブラックアウトするかを選択できます。
|
|
40
|
+
- **ポータブル設定** — インストール不要で USB スティックから起動できます。詳しくは下記の[ポータブル設定](#portable-config)を参照してください。
|
|
41
|
+
- **GUI は5言語対応** — English、Deutsch、Français、Italiano、Türkçe。
|
|
42
|
+
|
|
43
|
+
## ダウンロード
|
|
44
|
+
|
|
45
|
+
Windows、macOS、Linux(CLI については Raspberry Pi を含む)向けの、ビルド済みでインストーラー不要な単一ファイルのバイナリを、**[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** および [GitHub Releases](../../releases) ページで配布しています。
|
|
46
|
+
|
|
47
|
+
| | ファイル | 備考 |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | ポータブル — インストーラー不要、実行するだけです。 |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | ドラッグ&ドロップ、インストーラー不要。 |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` を実行してから起動してください。 |
|
|
52
|
+
| CLI · 全プラットフォーム | `artnet2usb-cli-<ver>-<platform>[.exe]` | Node.js 不要の、正真正銘のスタンドアロンバイナリです。macOS(arm64/x64)、Linux(x64/arm64/armv7l — Raspberry Pi を含む)、Windows(x64)に対応しています。 |
|
|
53
|
+
|
|
54
|
+
> **署名されていないビルド。** リリースはコード署名されていません。初回起動時、macOS では*右クリック → 開く*、Windows の SmartScreen では*詳細情報 → 実行*が必要です。
|
|
55
|
+
|
|
56
|
+
## CLI の使い方
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # no args → interactive terminal wizard
|
|
60
|
+
artnet2usb-cli --help # full command reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| コマンド | 動作 |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | ルートの追加・削除を行うインタラクティブウィザード。必要に応じてブリッジを起動することもできます。 |
|
|
66
|
+
| `auto` | 単一の Art-Net ユニバースと USB デバイスを自動検出し、ルートを保存して起動します(起動をスキップするには `--no-start`)。 |
|
|
67
|
+
| `run` | 保存済みのルートを使ってブリッジを起動し、停止(`Ctrl+C`)するまで実行し続けます。 |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | 対話なしでルートを管理します — シェルスクリプトや Ansible Playbook からスクリプト実行可能です。 |
|
|
69
|
+
| `list-ports` | 接続中の USB シリアルデバイスを一覧表示します。 |
|
|
70
|
+
| `list-nodes` | ネットワーク上の Art-Net ノードを(約3秒間)待ち受けて一覧表示します。 |
|
|
71
|
+
| `doctor` | 保存済み設定内の、切断されたデバイス、競合するルート、範囲外の設定値を検出して警告します。 |
|
|
72
|
+
| `install-service` / `uninstall-service` | systemd ユニット(Linux)または launchd エージェント(macOS)を生成して表示します(黙って適用されることはありません)。これにより、再起動やクラッシュの後にブリッジが自動的に再起動するようになります。 |
|
|
73
|
+
|
|
74
|
+
Art-Net ユニバースと USB DMX インターフェースがそれぞれ1つだけのマシンでは、1コマンドでヘッドレスセットアップが完了します。
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
すべてのコマンドは、特定の設定ディレクトリを指定するための `--config <dir>` を受け付けます。また `run`/`auto` は、人間が読めるテキストの代わりに改行区切りの JSON ステータスを出力する `--json` を受け付けます(別のスクリプトからプロセスを監視する際に便利です)。
|
|
81
|
+
|
|
82
|
+
## ポータブル設定
|
|
83
|
+
|
|
84
|
+
アプリはまず実行ファイルと同じ場所にある `config.json` を探すため、USB スティックに入れてマシン間を持ち運ぶことができます。そのディレクトリに書き込めない場合(例えば、署名されていない macOS アプリに対する Gatekeeper の「app translocation」など)は、OS 標準のユーザーごとの設定ディレクトリにフォールバックします。同じフォルダーから実行すれば、GUI と CLI はまったく同じ `config.json` を共有します — GUI で視覚的にルートを組み立ててからヘッドレスで実行することも、その逆も可能です。
|
|
85
|
+
|
|
86
|
+
## ソースからのビルド
|
|
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
|
+
### スタンドアロンの単一ファイルビルド
|
|
99
|
+
|
|
100
|
+
スタンドアロン出力はすべて `dist-standalone/` に生成されます。各成果物はインストール不要の単一ファイルです。
|
|
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
|
+
CLI は `esbuild` でバンドルされ、[`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) によって実行可能な本物のバイナリにパッケージ化されます(実行に Node.js は不要です)。GUI は `electron-builder` でパッケージ化されます。
|
|
109
|
+
|
|
110
|
+
## アーキテクチャ
|
|
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
|
+
## コントリビューション
|
|
136
|
+
|
|
137
|
+
Issue や Pull Request を歓迎します。PR を開く前に、`npm test` と `npm run typecheck` の両方が通ることを確認してください。
|
|
138
|
+
|
|
139
|
+
## ライセンス
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
[Relackout](https://relackout.com) 照明制御エコシステムの一部です。
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.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
|
+
**A free, focused Art-Net → USB DMX bridge, with a desktop GUI and a headless CLI.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Download](https://relackout.com/usb-dmx) · [CLI usage](#cli-usage) · [Building from source](#building-from-source) · [Architecture](#architecture)
|
|
14
|
+
|
|
15
|
+
**English** · [Türkçe](README.tr.md) · [Deutsch](README.de.md) · [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
|
+
## What is this?
|
|
22
|
+
|
|
23
|
+
Most lighting software speaks **Art-Net** over the network, but a lot of USB DMX interfaces — Enttec's DMX USB Pro (and compatibles), generic Open DMX / FTDI dongles — still need something on the desk to receive that network signal and push it out over USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** is exactly that: a small, focused bridge you keep running in the background. It costs nothing, requires no account, and is built to make the whole Art-Net ecosystem easier to work with — including consoles and software that aren't [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
It ships two ways:
|
|
28
|
+
- **A desktop GUI** — auto-discovery, a live 512-channel preview, and a visual routing table.
|
|
29
|
+
- **A headless CLI** (`artnet2usb-cli`) — the exact same routing engine, zero UI, built for a Raspberry Pi behind a truss, a backstage server with no monitor, or scripting an entire rig ahead of a show. Both read and write the **same config file**, so you can build routes in the GUI and run them headless, or the other way around.
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
- **Auto-discovery** — passively listens on UDP 6454 and lists every Art-Net universe broadcasting on the network, with source IP and a live frame-rate readout; `ArtPoll`/`ArtPollReply` node scanning finds devices that don't broadcast DMX yet.
|
|
34
|
+
- **Live channel preview** — watch all 512 channels of any discovered universe update in real time, before you route anything.
|
|
35
|
+
- **Visual routing table** — each row is one rule: Art-Net universe → USB device + protocol + refresh rate (1–44 Hz).
|
|
36
|
+
- **Two protocols** — Enttec DMX USB Pro (and firmware-compatible clones) and raw Open DMX / FTDI output.
|
|
37
|
+
- **Persistent device identity** — USB interfaces are remembered by their hardware identity (vendor ID, product ID, serial number), not their OS port path. Rename a device once, and the name and its routes survive being unplugged and moved to a different port.
|
|
38
|
+
- **Channel patch offset** — compensate for a fixture's own DMX start address or a console's differing channel numbering, per route (`-511..511`). The universe is shifted **circularly** within its 512 channels — no channel data is ever dropped, it wraps around instead.
|
|
39
|
+
- **Signal-loss behavior** — choose whether output holds the last frame or blacks out when the Art-Net source disappears.
|
|
40
|
+
- **Portable config** — runs from a USB stick with zero installation; see [Portable config](#portable-config) below.
|
|
41
|
+
- **5 languages in the GUI** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Download
|
|
44
|
+
|
|
45
|
+
Prebuilt, single-file, no-installer binaries for Windows, macOS, and Linux (including Raspberry Pi for the CLI) are available at **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** and on the [GitHub Releases](../../releases) page.
|
|
46
|
+
|
|
47
|
+
| | File | Notes |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portable — no installer, just run it. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Drag & drop, no installer. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` and run. |
|
|
52
|
+
| CLI · all platforms | `artnet2usb-cli-<ver>-<platform>[.exe]` | A real standalone binary — no Node.js required. Covers macOS (arm64/x64), Linux (x64/arm64/armv7l — including Raspberry Pi), and Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Unsigned builds.** Releases aren't code-signed. On first launch, macOS requires *right-click → Open*, and Windows SmartScreen requires *More info → Run anyway*.
|
|
55
|
+
|
|
56
|
+
## CLI usage
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # no args → interactive terminal wizard
|
|
60
|
+
artnet2usb-cli --help # full command reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Command | What it does |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Interactive wizard to add/remove routes and optionally start the bridge. |
|
|
66
|
+
| `auto` | Auto-detect a single Art-Net universe and USB device, save the route, and start it (`--no-start` to skip starting). |
|
|
67
|
+
| `run` | Start the bridge using saved routes and run until stopped (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Manage routes non-interactively — scriptable from a shell script or an Ansible playbook. |
|
|
69
|
+
| `list-ports` | List connected USB serial devices. |
|
|
70
|
+
| `list-nodes` | Listen for Art-Net nodes on the network (~3s) and list them. |
|
|
71
|
+
| `doctor` | Flag disconnected devices, conflicting routes, and out-of-range settings in the saved config. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Generate (and print, never silently apply) a systemd unit (Linux) or a launchd agent (macOS) so the bridge restarts automatically after a reboot or a crash. |
|
|
73
|
+
|
|
74
|
+
One-command headless setup on a machine with exactly one Art-Net universe and one USB DMX interface:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Every command accepts `--config <dir>` to point at a specific config directory, and `run`/`auto` accept `--json` to emit newline-delimited JSON status instead of human-readable text (handy for supervising the process from another script).
|
|
81
|
+
|
|
82
|
+
## Portable config
|
|
83
|
+
|
|
84
|
+
The app looks for `config.json` next to the executable first, so it can travel on a USB stick between machines. If that directory isn't writable (e.g. Gatekeeper's "app translocation" for an unsigned macOS app), it falls back to the OS-standard per-user config directory. The GUI and the CLI share the exact same `config.json` when run from the same folder — build routes visually, then run them headless, or vice versa.
|
|
85
|
+
|
|
86
|
+
## Building from source
|
|
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
|
+
### Standalone, single-file builds
|
|
99
|
+
|
|
100
|
+
All standalone output lands in `dist-standalone/`; every artifact is a single file with nothing to install:
|
|
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
|
+
The CLI is bundled with `esbuild` and packaged into real binaries with [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (no Node.js needed to run them); the GUI is packaged with `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
|
+
## Contributing
|
|
136
|
+
|
|
137
|
+
Issues and pull requests are welcome. Before opening a PR, please make sure `npm test` and `npm run typecheck` both pass.
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Part of the [Relackout](https://relackout.com) lighting-control ecosystem.
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.pt-BR.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
|
+
**Uma ponte Art-Net → USB DMX gratuita e focada, com uma GUI para desktop e uma CLI headless.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Download](https://relackout.com/usb-dmx) · [Uso da CLI](#cli-usage) · [Compilando a partir do código-fonte](#building-from-source) · [Arquitetura](#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](README.it.md) · **Português** · [Русский](README.ru.md) · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## O que é isto?
|
|
22
|
+
|
|
23
|
+
A maioria dos softwares de iluminação fala **Art-Net** pela rede, mas muitas interfaces USB DMX — a DMX USB Pro da Enttec (e compatíveis), dongles genéricos Open DMX / FTDI — ainda precisam de algo na mesa para receber esse sinal de rede e enviá-lo via USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** é exatamente isso: uma ponte pequena e focada que fica rodando em segundo plano. Não custa nada, não exige conta e foi criada para tornar todo o ecossistema Art-Net mais fácil de usar — inclusive com mesas e softwares que não são [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
O produto é distribuído de duas formas:
|
|
28
|
+
- **Uma GUI para desktop** — descoberta automática, pré-visualização ao vivo de 512 canais e uma tabela de roteamento visual.
|
|
29
|
+
- **Uma CLI headless** (`artnet2usb-cli`) — exatamente o mesmo motor de roteamento, sem interface, feita para um Raspberry Pi atrás de uma treliça, um servidor de bastidores sem monitor, ou para automatizar toda a configuração de um rig antes de um show. Ambas leem e escrevem o **mesmo arquivo de configuração**, então você pode montar rotas na GUI e executá-las em modo headless, ou o contrário.
|
|
30
|
+
|
|
31
|
+
## Funcionalidades
|
|
32
|
+
|
|
33
|
+
- **Descoberta automática** — escuta passivamente na porta UDP 6454 e lista todo universo Art-Net que estiver transmitindo na rede, com IP de origem e uma leitura de taxa de quadros em tempo real; a varredura de nós via `ArtPoll`/`ArtPollReply` encontra dispositivos que ainda não transmitem DMX.
|
|
34
|
+
- **Pré-visualização de canais ao vivo** — acompanhe a atualização em tempo real de todos os 512 canais de qualquer universo descoberto, antes de rotear qualquer coisa.
|
|
35
|
+
- **Tabela de roteamento visual** — cada linha é uma regra: universo Art-Net → dispositivo USB + protocolo + taxa de atualização (1–44 Hz).
|
|
36
|
+
- **Dois protocolos** — Enttec DMX USB Pro (e clones compatíveis a nível de firmware) e saída bruta Open DMX / FTDI.
|
|
37
|
+
- **Identidade persistente do dispositivo** — as interfaces USB são reconhecidas pela sua identidade de hardware (vendor ID, product ID, número de série), não pelo caminho da porta do sistema operacional. Renomeie um dispositivo uma vez, e o nome e suas rotas sobrevivem a ser desconectado e movido para outra porta.
|
|
38
|
+
- **Offset de patch de canal** — compense o endereço DMX inicial de um fixture ou uma numeração de canais diferente em uma mesa, por rota (`-511..511`). O universo é deslocado **circularmente** dentro de seus 512 canais — nenhum dado de canal é perdido, ele simplesmente dá a volta.
|
|
39
|
+
- **Comportamento em caso de perda de sinal** — escolha se a saída mantém o último quadro ou apaga (blackout) quando a fonte Art-Net desaparece.
|
|
40
|
+
- **Configuração portátil** — roda a partir de um pendrive USB sem qualquer instalação; veja [Configuração portátil](#portable-config) abaixo.
|
|
41
|
+
- **5 idiomas na GUI** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Download
|
|
44
|
+
|
|
45
|
+
Binários pré-compilados, de arquivo único e sem instalador para Windows, macOS e Linux (incluindo Raspberry Pi para a CLI) estão disponíveis em **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** e na página de [GitHub Releases](../../releases).
|
|
46
|
+
|
|
47
|
+
| | Arquivo | Notas |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Portátil — sem instalador, apenas execute. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Arraste e solte, sem instalador. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | `chmod +x` e execute. |
|
|
52
|
+
| CLI · todas as plataformas | `artnet2usb-cli-<ver>-<platform>[.exe]` | Um binário standalone de verdade — não requer Node.js. Cobre macOS (arm64/x64), Linux (x64/arm64/armv7l — incluindo Raspberry Pi) e Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Builds não assinados.** As releases não são assinadas digitalmente (code-signed). Na primeira execução, o macOS exige *clique com o botão direito → Abrir*, e o SmartScreen do Windows exige *Mais informações → Executar assim mesmo*.
|
|
55
|
+
|
|
56
|
+
## Uso da CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # sem argumentos → assistente interativo de terminal
|
|
60
|
+
artnet2usb-cli --help # referência completa de comandos
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Comando | O que faz |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Assistente interativo para adicionar/remover rotas e, opcionalmente, iniciar a ponte. |
|
|
66
|
+
| `auto` | Detecta automaticamente um único universo Art-Net e dispositivo USB, salva a rota e a inicia (`--no-start` para pular a inicialização). |
|
|
67
|
+
| `run` | Inicia a ponte usando as rotas salvas e continua rodando até ser interrompida (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Gerencia rotas de forma não interativa — automatizável a partir de um script de shell ou de um playbook do Ansible. |
|
|
69
|
+
| `list-ports` | Lista os dispositivos seriais USB conectados. |
|
|
70
|
+
| `list-nodes` | Escuta a rede em busca de nós Art-Net (~3s) e os lista. |
|
|
71
|
+
| `doctor` | Sinaliza dispositivos desconectados, rotas conflitantes e configurações fora do intervalo permitido no arquivo de configuração salvo. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Gera (e exibe, nunca aplica silenciosamente) uma unit do systemd (Linux) ou um agente launchd (macOS) para que a ponte reinicie automaticamente após uma reinicialização do sistema ou uma falha. |
|
|
73
|
+
|
|
74
|
+
Configuração headless com um único comando em uma máquina com exatamente um universo Art-Net e uma interface USB DMX:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Todo comando aceita `--config <dir>` para apontar para um diretório de configuração específico, e `run`/`auto` aceitam `--json` para emitir status em JSON delimitado por novas linhas em vez de texto legível para humanos (útil para supervisionar o processo a partir de outro script).
|
|
81
|
+
|
|
82
|
+
## Configuração portátil
|
|
83
|
+
|
|
84
|
+
O aplicativo procura primeiro por `config.json` ao lado do executável, para que possa viajar em um pendrive USB entre máquinas. Se esse diretório não for gravável (por exemplo, devido à "translocação de app" do Gatekeeper para um app macOS não assinado), ele recorre ao diretório de configuração padrão do sistema operacional por usuário. A GUI e a CLI compartilham exatamente o mesmo `config.json` quando executadas a partir da mesma pasta — monte rotas visualmente e depois as execute em modo headless, ou vice-versa.
|
|
85
|
+
|
|
86
|
+
## Compilando a partir do código-fonte
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev # GUI, servidor de desenvolvimento electron-vite
|
|
91
|
+
npm test # testes unitários (parser, framing, device uid, config)
|
|
92
|
+
npm run typecheck # tsc --noEmit
|
|
93
|
+
npm run dist # empacota a GUI para a plataforma hospedeira (electron-builder)
|
|
94
|
+
npm run dev:cli # executa a CLI a partir do código-fonte (tsx)
|
|
95
|
+
npm run build:cli # compila a CLI para dist-cli/
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Builds standalone de arquivo único
|
|
99
|
+
|
|
100
|
+
Toda a saída standalone fica em `dist-standalone/`; cada artefato é um arquivo único, sem nada para instalar:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run dist:standalone # plataforma hospedeira: GUI + CLI
|
|
104
|
+
node scripts/build-standalone.mjs --cli --all-targets # CLI: todas as plataformas em uma única execução
|
|
105
|
+
node scripts/build-standalone.mjs --gui --mac --win # GUI: apenas as plataformas selecionadas
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
A CLI é empacotada com `esbuild` e transformada em binários reais com [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (não é necessário Node.js para executá-los); a GUI é empacotada com `electron-builder`.
|
|
109
|
+
|
|
110
|
+
## Arquitetura
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
app/ Processo principal do Electron
|
|
114
|
+
artnet.ts Listener/parser Art-Net — sem biblioteca de protocolo externa, implementado à mão seguindo a spec
|
|
115
|
+
dmxOutput.ts motor de saída + drivers de protocolo (Enttec Pro, Open DMX), via `serialport`
|
|
116
|
+
store.ts nomes de dispositivos / rotas / configurações, com prioridade à configuração portátil
|
|
117
|
+
main.ts, preload.ts ciclo de vida do app Electron + a ponte IPC exposta ao renderer
|
|
118
|
+
|
|
119
|
+
cli/ CLI headless (compilada separadamente, veja tsconfig.cli.json)
|
|
120
|
+
index.ts definições de comandos (commander) + o assistente interativo (@clack/prompts)
|
|
121
|
+
bridge.ts, autoRoute.ts lógica compartilhada de inicialização da ponte e seleção automática de universo/dispositivo único
|
|
122
|
+
routeCommands.ts `route add/list/remove` — gerenciamento de rotas automatizável por script
|
|
123
|
+
serviceInstall.ts geração de unit systemd/launchd
|
|
124
|
+
doctor.ts, configDir.ts verificações de saúde da configuração + resolução do diretório de configuração
|
|
125
|
+
|
|
126
|
+
shared/ Código compartilhado entre a GUI e a CLI
|
|
127
|
+
types.ts RouteConfig, UsbDevice, e o restante da superfície de tipos compartilhada
|
|
128
|
+
store.ts, portableConfig.ts o próprio arquivo de configuração + a regra de diretório portátil-vs-por-usuário
|
|
129
|
+
|
|
130
|
+
scripts/build-standalone.mjs o pipeline de distribuição de arquivo único (esbuild + @yao-pkg/pkg + electron-builder)
|
|
131
|
+
scripts/embed-win-resources.mjs incorpora um ícone + metadados de versão no .exe da CLI do Windows (via resedit)
|
|
132
|
+
src/ Renderer da GUI em React + Tailwind, incluindo src/locales/ para os 5 idiomas suportados
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Contribuindo
|
|
136
|
+
|
|
137
|
+
Issues e pull requests são bem-vindos. Antes de abrir um PR, certifique-se de que `npm test` e `npm run typecheck` passem sem erros.
|
|
138
|
+
|
|
139
|
+
## Licença
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Parte do ecossistema de controle de iluminação [Relackout](https://relackout.com).
|
|
148
|
+
|
|
149
|
+
</div>
|
package/README.ru.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
|
+
**Бесплатный, узкоспециализированный мост Art-Net → USB DMX с настольным GUI и headless CLI.**
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](#download)
|
|
11
|
+
[](package.json)
|
|
12
|
+
|
|
13
|
+
[Скачать](https://relackout.com/usb-dmx) · [Использование CLI](#cli-usage) · [Сборка из исходного кода](#building-from-source) · [Архитектура](#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](README.it.md) · [Português](README.pt-BR.md) · **Русский** · [简体中文](README.zh-Hans.md) · [日本語](README.ja.md)
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Что это такое?
|
|
22
|
+
|
|
23
|
+
Большинство программ управления освещением работают по сети через протокол **Art-Net**, но многим USB DMX-интерфейсам — таким как Enttec DMX USB Pro (и совместимые устройства), а также обычным адаптерам Open DMX / FTDI — по-прежнему нужно что-то на рабочем столе, что принимало бы этот сетевой сигнал и передавало его дальше через USB.
|
|
24
|
+
|
|
25
|
+
**Relackout ArtNet 2 USB** — именно такой инструмент: небольшой узкоспециализированный мост, который просто работает в фоне. Он абсолютно бесплатен, не требует регистрации и создан для того, чтобы упростить работу со всей экосистемой Art-Net в целом — включая пульты и программы, не относящиеся к [Relackout](https://relackout.com).
|
|
26
|
+
|
|
27
|
+
Поставляется в двух вариантах:
|
|
28
|
+
- **Настольный GUI** — автоматическое обнаружение, живой предпросмотр 512 каналов и визуальная таблица маршрутизации.
|
|
29
|
+
- **Headless CLI** (`artnet2usb-cli`) — тот же самый движок маршрутизации, но без интерфейса, созданный для Raspberry Pi за фермой, серверов без монитора за кулисами или для написания скриптов, настраивающих всю установку перед шоу. Оба варианта читают и записывают **один и тот же файл конфигурации**, поэтому можно настроить маршруты в GUI и запускать их в headless-режиме — или наоборот.
|
|
30
|
+
|
|
31
|
+
## Возможности
|
|
32
|
+
|
|
33
|
+
- **Автоматическое обнаружение** — пассивно прослушивает UDP-порт 6454 и отображает список всех вселенных (universe) Art-Net, транслируемых в сети, с указанием IP-адреса источника и текущей частоты кадров в реальном времени; сканирование узлов через `ArtPoll`/`ArtPollReply` находит устройства, которые ещё не транслируют DMX.
|
|
34
|
+
- **Живой предпросмотр каналов** — наблюдайте за обновлением всех 512 каналов любой обнаруженной вселенной в реальном времени, ещё до настройки маршрутизации.
|
|
35
|
+
- **Визуальная таблица маршрутизации** — каждая строка представляет собой одно правило: вселенная Art-Net → USB-устройство + протокол + частота обновления (1–44 Гц).
|
|
36
|
+
- **Два протокола** — Enttec DMX USB Pro (и совместимые по прошивке клоны), а также прямой вывод Open DMX / FTDI.
|
|
37
|
+
- **Постоянная идентификация устройств** — USB-интерфейсы запоминаются по их аппаратному идентификатору (ID производителя, ID продукта, серийный номер), а не по пути порта в ОС. Один раз переименуйте устройство — и его имя, а также связанные с ним маршруты, сохранятся даже после отключения и подключения к другому порту.
|
|
38
|
+
- **Смещение патча каналов** — компенсируйте собственный стартовый DMX-адрес прибора или отличающуюся нумерацию каналов пульта, отдельно для каждого маршрута (`-511..511`). Вселенная сдвигается **циклически** в пределах своих 512 каналов — данные каналов никогда не теряются, а переносятся в начало/конец.
|
|
39
|
+
- **Поведение при потере сигнала** — выберите, должен ли вывод удерживать последний кадр или уходить в блэкаут при исчезновении источника Art-Net.
|
|
40
|
+
- **Портативная конфигурация** — запускается с USB-флешки без какой-либо установки; см. раздел [Портативная конфигурация](#portable-config) ниже.
|
|
41
|
+
- **5 языков интерфейса в GUI** — English, Deutsch, Français, Italiano, Türkçe.
|
|
42
|
+
|
|
43
|
+
## Скачать
|
|
44
|
+
|
|
45
|
+
Готовые однофайловые сборки, не требующие установки, для Windows, macOS и Linux (включая Raspberry Pi для CLI) доступны на **[relackout.com/usb-dmx](https://relackout.com/usb-dmx)** и на странице [GitHub Releases](../../releases).
|
|
46
|
+
|
|
47
|
+
| | Файл | Примечания |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| GUI · Windows | `Relackout-ArtNet2USB-<ver>-portable.exe` | Портативная версия — без установщика, просто запустите. |
|
|
50
|
+
| GUI · macOS | `Relackout-ArtNet2USB-<ver>-<arch>.dmg` | Перетащите и запустите, без установщика. |
|
|
51
|
+
| GUI · Linux | `Relackout-ArtNet2USB-<ver>-<arch>.AppImage` | Выполните `chmod +x` и запустите. |
|
|
52
|
+
| CLI · все платформы | `artnet2usb-cli-<ver>-<platform>[.exe]` | Полноценный автономный бинарный файл — Node.js не требуется. Поддерживаются macOS (arm64/x64), Linux (x64/arm64/armv7l — включая Raspberry Pi) и Windows (x64). |
|
|
53
|
+
|
|
54
|
+
> **Неподписанные сборки.** Релизы не подписаны цифровой подписью. При первом запуске в macOS потребуется *правый клик → Открыть*, а Windows SmartScreen потребует *Дополнительно → Выполнить в любом случае*.
|
|
55
|
+
|
|
56
|
+
## Использование CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx artnet2usb-cli # no args → interactive terminal wizard
|
|
60
|
+
artnet2usb-cli --help # full command reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Команда | Что она делает |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `configure` | Интерактивный мастер для добавления/удаления маршрутов и, при желании, запуска моста. |
|
|
66
|
+
| `auto` | Автоматически определяет единственную вселенную Art-Net и USB-устройство, сохраняет маршрут и запускает его (`--no-start`, чтобы пропустить запуск). |
|
|
67
|
+
| `run` | Запускает мост, используя сохранённые маршруты, и работает до остановки (`Ctrl+C`). |
|
|
68
|
+
| `route add` / `route list` / `route remove <id>` | Управление маршрутами без интерактивного режима — можно использовать в shell-скриптах или Ansible-плейбуках. |
|
|
69
|
+
| `list-ports` | Выводит список подключённых USB serial-устройств. |
|
|
70
|
+
| `list-nodes` | Прослушивает сеть на предмет узлов Art-Net (~3 с) и выводит их список. |
|
|
71
|
+
| `doctor` | Отмечает отключённые устройства, конфликтующие маршруты и настройки вне допустимого диапазона в сохранённой конфигурации. |
|
|
72
|
+
| `install-service` / `uninstall-service` | Генерирует (и выводит на экран, никогда не применяя молча) unit-файл systemd (Linux) или агент launchd (macOS), чтобы мост автоматически перезапускался после перезагрузки или сбоя. |
|
|
73
|
+
|
|
74
|
+
Настройка headless-режима одной командой на машине ровно с одной вселенной Art-Net и одним USB DMX-интерфейсом:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
artnet2usb-cli auto --protocol enttec-pro --hz 40
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Любая команда принимает флаг `--config <dir>` для указания конкретного каталога конфигурации, а `run`/`auto` также принимают флаг `--json`, чтобы выводить статус построчно в формате JSON вместо текста, читаемого человеком (удобно для наблюдения за процессом из другого скрипта).
|
|
81
|
+
|
|
82
|
+
## Портативная конфигурация
|
|
83
|
+
|
|
84
|
+
Приложение сначала ищет `config.json` рядом с исполняемым файлом, чтобы конфигурацию можно было переносить между машинами на USB-флешке. Если этот каталог недоступен для записи (например, из-за механизма «app translocation» Gatekeeper для неподписанных приложений macOS), приложение переключается на стандартный для ОС каталог конфигурации пользователя. GUI и CLI используют один и тот же файл `config.json`, если запускаются из одной и той же папки — можно визуально настроить маршруты, а затем запускать их в headless-режиме, или наоборот.
|
|
85
|
+
|
|
86
|
+
## Сборка из исходного кода
|
|
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
|
+
### Автономные однофайловые сборки
|
|
99
|
+
|
|
100
|
+
Все автономные сборки попадают в `dist-standalone/`; каждый артефакт представляет собой единый файл, не требующий установки:
|
|
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
|
+
CLI собирается с помощью `esbuild` и упаковывается в реальные бинарные файлы с помощью [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) (для их запуска Node.js не требуется); GUI упаковывается с помощью `electron-builder`.
|
|
109
|
+
|
|
110
|
+
## Архитектура
|
|
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
|
+
## Участие в разработке
|
|
136
|
+
|
|
137
|
+
Issues и pull request'ы приветствуются. Перед открытием PR, пожалуйста, убедитесь, что команды `npm test` и `npm run typecheck` выполняются без ошибок.
|
|
138
|
+
|
|
139
|
+
## Лицензия
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE) © Remana
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
<div align="center">
|
|
146
|
+
|
|
147
|
+
Часть экосистемы управления освещением [Relackout](https://relackout.com).
|
|
148
|
+
|
|
149
|
+
</div>
|