Files
vf-cuda-grid/controller/README.md
T
gx 37232ae1b9 controller: Phase 3 — Python sidecar skeleton (MQTT + ZMQ + HTTP + HA Discovery)
cuda-grid-controller (Python 3.11+) — control plane между HA/MQTT/HTTP
и FFmpeg's vf_cuda_grid filter через ZMQ.

Modules (~700 LOC Python):
- config.py — Pydantic schema (broker, instances[], ha_discovery, http, log) + YAML loader
- layouts.py — registry известных layouts (sync с vf_cuda_grid.c Phase 2)
- ha_discovery.py — HA MQTT Discovery payloads (select.layout, sensor.current_layout,
  binary_sensor.online per instance + global device entry)
- zmq_client.py — async ZMQ REQ socket к FFmpeg zmq filter
  (target command args → reply parsing)
- state.py — in-memory ControllerState (active_layout per instance, asyncio.Lock)
- mqtt_loop.py — aiomqtt async loop: subscribe cuda_grid/cmd/<inst>/+/+,
  publish cuda_grid/state/* (retained) + cuda_grid/event/*, LWT, HA status reconnect
- dispatch.py — CommandDispatcher: layout.set action → ZMQ send_command + state update + events
- http_api.py — FastAPI: /health, /layouts, /state, POST /layout/{inst}/set
- __main__.py — typer CLI, asyncio.gather(mqtt_loop, uvicorn.server)

Examples + Dockerfile:
- examples/controller.yaml — 2 instances (livingroom_tv, public_stream)
- Dockerfile — python:3.11-slim, ENTRYPOINT cuda-grid-controller
- README — overview, usage, FFmpeg side filter graph

End-to-end flow ready:
  HA dashboard → MQTT → controller → ZMQ → FFmpeg process_command → layout switch
  ↓
  state публикуется обратно в MQTT → HA UI обновляется

Phase 3 deliverable per gx/vf-cuda-grid#1. Phase 4 = overlays (rect/text/icon).
2026-05-19 21:52:11 +01:00

61 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cuda-grid-controller
Control-plane sidecar для [`vf_cuda_grid`](../) FFmpeg filter. Transforms
MQTT / HTTP REST commands от Home Assistant / Node-RED / custom apps
в FFmpeg `process_command` через ZeroMQ. Publishes state + events наружу
для bidirectional integration.
**Статус:** Phase 3 work-in-progress — basic skeleton + HA Discovery + ZMQ
command bridge. Phase 4+ добавит overlays, audio orchestration.
## Что умеет (Phase 3)
- ✅ MQTT subscribe `cuda_grid/cmd/<instance>/layout/set` → ZMQ send → FFmpeg layout switch
- ✅ MQTT publish `cuda_grid/state/<instance>/layout` (retained) + `cuda_grid/event/.../layout_switched`
- ✅ HA MQTT Discovery — `select.layout` + `sensor.current_layout` + `binary_sensor.online` per instance
- ✅ HTTP REST API: `/health`, `/layouts`, `/state`, `POST /layout/{instance}/set`
- ✅ Multi-instance (несколько FFmpeg pipelines с разными ZMQ endpoints)
- ✅ Auto-reconnect MQTT, LWT для availability tracking
## Использование
```bash
pip install -e .
export MQTT_USERNAME=mqtt
export MQTT_PASSWORD=secret
cuda-grid-controller --config examples/controller.yaml
```
## FFmpeg side — как подключить cuda_grid + zmq filter
```bash
ffmpeg -i cam1.mp4 -i cam2.mp4 -i cam3.mp4 -i cam4.mp4 \
-filter_complex "
[0:v][1:v][2:v][3:v]cuda_grid=layout=quad,
zmq=bind_address=tcp\\\\://127.0.0.1\\\\:5555
" \
-c:v h264_nvenc out.mp4
```
(После этого controller с `zmq_endpoint: tcp://127.0.0.1:5555` сможет
переключать layout командой `cuda_grid@... layout six_grid`.)
## HA dashboard
После startup controller'а — в Home Assistant появятся entities:
- `select.cuda_grid_<instance>_layout` — dropdown с layouts
- `sensor.cuda_grid_<instance>_current_layout` — текущий выбранный
- `binary_sensor.cuda_grid_controller_online` — online/offline
## Roadmap
| Phase | Что |
|---|---|
| 3 (this) | Basic skeleton + HA Discovery + ZMQ bridge для layout switching |
| 4 | Overlay API (rect/text/icon через side data) |
| 5 | Rich overlays (image/dim/graph/chat) + privacy filtering |
| 6 | Audio orchestration (state machine, domofon use case) |
Полный design: [`docs/design.md`](../docs/design.md).