# led-controller LED controller web app for managing profiles, **zones**, presets, and colour palettes, and sending commands to LED devices. Outbound paths include: - **Serial → ESP-NOW bridge**: JSON lines over UART to an ESP32 that forwards ESP-NOW frames (configure `serial_port` and baud in `settings.json` / Settings model). - **Wi-Fi LED drivers**: TCP JSON lines (default port **8765** on the Pi; drivers discover the controller via **UDP 8766** broadcast). ## Run - One-time setup for port 80 without root: `sudo scripts/setup-port80.sh` - Start app: `pipenv run run` (override listen port with the **`PORT`** environment variable) - Dev watcher (auto-restart on `src/` changes): `pipenv run dev` - Regenerate **`docs/help.pdf`** from **`docs/help.md`**: `pipenv run help-pdf` (requires **pandoc** and **chromium** on the host) ## UI modes - **Run mode**: focused control view. Select zones/presets and apply profiles. Editing actions are hidden. - **Edit mode**: management view. Shows **Zones**, Presets, Patterns, Colour Palette, and Send Presets controls, plus per-tile preset edit/remove and drag-reorder. ## Profiles - Applying a profile updates session scope and refreshes the active zone content. - In **Run mode**, Profiles supports apply-only behaviour (no create/clone/delete). - In **Edit mode**, Profiles supports create/clone/delete. - Creating a profile always creates a populated `default` zone (starter presets). - Optional **DJ zone** seeding creates: - `dj` zone bound to device name `dj` - starter DJ presets (rainbow, single colour, transition) ## Preset colours and palette linking - In preset editor, selecting a colour picker value auto-adds it when the picker closes. - Use **From Palette** to add a palette-linked preset colour. - Linked colours are stored as palette references and shown with a `P` badge. - When profile palette colours change, linked preset colours update across that profile. ## API docs - Main API reference: `docs/API.md` ## Driver pattern modules Pattern **`.py`** sources live under **`led-driver/src/patterns`**. The Pi app resolves that path via `util.driver_patterns.driver_patterns_dir()`. If you deploy without that tree next to the app, set **`LED_CONTROLLER_PATTERNS_DIR`** to the directory that contains those files.