# Installation Guide

Complete installation guide for LED Grab (WLED Screen Controller) server and Home Assistant integration.

## Table of Contents

1. [Docker Installation (recommended)](#docker-installation)
2. [Manual Installation](#manual-installation)
3. [First-Time Setup](#first-time-setup)
4. [Home Assistant Integration](#home-assistant-integration)
5. [Configuration Reference](#configuration-reference)
6. [Troubleshooting](#troubleshooting)

---

## Docker Installation

The fastest way to get running. Requires [Docker](https://docs.docker.com/get-docker/) with Compose.

1. **Clone and start:**

   ```bash
   git clone https://git.dolgolyov-family.by/alexei.dolgolyov/wled-screen-controller-mixed.git
   cd wled-screen-controller/server
   docker compose up -d
   ```

2. **Verify:**

   ```bash
   curl http://localhost:8080/health
   # → {"status":"healthy", ...}
   ```

3. **Open the dashboard:** <http://localhost:8080>

4. **View logs:**

   ```bash
   docker compose logs -f
   ```

5. **Stop / restart:**

   ```bash
   docker compose down          # stop
   docker compose up -d         # start again (data is persisted)
   ```

### Docker manual build (without Compose)

```bash
cd server
docker build -t ledgrab .

docker run -d \
  --name wled-screen-controller \
  -p 8080:8080 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/logs:/app/logs \
  -v $(pwd)/config:/app/config:ro \
  ledgrab
```

### Linux screen capture in Docker

Screen capture from inside a container requires X11 access. Uncomment `network_mode: host` in `docker-compose.yml` and ensure the `DISPLAY` variable is set. Wayland is not currently supported for in-container capture.

---

## Manual Installation

### Requirements

| Dependency | Version | Purpose |
| ---------- | ------- | ------- |
| Python | 3.11+ | Backend server |
| Node.js | 18+ | Frontend build (esbuild) |
| pip | latest | Python package installer |
| npm | latest | Node package manager |

### Steps

1. **Clone the repository:**

   ```bash
   git clone https://git.dolgolyov-family.by/alexei.dolgolyov/wled-screen-controller-mixed.git
   cd wled-screen-controller/server
   ```

2. **Build the frontend bundle:**

   ```bash
   npm ci
   npm run build
   ```

   This compiles TypeScript and bundles JS/CSS into `src/wled_controller/static/dist/`.

3. **Create a virtual environment:**

   ```bash
   python -m venv venv

   # Linux / macOS
   source venv/bin/activate

   # Windows (cmd)
   venv\Scripts\activate

   # Windows (PowerShell)
   venv\Scripts\Activate.ps1
   ```

4. **Install Python dependencies:**

   ```bash
   pip install .
   ```

   Optional extras:

   ```bash
   pip install ".[perf]"            # DXCam, BetterCam, WGC (Windows only)
   pip install ".[notifications]"   # OS notification capture
   pip install ".[tray]"            # System tray icon (Windows only)
   pip install ".[dev]"             # pytest, black, ruff (development)
   ```

5. **Set PYTHONPATH and start the server:**

   ```bash
   # Linux / macOS
   export PYTHONPATH=$(pwd)/src
   uvicorn wled_controller.main:app --host 0.0.0.0 --port 8080

   # Windows (cmd)
   set PYTHONPATH=%CD%\src
   uvicorn wled_controller.main:app --host 0.0.0.0 --port 8080
   ```

6. **Verify:** open <http://localhost:8080> in your browser.

---

## First-Time Setup

### Change the default API key

The server ships with a development API key (`development-key-change-in-production`). **Change it before exposing the server on your network.**

Option A -- edit the config file:

```yaml
# server/config/default_config.yaml
auth:
  api_keys:
    dev: "your-secure-key-here"   # replace the dev key
```

Option B -- set an environment variable:

```bash
export WLED_AUTH__API_KEYS__dev="your-secure-key-here"
```

Generate a random key:

```bash
openssl rand -hex 32
```

### Configure CORS for LAN access

By default the server only allows requests from `http://localhost:8080`. To access the dashboard from another machine on your LAN, add its origin:

```yaml
# server/config/default_config.yaml
server:
  cors_origins:
    - "http://localhost:8080"
    - "http://192.168.1.100:8080"   # your server's LAN IP
```

Or via environment variable:

```bash
WLED_SERVER__CORS_ORIGINS='["http://localhost:8080","http://192.168.1.100:8080"]'
```

### Discover devices

Open the dashboard and go to the **Devices** tab. Click **Discover** to find WLED devices on your network via mDNS. You can also add devices manually by IP address.

---

## Home Assistant Integration

### Option 1: HACS (recommended)

1. Install [HACS](https://hacs.xyz/docs/setup/download) if you have not already.
2. Open HACS in Home Assistant.
3. Click the three-dot menu, then **Custom repositories**.
4. Add URL: `https://git.dolgolyov-family.by/alexei.dolgolyov/wled-screen-controller-mixed`
5. Set category to **Integration** and click **Add**.
6. Search for "WLED Screen Controller" in HACS and click **Download**.
7. Restart Home Assistant.
8. Go to **Settings > Devices & Services > Add Integration** and search for "WLED Screen Controller".
9. Enter your server URL (e.g., `http://192.168.1.100:8080`) and API key.

### Option 2: Manual

Copy the `custom_components/wled_screen_controller/` folder from this repository into your Home Assistant `config/custom_components/` directory, then restart Home Assistant and add the integration as above.

### Automation example

```yaml
automation:
  - alias: "Start ambient lighting when TV turns on"
    trigger:
      - platform: state
        entity_id: media_player.living_room_tv
        to: "on"
    action:
      - service: switch.turn_on
        target:
          entity_id: switch.living_room_tv_processing

  - alias: "Stop ambient lighting when TV turns off"
    trigger:
      - platform: state
        entity_id: media_player.living_room_tv
        to: "off"
    action:
      - service: switch.turn_off
        target:
          entity_id: switch.living_room_tv_processing
```

---

## Configuration Reference

The server reads configuration from three sources (in order of priority):

1. **Environment variables** -- prefix `WLED_`, double underscore as nesting delimiter (e.g., `WLED_SERVER__PORT=9090`)
2. **YAML config file** -- `server/config/default_config.yaml` (or set `WLED_CONFIG_PATH` to override)
3. **Built-in defaults**

See [`server/.env.example`](server/.env.example) for every available variable with descriptions.

### Key settings

| Variable | Default | Description |
| -------- | ------- | ----------- |
| `WLED_SERVER__PORT` | `8080` | HTTP listen port |
| `WLED_SERVER__LOG_LEVEL` | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` |
| `WLED_SERVER__CORS_ORIGINS` | `["http://localhost:8080"]` | Allowed CORS origins (JSON array) |
| `WLED_AUTH__API_KEYS` | `{"dev":"development-key..."}` | API keys (JSON object) |
| `WLED_STORAGE__DATABASE_FILE` | `data/ledgrab.db` | SQLite database path |
| `WLED_MQTT__ENABLED` | `false` | Enable MQTT for HA auto-discovery |
| `WLED_MQTT__BROKER_HOST` | `localhost` | MQTT broker address |
| `WLED_DEMO` | `false` | Enable demo mode (sandbox with virtual devices) |

---

## Troubleshooting

### Server will not start

**Check Python version:**

```bash
python --version  # must be 3.11+
```

**Check the frontend bundle exists:**

```bash
ls server/src/wled_controller/static/dist/app.bundle.js
```

If missing, run `cd server && npm ci && npm run build`.

**Check logs:**

```bash
# Docker
docker compose logs -f

# Manual install
tail -f logs/wled_controller.log
```

### Cannot access the dashboard from another machine

1. Verify the server is reachable: `curl http://SERVER_IP:8080/health`
2. Check your firewall allows inbound traffic on port 8080.
3. Add your server's LAN IP to `cors_origins` (see [Configure CORS](#configure-cors-for-lan-access) above).

### Home Assistant integration not appearing

1. Verify HACS installed the component: check that `config/custom_components/wled_screen_controller/` exists.
2. Clear your browser cache.
3. Restart Home Assistant.
4. Check logs at **Settings > System > Logs** and search for `wled_screen_controller`.

### WLED device not responding

1. Confirm the device is powered on and connected to Wi-Fi.
2. Test it directly: `curl http://DEVICE_IP/json/info`
3. Check that the server and the device are on the same subnet.
4. Try restarting the WLED device.

### Low FPS or high latency

1. Lower the target FPS in the stream settings.
2. Reduce `border_width` to decrease the number of sampled pixels.
3. Check CPU usage on the server (`htop` or Task Manager).
4. On Windows, install the `perf` extra for GPU-accelerated capture: `pip install ".[perf]"`

---

## Next Steps

- [API Documentation](docs/API.md)
- [Calibration Guide](docs/CALIBRATION.md)
- [Repository Issues](https://git.dolgolyov-family.by/alexei.dolgolyov/wled-screen-controller-mixed/issues)
