# vixy-vision Server

Camera snapshot server with motion detection for Raspberry Pi.

## Quick Start (Single Camera)

```bash
cp env.example .env
nano .env  # Configure settings
./setup.sh
sudo systemctl start vixy-vision-<your-camera-id>
```

## Multi-Camera Deployment (Same Pi)

For running multiple cameras on one Pi, clone the repo into separate directories:

```bash
# Camera 1: desk
git clone http://gateway.local:3001/vixy/vixy-vision.git ~/vixy-vision-desk
cd ~/vixy-vision-desk/server
cp env.example .env
# Edit .env:
#   SERVICE_NAME=vixy-vision-desk
#   CAMERA_ID=desk
#   CAMERA_INDEX=0
#   PORT=8443
./setup.sh

# Camera 2: basement
git clone http://gateway.local:3001/vixy/vixy-vision.git ~/vixy-vision-basement
cd ~/vixy-vision-basement/server
cp env.example .env
# Edit .env:
#   SERVICE_NAME=vixy-vision-basement
#   CAMERA_ID=basement
#   CAMERA_INDEX=2
#   PORT=8444
./setup.sh
```

Each instance gets its own:
- Install directory: `~/vixy-vision-<service-name>/`
- Systemd service: `vixy-vision-<service-name>.service`
- Port: as configured in `.env`

## Features

- 📷 USB camera snapshots via HTTPS API
- 🔐 API key authentication  
- 🔍 Motion detection with frame differencing
- 📤 Event reporting to central collector
- 🔄 Auto-reconnect on camera failure
- 🔢 Multi-instance support via SERVICE_NAME and PORT

## Configuration

Copy `env.example` to `.env` and customize:

| Variable | Description | Default |
|----------|-------------|---------|
| `API_KEY` | Auth key for API | (generated) |
| `SERVICE_NAME` | Systemd service name | vixy-vision |
| `PORT` | HTTPS port | 8443 |
| `CAMERA_ID` | Identifier for this camera | camera |
| `CAMERA_INDEX` | /dev/videoN index | 0 |
| `MOTION_ENABLED` | Enable motion detection | true |
| `MOTION_THRESHOLD` | Sensitivity (lower = more) | 25 |
| `MOTION_COOLDOWN` | Seconds between events | 5.0 |
| `COLLECTOR_URL` | Where to POST events | (optional) |

## API Endpoints

| Endpoint | Auth | Description |
|----------|------|-------------|
| `GET /` | No | Service info |
| `GET /health` | No | Health check |
| `GET /snapshot` | Yes | JPEG snapshot |
| `GET /motion/stats` | Yes | Detection stats |
| `POST /motion/enable` | Yes | Start detection |
| `POST /motion/disable` | Yes | Stop detection |

## Motion Events

When motion is detected, the server POSTs to `COLLECTOR_URL`:

```json
{
  "event": {
    "timestamp": "2024-12-16T14:23:01Z",
    "camera_id": "basement",
    "event_type": "motion",
    "confidence": 0.75,
    "area_percent": 7.5
  },
  "snapshot": "<base64 JPEG>"
}
```

## Service Management

```bash
sudo systemctl start vixy-vision-<id>
sudo systemctl stop vixy-vision-<id>
sudo systemctl status vixy-vision-<id>
sudo journalctl -u vixy-vision-<id> -f
```
