# LED controller — user guide This page describes the **main web UI** served from the Raspberry Pi app: profiles, tabs, presets, colour palettes, and sending commands to LED devices over the serial → ESP-NOW bridge. For HTTP routes and the wire format the driver expects, see **[API.md](API.md)**. For running the app locally, see the project **README**. Figures below are **schematic** (layout and ideas), not pixel-perfect screenshots. --- ## Run mode and Edit mode The header has a mode toggle (desktop and mobile menu). The **label on the button is the mode you switch to** when you press it. ![Schematic: tab buttons on the left; Profiles, Tabs, Presets, Patterns, and the mode toggle on the right (example shows Edit mode with “Run mode” on the button).](images/help/header-toolbar.svg) *The active tab is highlighted. Extra management buttons appear only in Edit mode.* | Mode | Purpose | |------|--------| | **Run mode** | Day-to-day control: choose a tab, tap presets, apply profiles. Management buttons are hidden. | | **Edit mode** | Full setup: tabs, presets, patterns, colour palette, **Send Presets**, profile create/clone/delete, preset reordering, and per-tile **Edit** on the strip. | **Profiles** is available in both modes: in Run mode you can only **apply** a profile; in Edit mode you can also **create**, **clone**, and **delete** profiles. --- ## Tabs - **Select a tab**: click its button in the top bar. The main area shows that tab’s preset strip and controls. - **Edit mode — open tab settings**: **right-click** a tab button to change its name, **device IDs** (comma-separated), and which presets appear on the tab. Device identifiers are matched to each device’s **name** when the app builds `select` messages for the driver. - **Tabs modal** (Edit mode): create new tabs from the header **Tabs** button. New tabs need a name and device ID list (defaults to `1` if you leave a simple placeholder). - **Brightness slider** (per tab): adjusts **global** brightness sent to devices (`b` in the driver message), with a short debounce so small drags do not flood the link. --- ## Presets on the tab strip - **Run and Edit mode**: click the **main part** of a preset tile to **select** that preset on all devices assigned to the current tab (same logical action as a `select` in the driver API). - **Edit mode only**: - **Edit** beside a tile opens the preset editor for that preset, scoped to the current tab (so you can **Remove from tab** without deleting the preset from the profile). - **Drag and drop** tiles to reorder them; order is saved for that tab. ![Schematic: tab title, brightness slider, and a row of preset tiles; Edit mode adds an Edit control and drag handles for reordering.](images/help/tab-preset-strip.svg) *The slider controls global brightness for the tab’s devices. Click the coloured area of a tile to select that preset.* The **Presets** header button (Edit mode) opens a **profile-wide** list: **Add** new presets, **Edit**, **Send** (push definition over the transport), and **Delete** (removes the preset from the profile entirely). --- ## Preset editor - **Pattern**: chosen from the dropdown; optional **n1–n8** fields depend on the pattern (see **Pattern-specific parameters** in [API.md](API.md)). - **Colours**: choosing a value in the colour picker **adds** a swatch when the picker closes. Swatches can be **reordered** by dragging. Changing a swatch with the picker **clears** palette linkage for that slot. - **From Palette**: inserts a colour **linked** to the current profile’s palette. Linked slots show a **P** badge; if you change that palette entry later, presets using it update. - **Brightness (0–255)** and **Delay (ms)**: stored on the preset and sent with the compact preset payload. - **Try**: sends the current form values to devices on the **current tab**, then selects that preset — **without** `save` on the device (good for auditioning). - **Default**: updates the tab’s **default preset** and sends a **default** hint for those devices; it does not force the same live selection behaviour as clicking a tile. - **Save & Send**: writes the preset to the server, then pushes definitions with **save** so devices may persist them. It does **not** auto-select the preset on devices (use the strip or **Try** if you want that). - **Remove from tab** (when you opened the editor from a tab): removes the preset from **this tab’s list only**; the preset remains in the profile for other tabs. ![Schematic: preset editor with name, pattern, colour swatches (one with a P badge for palette-linked), and action buttons.](images/help/preset-editor.svg) *Try previews without persisting on the device; **Save & Send** stores the preset and pushes definitions with save.* --- ## Profiles - **Apply**: sets the **current profile** in your session. Tabs and presets you see are scoped to that profile. - **Edit mode — Create**: new profiles always get a populated **default** tab. Optionally tick **DJ tab** to also create a `dj` tab (device name `dj`) with starter DJ-oriented presets. - **Clone** / **Delete**: available in Edit mode from the profile list. --- ## Send Presets (Edit mode) **Send Presets** walks **every tab** in the **current profile**, collects each tab’s preset IDs, and calls **`POST /presets/send`** per tab (including each tab’s **default** preset when set). Use this to bulk-push definitions to hardware after editing, without clicking **Send** on every preset individually. --- ## Patterns The **Patterns** dialog (Edit mode) is a **read-only reference**: pattern names and typical **delay** ranges from the pattern definitions. It does not change device behaviour by itself; patterns are chosen inside the preset editor. --- ## Colour palette **Colour Palette** (Edit mode) edits the **current profile’s** palette swatches. Those colours are reused by **From Palette** in the preset editor and stay in sync while the **P** link remains. ![Schematic: palette modal with a row of swatches for the current profile.](images/help/colour-palette.svg) *Add or change swatches here; linked preset colours update automatically.* --- ## Mobile layout On narrow screens, use **Menu** to reach the same actions as the desktop header (Profiles, Tabs, Presets, Help, mode toggle, etc.). ![Schematic: narrow layout with Menu and the same header actions in a dropdown.](images/help/mobile-menu.svg) *Preset tiles behave the same once a tab is selected.* --- ## Further reading - **[API.md](API.md)** — REST routes, session scoping, WebSocket `/ws`, and LED driver JSON (`presets`, `select`, `save`, `default`, pattern keys). - **README** — `pipenv run run`, port 80 setup, and high-level behaviour.