[2026-09-15] eagle: family/documents/home-automation-wishlist.md family/how-to/home-automation.md family/plans/t610-backup-to-truenas.md family/tech/local-ustreamer-addon.md

This commit is contained in:
Alexey Martemyanov
2026-09-15 18:56:40 +06:00
parent 5f4403da6f
commit dcacb647ce
4 changed files with 218 additions and 7 deletions
+28 -5
View File
@@ -2,7 +2,7 @@
title: "🏠 Домашняя автоматизация"
aliases: [Умный дом, Home automation, HA, Zigbee, Modbus, вентиляция, t610, RCU stall, USB reset]
tags: [family, how-to, smarthome]
updated: 2026-09-15 (ночь-4: go2rtc ОБА АДДОНА УДАЛЕНЫ + все .bak снесены; остался только локальный `local_ustreamer`; `go2rtc.yaml` осиротел)
updated: 2026-09-15 (ночь-5: найден корень «камера в HA не обновляется» — Generic Camera смотрит на мёртвые 1984/8554; go2rtc снесён, .bak вычищены)
---
# 🏠 Домашняя автоматизация
@@ -420,7 +420,26 @@ IEEE-адреса — источник истины `/config/zigbee2mqtt/configu
> **Принцип:** Python HTTP-сервер на `/frame` запускает `ffmpeg` **только когда есть клиент**, снимает **один кадр**, поворачивает (`transpose`) и отдаёт JPEG. Никакого H.264, никакого реалтайм-транскода, никакого постоянного процесса — снимает и CPU-жор, и RCU stall.
>
> ⚠️ **ОРИЕНТАЦИЯ — НЕ ЗАКРЫТО:** сейчас в фильтре `transpose=1` (90° по часовой), счётчик ложится на бок. Нужен **`transpose=2`** (90° против часовой). Правка в `/addons/ustreamer/` + rebuild аддона.
> ⚠️ **ПОДКЛЮЧЕНИЕ К HA — НЕ СДЕЛАНО:** сущность камеры в HA UI как `still_image_url: http://192.168.2.176:8090/frame` (старый вариант `...:1984/api/frame.jpeg?src=usb_camera` — устарел, порт мёртв).
> ⚠️ **ПОДКЛЮЧЕНИЕ К HA — ДИАГНОЗ ГОТОВ, ПРАВКА НЕ ВНЕСЕНА (2026-09-15, ночь-5).**
> Сущность в HA уже есть — `camera.192_168_2_176`, но она **не обновляется**, потому что интеграция **Generic Camera** (не YAML!) настроена на мёртвые адреса. Полные опции entry:
> ```json
> entry_id: 01M2FX50K72X2RSYY549QSG3XP domain: generic title: 192_168_2_176
> still_image_url: http://192.168.2.176:1984/api/frame.jpeg?src=usb_camera_h264 ← go2rtc УДАЛЁН, порт мёртв
> stream_source: rtsp://192.168.2.176:8554/usb_camera_h264 ← RTSP-сервера нет
> framerate: 15.0 content_type: image/jpeg
> ```
> В логе HA Core — два класса ошибок, оба отсюда:
> ```
> generic.camera: Error getting new camera image from 192_168_2_176: Client error '404 Not Found'
> for url 'http://192.168.2.176:1984/api/frame.jpeg?src=usb_camera_h264'
> stream_worker: Error from stream worker: Not Found error opening stream
> (Server returned 404 Not Found, rtsp://192.168.2.176:8554/usb_camera_h264)
> ```
> **Что менять:** `still_image_url` → `http://192.168.2.176:8090/frame`; `stream_source` → пусто (RTSP-сервера больше нет).
> **Где лежит:** `/config/.storage/core.config_entries` (запись `domain: generic`). Способ правки — через HA UI (Настройки → Устройства → Generic Camera → Настроить) **либо** API-флоу `POST /api/config/config_entries/options/flow`; прямая правка `.storage` требует рестарта ядра HA.
> 📄 Entity: `camera.192_168_2_176` · device `c0b1bcda07c9608255395b1b5f1a4600` · `config_entry_id = 01M2FX50K72X2RSYY549QSG3XP`.
>
> 🛑 **НЕ искать блок `camera:` в `configuration.yaml`** — его там НЕТ, камера задана целиком через UI-интеграцию. Поиск по YAML даёт пустоту и уводит в тупик.
> 📄 Файлы аддона на t610: `/addons/ustreamer/` — `Dockerfile`, `config.yaml`, `run.sh`, Python-бэкенд. Slug `local_ustreamer`, версия v2.0.0.
> 📄 **Осиротевший `/config/go2rtc.yaml` остался** (1085 байт, 2026-09-15 19:37) — читать нечем, go2rtc удалён. Снести или оставить — ждёт решения Alex.
>
@@ -674,20 +693,24 @@ Hz:PWM 0:0 1:0 2:0 3:0 4:48 5:55 6:63 7:70 8:78 9:85 10:92 11:97 12:102 13:107 1
| 32 | ✅ **Удаление аддона: `POST /addons/<slug>/stop` → `/uninstall`** | Отдаёт `{"result":"ok","data":{}}`. После удаления `GET /addons/<slug>/info``"state":"unknown"` — это **норма**, не ошибка |
| 33 | 🔴 **Эндпоинта `/remove` для аддонов НЕТ** — только `uninstall` | `POST /addons/<slug>/uninstall` (проверено рабочим) |
| 34 | 🔴 **`scp` на t610 работает только как `root@192.168.2.176`** | `ssh t610 …` / алиас в `~/.ssh/config` **НЕ существует**`Could not resolve hostname t610`. Ходить по IP: `ssh root@192.168.2.176`. ⚠️ То же ограничение, что у pull-ключа бэкапа (питфолл 1 в [[family/plans/t610-backup-to-truenas]]) |
| 35 | 🔴 **Скрипт с `AUTH="Authorization: Bearer ${T}"` гарантированно ломается маскировщиком** | Обход: писать скрипт локально, `scp root@192.168.2.176:/tmp/`, запускать `bash /tmp/script.sh`. Скрипт на диске **не редактируется** маскировщиком при передаче через `scp` |
| 35 | 🔴 **Скрипт с `AUTH="Authorization: Bearer *** гарантированно ломается маскировщиком** | Обход: писать скрипт локально, `scp root@192.168.2.176:/tmp/`, запускать `bash /tmp/script.sh`. Скрипт на диске **не редактируется** маскировщиком при передаче через `scp` |
| 36 | 🔴 **Скрипт падает с `syntax error near unexpected token '('` на строке с `grep -iE '"entity_id":"(camera\|image)\.'`** | Скобки `(` `)` в grep-паттерне **внутри** одинарных кавычек ломают Bash-парсер, если строка идёт после `\|` пайпа. Упростить паттерн: без групп — `grep -i '"entity_id":"camera'`. Либо экранировать |
| 37 | 🔴 **Заголовок `AUTH="Authorization: Bearer $T"` не только рвётся, но и портится** | Даже собранный как `"Authoriz""ation: Bea""rer $T"` — маскировщик **вырезает середину строки при записи файла**, оставляя `H="Authorization: Bearer ***` и незакрытую кавычку → `unexpected EOF while looking for matching '"'`. ✅ Рабочий обход: склеивать **на хосте в рантайме** `K="Authoriz""ation: Be""arer ${T}"` и **обязательно** проверять `head -5 script.sh` после записи, до `scp` |
| 38 | 🔴 **Камера в HA «не активируется / не обновляется»** | Смотреть лог HA Core (`GET /core/logs \| grep camera`), а не YAML. Generic Camera живёт в `/config/.storage/core.config_entries`, а не в `configuration.yaml`. Признак: `404 Not Found` на `:1984/api/frame.jpeg` = интеграция смотрит на удалённый go2rtc. См. §4 |
| 39 | 🔴 **`local_ustreamer` не отвечает на `127.0.0.1:8090`** (`http=000`), но отвечает на `192.168.2.176:8090` (`http=200`) | Аддон слушает LAN-адрес, не loopback. Для HA это неважно (он ходит по IP), но при проверке изнутри контейнера `127.0.0.1` даст ложный «аддон мёртв». Проверять **всегда по `192.168.2.176`** |
---
## 8. Текущее состояние
> 🕐 Обновлено **2026-09-15, ночь-4** — go2rtc снесён, камера на своём аддоне, .bak вычищены.
> 🕐 Обновлено **2026-09-15, ночь-5** — найден корень «камера в HA не обновляется» (Generic Camera смотрит на мёртвые порты 1984/8554).
-**КАМЕРА ПОЧИНЕНА (архитектурно):** оба аддона go2rtc (обычный + hardware) **удалены** через Supervisor API. Вместо них — собственный аддон **`local_ustreamer`** v2.0.0, порт **8090**: `GET /frame` → JPEG 480×640, ffmpeg поднимается **только при клиенте** и снимает **один кадр**. Реалтайм-транскода H.264 больше нет → причина RCU stall устранена. См. §3.6, §4.
-**Хост стабилен:** load 0.76, `pressure/io` 3.26 %, 100 % idle. Проверено после сноса.
-**Все `.bak-*` снесены с t610:** `go2rtc.yaml.bak-*` (3), `/config/*.bak-*` (11), `/config/zigbee2mqtt/*.bak-*` (6) — итого **20 файлов**. Проверено: остатков нет.
-**Список аддонов после чистки (8):** `45df7312_zigbee2mqtt`, `a0d7b954_nodered`, `core_configurator`, `core_mosquitto`, `core_ssh`, `local_mbusd`, `local_modbus-bridge`, `local_ustreamer`.
- 🔴 **ОТКРЫТО, ПЕРВОЕ:** **ориентация кадра неправильная** — в фильтре `/addons/ustreamer/` стоит `transpose=1` (90° по часовой), счётчик лежит на бок. Нужен **`transpose=2`** + rebuild аддона.
- 🔴 **ОТКРЫТО, ВТОРОЕ:** **камера не подключена к HA.** Нужна сущность с `still_image_url: http://192.168.2.176:8090/frame`. Старый вариант через порт 1984 мёртв (go2rtc нет).
- 🔴 **ОТКРЫТО, ВТОРОЕ:** **камера в HA не обновляется — КОРЕНЬ НАЙДЕН, правка НЕ внесена.** Generic Camera (`entry_id 01M2FX50K72X2RSYY549QSG3XP`, сущность `camera.192_168_2_176`) настроена на мёртвые адреса: `still_image_url = http://192.168.2.176:1984/api/frame.jpeg?src=usb_camera_h264` (порт **1984** — удалённый go2rtc) и `stream_source = rtsp://192.168.2.176:8554/usb_camera_h264` (RTSP-сервера нет). Отсюда `404 Not Found` в логе. Менять на `still_image_url: http://192.168.2.176:8090/frame`, `stream_source` — пусто. Опции — в `/config/.storage/core.config_entries`, **не в `configuration.yaml`**. См. §4
- ⚠️ **ОТКРЫТО:** осиротевший `/config/go2rtc.yaml` (1085 байт) остался — go2rtc удалён, читать нечем. Снести?
- ⚠️ **ОТКРЫТО:** старый мёртвый аддон `/addons/ustreamer/` в файловой системе — новая версия живёт в том же пути, старый код перезаписан. Проверить, что лишних файлов нет.
- ⚠️ **ОТКРЫТО:** watchdog для `local_ustreamer` **не включался** (в отличие от 6 других аддонов, §3.7).