96e6048b64
Fixed pipeline (live verified с ffmpeg-vf-cuda-grid:phase4b-icon):
zmq_client.send_command — wrap args в single-quotes
FFmpeg's zmq filter parses через av_get_token (libavfilter/f_zmq.c) — берёт
ОДИН token как arg. Без quotes filter получает только id, parse fail.
dispatch._serialize_overlay_to_zmq — translation pydantic → filter wire:
color "#RRGGBB" → r=N g=N b=N
opacity 0..1.0 → opacity 0..255
border_only + width → thickness (0=filled, иначе width)
dim_factor 0..1.0 → amount 0..255
text/icon_name → URL-encoded (%20 для space)
frigate_bridge — Phase 4b auto-rendering:
motion ON → add RectOverlay (orange border весь cell)
motion OFF → remove
event new/update → add RectOverlay (bbox) + TextOverlay (label + score%)
event end → remove оба
Bbox px → normalized через configurable camera_width/height (default 1920x1080).
Опциональные flags motion_indicator/bbox_overlay в mapping.
Constructor принимает dispatcher для dispatch.handle("overlay.add"/"overlay.remove").
mqtt_loop._handle_message — await frigate_bridge.handle_message (теперь async).
__main__.py — передаёт dispatcher в FrigateBridge constructor.
Verified end-to-end через test pipeline:
pydantic Overlay → _serialize_overlay_to_zmq → send_command quoted →
ZMQ → filter parse_overlay_args → CUDA kernel render
4× add_overlay (rect border, text, dim, rect filled) — все 4 visible в output frame.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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.onlineper instance - ✅ HTTP REST API:
/health,/layouts,/state,POST /layout/{instance}/set - ✅ Multi-instance (несколько FFmpeg pipelines с разными ZMQ endpoints)
- ✅ Auto-reconnect MQTT, LWT для availability tracking
Использование
pip install -e .
export MQTT_USERNAME=mqtt
export MQTT_PASSWORD=secret
cuda-grid-controller --config examples/controller.yaml
FFmpeg side — как подключить cuda_grid + zmq filter
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 с layoutssensor.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.