controlX — Uživatelská příručka v1

Platforma pro mobilní OSC ovladače interaktivních instalací.
Builder (desktop web) + controlX App (iOS / Android) — Direct Mode, žádný server.


1. Co je controlX

1.1 Přehled

controlX se skládá ze dvou částí:

Komunikace probíhá v Direct Mode: telefon posílá OSC/UDP pakety přímo do cílového zařízení v lokální síti — bez serveru, bez cloudu.

1.2 Základní koncepty

Pojem Co to je
Projekt JSON dokument uložený v Builderu nebo jako soubor .controlx.json. Obsahuje vše — stránky, komponenty, targety, proměnné, téma a runtime politiku.
Stránka (Page) Skupina komponent. Projekt má jednu nebo více stránek; v App se přepínají ťuknutím nebo OSC akcí.
Komponenta Interaktivní prvek (tlačítko, slider, XY pad, štítek, obrázek, kontejner). Každá komponenta sedí na gridu stránky a vysílá akce při interakci.
Target OSC zařízení v lokální síti — definovaný IP adresou, UDP portem a volitelným profilem.
Téma Vizuální styl projektu (barvy, písma). Šest vestavěných témat; přepíná se v Builderu.
Proměnná Runtime stavová hodnota (number / string / boolean) sdílená napříč stránkami. Lze ji vázat na vlastnosti komponent nebo měnit akcemi.

1.3 Grid a breakpointy

Každá stránka má responzivní grid. Počty sloupců závisí na orientaci a šířce displeje:

Breakpoint Podmínka Výchozí sloupce
base telefon portrait, šířka < 600 px 12
phoneLandscape telefon landscape, šířka < 960 px 12
tabletPortrait tablet portrait, šířka ≥ 600 px 16
tabletLandscape tablet landscape, šířka ≥ 960 px 16

Každou komponentu lze pro konkrétní breakpoint přemístit, změnit její rozměr nebo ji zcela skrýt (mode: hide).


2. První ovladač v Builderu krok za krokem — scénář S-Play

Tento návod předpokládá, že v lokální síti máte ENTTEC S-Play se statickou IP adresou.

2.1 Spuštění Builderu

# v kořenu repozitáře
pnpm --filter builder dev

Otevřete http://localhost:5173 v prohlížeči.

