ZippyOVD is a Python/Django project for consuming Velocidrone race telemetry and rendering browser overlays ("race bug") plus an admin control page.
- Django project +
raceapp - Velocidrone websocket bridge (client thread):
- Connects to
ws://<machine-ip>:60003/velocidrone - Sends keepalive ping every 5 seconds
- Ingests events and builds race bug state from
racedata
- Connects to
- Admin page (
/race/admin/) with:- Machine IP setting
- Buttons: Start Race, Abort Race, All Spectate
- Camera actions: Spectate/FPV/Reset, Camera Select, Camera Player (UID)
- Pilot UID dropdown populated from live racedata
- Race bug page (
/race/bug/) showing:- Player name + color + lap + UID
- Team scores (team = shared color)
- Score mode toggle:
sumvscompletedlap increments - Compact overlay mode:
/race/bug/?compact=1
- API endpoints:
GET/POST /race/api/config/POST /race/api/action/POST /race/api/telemetry/(manual fallback ingest)GET /race/api/state/(normalized display state + websocket status)
cd ZippyOVD
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver # defaults to 0.0.0.0:8000Open:
- Admin: http://127.0.0.1:8000/race/admin/
- Race Bug: http://127.0.0.1:8000/race/bug/
curl -X POST http://127.0.0.1:8000/race/api/telemetry/ \
-H 'content-type: application/json' \
-d '{
"players": [
{"name": "Pilot A", "color": "#ff3b30", "lap": 2},
{"name": "Pilot B", "color": "#34c759", "lap": 1},
{"name": "Pilot C", "color": "#ff3b30", "lap": 3}
]
}'- Add real Velocidrone websocket client service.
- Map admin actions to websocket command protocol.
- Add auth for admin page.
- Move in-memory state to Redis/db for multi-process safety.