dynamic_overlays.ChatCfg.template (опц.) — Jinja2 шаблон применяется к
incoming MQTT payload. Доступны переменные payload (raw str) и payload_json
(parsed JSON dict если valid). Используется для извлечения отдельного поля
из JSON, например temperature из z2m sensor.
Применение в controller.yaml:
chats:
- id: temp_outside
source_topic: "zigbee2mqtt/Температура на улице"
template: "{{ '%+.1f' | format(payload_json.temperature | float) }}°C"
Если template не задан — payload используется как есть (backwards compat
с alerts_chat и подобными).
UI editor static/index.html: для icon/text overlays вместо коробки показываем
точечный маркер 14×14 (синий circle). Причина: filter render_overlay_icon
использует native PNG dimensions, frontend не знает реальный размер
(w_px/h_px хранятся в ChatCfg на server-side). Показ size=10% как было —
вводил в заблуждение. Resize handle тоже скрыт для marker'ов.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pipeline filter state (overlays, layout, cell_map, audio) живёт в RAM
ffmpeg process. При recreate container (compose up, OOM, NVENC crash,
config change) state lost — controller'у нужно re-push.
Раньше user'у приходилось вручную:
curl POST /layout/.../set
docker restart cuda-grid-controller # для browser/dynamic re-register
Теперь автоматизировано:
PipelineMonitor polls ZMQ каждые 3 sec (no-op set_layout).
On timeout/error → mark instance lost.
First success after lost → trigger restore:
1. set_layout к state.active_layout
2. set_audio_output_enabled к state.audio_output_enabled
3. re-push все overlays из state.overlays
4. browser/dynamic/frigate hooks: mark_all_unregistered() —
их loops автоматически re-add на next iteration
Verified test: docker restart cuda-grid-pipeline → 10 sec downtime →
monitor logs lost+restored+restore_done с count=6 overlays.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Static HTML/JS dashboard в cuda_grid_controller/static/index.html, mounted
на /ui и / FastAPI endpoints. Vanilla JS + HLS.js (CDN) для video player.
Controls:
Audio source — buttons из /audio/{instance} list, switch через POST
Intercom — Start (music↓) / End (restore)
Snapshot — opens PNG в new tab
Manual overlay — form для rect/text/dim/icon types
Chat — placeholder (info-toast про mosquitto_pub)
State — refresh каждые 2 sec, shows layout/overlays_count + raw list
Player consumes HLS на http://server:8888/live/index.m3u8 (mediamtx).
TV не нужен — браузер на любом устройстве в LAN.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>