2.2 Vytvoření projektu

  1. Klikněte na + Nový projekt.
  2. Zadejte název (např. „S-Play ovladač") a potvrďte.
  3. Projekt se otevře v editoru (Shell).

2.3 Přidání targetu (S-Play)

  1. Klikněte na tlačítko Targets v horní liště.
  2. V modálu klikněte + Přidat.
  3. Vyplňte:
    • Název: S-Play
    • Profil zařízení: ENTTEC S-Play — port se automaticky doplní na 8000
    • Host: IP adresa vašeho S-Play v síti (např. 192.168.1.100)
    • Port: 8000 (nebo jak máte nastaveno v S-Play)
  4. Uložte.

2.4 Přidání komponenty

  1. V levém panelu (Palette) najděte Momentary Button.
  2. Přetáhněte ho na canvas (nebo klikněte a zvolte místo na gridu).
  3. Komponenta se zobrazí na canvasu.

2.5 Konfigurace akce (OSC)

  1. Vyberte komponentu na canvasu — v pravém panelu (Inspector) se zobrazí její vlastnosti.
  2. Přejděte na záložku Akce (Events).
  3. Klikněte + Přidat akci u události press.
  4. Zvolte typ OSC Send a vyplňte:
    • Target: S-Play
    • Adresa: /splay/playlist/play/1
    • Argumenty: přidejte int32 s hodnotou 1
  5. Uložte.

Tip: S-Play přijímá triggery ve formátu /splay/playlist/play/<N>. Číslo N je index playlistu (od 1). Viz dokumentaci S-Play OSC API.

2.6 Náhled

Klikněte na Preview v horní liště. Otevře se fullscreen overlay s živým renderem projektu. Ovladač je interaktivní — v Log panelu vidíte každou vyslanou OSC zprávu (simulátor, bez skutečného UDP).

2.7 Export projektu

Klikněte na Export v horní liště. Prohlížeč stáhne soubor s-play-ovladac.controlx.json.

Tento soubor přenesete do App — viz kapitola 6.


3. Komponenty — referenční přehled

3.1 Momentary Button (button.momentary)

Tlačítko drží stav stisknutí. Akce press se spustí při stisku, release při uvolnění.

Vlastnost Typ Popis
label string Text na tlačítku
disabled boolean Šedé, nereaguje na dotek

Typické použití: spuštění scény, spuštění playlistu.

3.2 Toggle Button (button.toggle)

Přepínací tlačítko. Uchovává stav ON/OFF. Akce on se spustí při přepnutí do ON, off při přepnutí do OFF.

Vlastnost Typ Popis
label string Text na tlačítku
disabled boolean Šedé, nereaguje

Typické použití: zapnutí/vypnutí osvětlení, mute kanálu.

3.3 Slider

Posuvník pro výběr hodnoty v rozsahu. Akce change se spouští při pohybu (s ohledem na rate limit).

Vlastnost Typ Výchozí Popis
label string Popis posuvníku
min number 0 Minimální hodnota
max number 1 Maximální hodnota
step number Krok (není-li zadán, plynulý pohyb)
orientation horizontal / vertical horizontal Směr posuvníku
releaseOnly boolean false OSC zpráva jen při puštění prstu (šetří traffic)
rateLimit number (ms) Minimální interval mezi zprávami v ms

Typické použití: intenzita světla, hlasitost, fade.

3.4 XY Pad (xypad)

Dvouosý dotykový pad. Odesílá dvě hodnoty najednou (X a Y). Akce change.

Vlastnost Typ Výchozí Popis
label string Popis
xMin, xMax number 0, 1 Rozsah osy X
yMin, yMax number 0, 1 Rozsah osy Y
springReturn boolean false Pád do středu po puštění prstu

Typické použití: pohyb v 2D prostoru, pan/tilt hlavy, XY fade.

3.5 Label

Statický textový štítek. Žádné interakce, slouží k popisu rozvržení.

Vlastnost Typ Popis
text string Zobrazený text

3.6 Image

Zobrazuje obrázek. Lze použít jako ozdobný prvek nebo mapu ovladače.

Vlastnost Typ Výchozí Popis
src string URL nebo data URI obrázku
alt string Alternativní text
fit fit / fill / contain contain Způsob přizpůsobení

3.7 Container

Prázdný kontejner pro vizuální seskupení. Nemá vlastní interakci.


4. Targety a OSC

4.1 Definice targetu

Každý target představuje jedno OSC zařízení v síti. Vlastnosti:

Pole Typ Popis
name string Lidský název (zobrazuje se v Inspectoru)
host string IPv4 unicast adresa nebo hostname (ne 0.0.0.0, ne broadcast)
port number UDP port (1–65535)
deviceProfileId string Volitelný profil zařízení (viz níže)
defaultTransport string Výchozí transport; native-osc v produkci

4.2 Vestavěné profily zařízení

Profil ID Výchozí port Popis
GenericOSC generic-osc Obecný OSC přístroj
Resolume Arena resolume-arena 7000 VJ software Resolume
ENTTEC S-Play enttec-splay 8000 Přehrávač světelných show

Při výběru profilu se automaticky doplní výchozí port a zpřístupní se Test Message (bezpečný testovací příkaz, např. nastavení master intensity).

4.3 Typy OSC argumentů

Typ Popis Příklad
int32 Celé číslo 32-bit 1, 127, -1
float32 Desetinné číslo 32-bit 0.5, 1.0
string Textový řetězec "play"
boolean Logická hodnota true / false

Argumenty Slideru a XY Padu mohou být bind reference — hodnota se doplní z aktuálního stavu komponenty za běhu (např. bind: "value" pro slider, bind: "x" / bind: "y" pro xypad).

4.4 Typy akcí

Typ akce Spouštěcí události Popis
osc.send press, release, change, tap, on, off Odešle OSC zprávu na target
navigate.page press, tap Přepne zobrazení na jinou stránku
variable.set press, tap Nastaví proměnnou na konkrétní hodnotu
variable.increment press, tap Inkrementuje proměnnou (volitelný min/max clamp)
variable.toggle press, tap Přepne booleanovskou proměnnou
variable.reset press, tap Vrátí proměnnou na výchozí hodnotu

4.5 Rate limit

Globální rate limit (projekt → Runtime politika → oscRateLimit) omezuje frekvenci OSC zpráv napříč celou App. Výchozí hodnota je 30 zpráv/s.

Slider má navíc vlastní rateLimit v milisekundách — minimální interval mezi dvěma zprávami od tohoto slideru. Hodí se pro zařízení citlivá na příliš rychlý OSC traffic.

Důležité: OSC/UDP je fire-and-forgetsent neznamená, že zařízení zprávu přijalo nebo zpracovalo. Diagnostická obrazovka v App zobrazuje počty sent / failed (failed = chyba na síťové vrstvě), ale nerozlišuje, zda zařízení zprávu ignorovalo nebo zpracovalo.


5. Témata

5.1 Vestavěná témata

controlX obsahuje šest hotových témat:

ID Název Charakter
dark-elegant Dark Elegant Tmavé, jemné — výchozí
light-studio Light Studio Světlé, profesionální
glass-premium Glass Premium Průhledné sklo (vyžaduje backdrop-filter)
neon-stage Neon Stage Tmavé s neonovými akcenty
xlab XLAB Firemní identita XLAB
high-contrast-ops High Contrast Ops Vysoký kontrast pro operátory

Poznámka k Glass Premium: Téma využívá CSS backdrop-filter. Na zařízeních nebo prohlížečích bez podpory se automaticky degraduje na solidní barvu (rgba 0.92).

5.2 Přepnutí tématu v Builderu

V horní liště Builderu vyberte téma z rozbalovacího menu ThemePicker. Změna je okamžitá a je součástí undo history.

5.3 Responzivní chování

Téma se aplikuje na celý projekt. Komponenty používají výhradně sémantické CSS proměnné (--cx-*) — přepnutím tématu se změní vzhled všech komponent najednou.


6. Přenos projektu do telefonu

Jsou tři způsoby, jak dostat projekt z Builderu do App.

6.1 QR kód přes LAN (doporučeno)

Počítač (Builder):

  1. Spusťte handoff server:
    node scripts/handoff-server.mjs
    # Server naslouchá na portu 9441
    # Pokud port 9441 obsazen: HANDOFF_PORT=9444 node scripts/handoff-server.mjs
    
  2. V Builderu klikněte na tlačítko ⊞ Phone v horní liště.
  3. Zobrazí se QR kód s URL projektu.

iPhone (App):

  1. Foťákem naskenujte QR kód → Safari otevře URL.
  2. Zkopírujte URL z adresního řádku Safari.
  3. Otevřete controlX App.
  4. Klepněte na Load from URL.
  5. Vložte URL a potvrďte.

Projekt se načte a zobrazí v runtime.

Bezpečnost: Token v URL je jednorázový — po prvním stažení přestane fungovat. Platnost je 10 minut.

6.2 Export / Import souboru

Export (Builder → soubor):
Klikněte na Export v horní liště. Prohlížeč stáhne <název-projektu>.controlx.json.

Import (soubor → App):
V App přetáhněte soubor nebo klikněte na Import a vyberte .controlx.json. Soubor musí být přenesen přes AirDrop, Files, nebo jiný mechanismus sdílení souborů na iOS.

Import do Builderu:
V pracovním prostoru (Workspace) přetáhněte soubor .controlx.json nebo klikněte na ↓ Import.

6.3 Deep link (controlx://)

App podporuje URL schéma controlx://load?url=<encoded-url>. Tato funkce vyžaduje Xcode rebuild pro aktivaci registrace URL schématu na iOS. Standardní postup: QR kód nebo ruční vložení URL (viz 6.1).


7. Provoz v App

7.1 Run mode

Při otevření projektu přejde App do run mode:

Jak odkrýt chrome: Podržte prst 2 sekundy v levém dolním rohu obrazovky. Chrome se zobrazí na 8 sekund, poté se opět skryje.

7.2 PIN zámek

Pokud má projekt nastaveno editLock: pin:

PIN nastavíte v Builderu (Inspector → Runtime politika).

7.3 Diagnostická obrazovka

Otevřete ji tlačítkem Log nebo z menu při odhalení chrome.

Sekce Co zobrazuje
Síť Platforma, IP adresa zařízení, subnet
Targety Pro každý target: host:port, počty sent/failed, poslední chyba, tlačítko Test Message
Log Posledních 200 záznamů; filtrovat dle úrovně (debug/info/warn/error) nebo textu

Test Message odešle bezpečný testovací příkaz dle profilu zařízení (viz kapitola 4.2) a zobrazí výsledek.

Clear vymaže viditelné záznamy (od daného okamžiku). Export sdílí log jako textový soubor.

Připomínka: sent v diagnostice znamená, že UDP paket odešel ze zařízení. Nepotvrzuje, že ho zařízení na druhém konci přijalo nebo zpracovalo. Client isolation na přístupovém bodu může tiše zahazovat pakety.

7.4 Reconnect

Při návratu aplikace do popředí nebo při připojení k síti App automaticky obnoví spojení transportní vrstvy.


8. Síťový checklist instalace

Problémy s OSC komunikací jsou v 90 % způsobeny síťovou konfigurací. Projděte tento checklist před každou instalací.

8.1 Wi-Fi infrastruktura

8.2 IP adresy

8.3 Firewall a UDP

8.4 iOS — Local Network permission

Při prvním spuštění App na iOS se zobrazí dialog:

„controlX chce komunikovat se zařízeními v lokální síti."

Klepněte Povolit (Allow). Bez tohoto povolení App nemůže odesílat UDP pakety do LAN. Povolení lze zpětně změnit v Nastavení → Soukromí a zabezpečení → Místní síť → controlX.

8.5 Ověření funkčnosti

  1. Otevřete diagnostickou obrazovku v App.
  2. V sekci Síť zkontrolujte, zda má telefon IP adresu (ne N/A browser).
  3. U každého targetu klepněte Test Message — dle výsledku zjistíte, zda UDP dosáhne cíle.
  4. Pokud Test Message selže, zkontrolujte výše uvedené body (client isolation, statická IP, firewall, Local Network permission).

9. Agentické ovládání (MCP)

controlX MCP server umožňuje Claude a dalším AI nástrojům přímo manipulovat s projekty bez nutnosti grafického rozhraní.

9.1 Spuštění serveru

node mcp/server.mjs
# Server komunikuje přes stdio (MCP protokol)

9.2 Automatické propojení s Claude Code

V kořeni repozitáře je soubor .mcp.json. Claude Code ho detekuje automaticky — MCP server se spustí při otevření projektu v Claude Code.

9.3 Claude Desktop

Přidejte do claude_desktop_config.json:

{
  "mcpServers": {
    "controlx": {
      "command": "node",
      "args": ["/absolutní/cesta/ke/controlx/mcp/server.mjs"],
      "description": "controlX Builder — project data management"
    }
  }
}

9.4 Nástroje

Nástroj Popis
list_projects Vypíše všechny projekty z lokálního úložiště
get_project Otevře projekt a vrátí celý JSON
create_project Vytvoří projekt ze šablony (blank / scene-launcher / installation-operator / media-control)
validate_project Ověří schema a referenční integritu projektu
apply_ops Atomická dávka EditOps — buď vše, nebo nic
undo Vrátí zpět poslední dávku
describe_component Lidsky čitelný popis komponenty
list_themes Vypíše 6 vestavěných témat
set_theme Nastaví téma projektu
export_project Zapíše .controlx.json soubor
import_project Importuje .controlx.json balíček (přiřadí nové ID)

Resource: controlx://guide — referenční průvodce pro agenty (schema koncepty, EditOp reference, typy komponent).

9.5 Omezení MCP serveru

MCP server nemá přístup k OSC transportu. Nemůže odesílat OSC zprávy do instalace. Správa projektových dat ano — spuštění show ne. To vyžaduje operátora s controlX App.

9.6 Úložiště

Projekty jsou uloženy jako JSON soubory v ~/Documents/controlX/.


10. FAQ a řešení problémů

App neposílá OSC zprávy

  1. Zkontrolujte diagnostickou obrazovku (kapitola 7.3).
  2. Má telefon IP adresu? → Wi-Fi připojeno
  3. Client isolation? → Vypněte na AP (kapitola 8.1)
  4. Správná IP a port targetu? → Porovnejte s nastavením zařízení
  5. iOS Local Network permission? → Nastavení → Soukromí → Místní síť → controlX → Povolit
  6. Firewall? → Povolte UDP na cílovém portu

QR kód nefunguje (nelze načíst URL)

Projekt se nenačte (Import selže)

Builder neukládá změny

Slider přetěžuje zařízení OSC příkazy

PIN zapomenut

Projekt je uložen s pinHash. PIN je jednosměrný hash (SHA-256), nelze ho zpětně zjistit.
Řešení: exportujte projekt z Builderu (kde PIN nezablokuje export), upravte runtimePolicy.editLock na none a reimportujte.

Po restartu S-Play se target nedostupný

S-Play má dynamickou IP z DHCP → přidělila se nová adresa.
Řešení: nastavte statickou IP v S-Play a/nebo v DHCP rezervaci na routeru.

controlX App nevidím v App Store

PoC verze není v App Store. Instalace probíhá přes Xcode (TestFlight ve fázi beta). Kontaktujte XLAB pro přístup.


controlX příručka v1 — verze 2026-07-17 — XLAB