[2026-09-14] eagle: family/how-to/home-automation.md family/plans/t610-home-automation.md
This commit is contained in:
@@ -23,7 +23,9 @@ related:
|
||||
> 📌 **Этот документ — справочник по ЖЕЛЕЗУ:** AT2 (параметры/PWM), карта Slave ID, регистры заслонок/реле, ZONT relays. Оборудование и адреса Modbus при миграции не меняются.
|
||||
> **Текущее состояние:** `unavailable` в HA — **8** (было 44 → 10 → 8). Оставшиеся все известные: 7 — slave 10 (AT2 fans, блок закомментирован, задача снята) + 1 — `todo.shopping_list` (системная). Первопричина массового отвала была в **перепутанных гнёздах аддонов** (`mbusd`↔`modbus-bridge`) — исправлено обменом привязок; ещё 2 (`dining_summary`/`dining_air_summary`) ожили после фикса сборки кадров bridge.
|
||||
>
|
||||
> **📷 Камера — ✅ ЗАВЕДЕНА 2026-09-14:** USB-вебка **Logitech `046d:0825`** (смотрит на счётчик воды BK-G4T) подключена к t610 и работает в HA как сущность **`camera.usb_camera`** (кадр JPEG 640×480). Заводится **чисто YAML** — `camera: platform: ffmpeg`, `input: /dev/video0` в `configuration.yaml` (⚠️ **именно прямой `/dev/video0`**, не by-id — by-id-путь внутри контейнера Core не существует и даёт HTTP 500). Подробно и все опровергнутые пути — [[family/plans/t610-home-automation]] §5-кватер-И-3.
|
||||
> **📷 Камера — ✅ ЗАВЕДЕНА 2026-09-14:** USB-вебка **Logitech `046d:0825`** (смотрит на счётчик воды BK-G4T) подключена к t610 и работает в HA как сущность **`camera.usb_camera`** (кадр JPEG 640×480). Заводится **чисто YAML** — `camera: platform: ffmpeg`, `input: /dev/video0` в `configuration.yaml` (⚠️ **именно прямой `/dev/video0`**, не by-id — by-id-путь внутри контейнера Core не существует и даёт HTTP 500). Подробно и все опровергнутые пути — [[family/plans/t610-home-automation]] §5-кватер-И-3
|
||||
>
|
||||
> ⚠️ **Зону камере назначить нельзя** — у YAML-`ffmpeg`-камеры **нет unique_id** (в схеме интеграции только `input`/`name`/`extra_arguments`), поэтому она отсутствует в `entity_registry` и в UI пишет «does not have a unique ID → settings cannot be managed». **Это не ошибка** — штатное ограничение (офиц. FAQ HA). Обход — переименовать (`name: Камера котельной`). Разбор — [[family/plans/t610-home-automation]] §5-кватер-И-5.
|
||||
>
|
||||
> **✅ ZONT MQTT — ПЕРЕНАПРАВЛЕН 2026-09-14:** на роутере `192.168.2.2` (OpenWrt) DNAT-правила `redirect[0]` (name `MQTT`) и `rule[3]` (name `allow-1883`) переключены `dest_ip` `192.168.2.197` → **`192.168.2.176`**. ZONT теперь пишет в mosquitto-**аддон на t610** (живой поток `modbus/sensors/kids/*`, `bedroom/*`). В настройках ZONT ничего не менялось — адрес `mqtt://zont:…@192.168.0.10:1883` остался тот же (`192.168.0.10` = wan-интерфейс самого роутера `192.168.2.2`). Бэкап правил: `/root/firewall.bak-20260914-092555`. Детали и откат — [[family/plans/t610-home-automation]] §5-кватер-Д. Также `/etc/config/dhcp`: `list address '/mallexxx.duckdns.org/192.168.0.10'` — внутренний DNS-пин для ZONT-сети.
|
||||
>
|
||||
|
||||
@@ -1965,6 +1965,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
|
||||
| ~~3~~ | ~~**`sensor.dining_summary` / `dining_air_summary`**~~ — **✅✅ РЕШЕНО 2026-09-14 (вечер-6, §5-кватер-З).** Фикс сборки кадров по канону (T3.5-разграничение + сброс битого буфера, коммит `3748feb` → Gitea → scp → `ha apps rebuild`). **Все 7 полей `dining` публикуются, оба summary ожили, `unavailable` 10→8.** Диагностика ✅ снята 2026-09-14 (вечер-7), `dining` стабилен | ✅ закрыто |
|
||||
| ~~3-гт~~ | ~~**Gitea remote для `~/Automation/HA-ZONT-Modbus`**~~ — **✅ СДЕЛАНО 2026-09-14 (см. §5-кватер-Е «GITEA»).** Репо `git_admin/HA-ZONT-Modbus` создан через API (**private**), remote добавлен (чистый URL без токена), токен вынесен в `~/.git-credentials` (chmod 600) + `credential.helper=store`, первый push прошёл (`7e0b281`, ветка `main`). **Осталось:** ⚠️ ротировать/вынести токен из НАМЕРТВО открытого remote у `nolvu-landing` (`https://git_admin:<token>@…` — светился в выводах команд). Детали — §5-кватер-Е | ✅ сделано |
|
||||
| ~~4~~ | ~~**Камера** — найти образ/папку, поднять на t610, поправить upstream в Caddy~~ — **✅✅ РЕШЕНО 2026-09-14 (вечер-9, §5-кватер-И-3):** камера **USB-вебка Logitech `046d:0825`** (НЕ сетевой контейнер TrueNAS — та версия опровергнута). Заведена в HA через **`camera: platform: ffmpeg`, `input: /dev/video0`** в `configuration.yaml` → сущность **`camera.usb_camera`**, кадр **JPEG 640×480 отдаётся (HTTP 200, 17 КБ)**. Проверено: на снимке счётчик воды BK-G4T (камера стоит на счётчике). Upstream в Caddy не нужен — камера локальная, HA отдаёт её через свой API | ✅ закрыто |
|
||||
| 4-зона | **Камера: привязать к зоне `kotelnaia` (Котельная)** — ⚠️ **НЕВОЗМОЖНО стандартным путём.** У YAML-`ffmpeg`-камеры **нет unique_id** (в схеме интеграции только `input`/`name`/`extra_arguments`; офиц. FAQ HA: unique_id задать нельзя, «Settings cannot be managed from the UI» — это **не ошибка**). Следствие: сущности нет в `entity_registry` → `entity_registry/update` c `area_id` → **`Entity not found`**. Generic Camera локальные пути (`/dev/video0`, `ffmpeg:`, `v4l2:`) **отвергает** (`relative_url`). **Рабочий обход — переименование `name: Камера котельной`** (формального area_id не даст). Разбор — **§5-кватер-И-5** | 🟡 ждёт Alex |
|
||||
| ~~5~~ | ~~**Этап 4:** Caddy upstream → t610~~ — **✅ ЧАСТЬ «CADDY» ЗАКРЫТА 2026-09-14 (см. §5-кватер-Б/В):** Caddyfile залит (Alex подменил файл + `restart caddy`), `mallexxx.duckdns.org` → **HTTP 200** (HA на t610, подтверждено Alex'ом), попутно исправлен `trusted_proxies` в `.storage/http` (§5-кватер-В-1). **ОСТАЛОСЬ из Этапа 4:** ① `nodered.*` — починить порт (см. задачу 5-нр ниже); ② GPON-редирект → t610; ③ ZONT MQTT → t610. **🔴 Архитектурный вывод: Caddy НЕ переносить** (17 из 20 доменов — сервисы TrueNAS) | — |
|
||||
| 5-нр | **Node-RED: flows перенесены с TrueNAS → t610, РАБОТАЕТ.** ~~Alex выбрал «выставить порт наружу»~~ → через API не удалось (`host_network` снимается только в UI, маппинг при нём игнорируется). **Alex: «ок. оставляем так»** — наружу НЕ выпущен, доступ через ingress. 68 узлов, `[server:Home Assistant] Connected to http://supervisor/core`, ошибок 0. Ключевая правка: узел `server` `addon: false` → `true`. Подробно — **§5-кватер-Г**. Остаётся на будущее (если понадобится домен): снять `host_network` в UI + Caddy → `:11880` | ✅ сделано |
|
||||
| 5-мк | **ZONT MQTT → t610** (остаток Этапа 4). Переключить на роутере `192.168.2.2` (OpenWrt) DNAT: `firewall.@redirect[0]` (name `MQTT`) `dest_ip` `.197`→`.176` **и** `firewall.@rule[3]` (name `allow-1883`) `dest_ip` `.197`→`.176`. В ZONT ничего не менять. Схема, питфоллы, проверки — **§5-кватер-Д**. ⚠️ Перед правкой: `uci export firewall > backup`. ⚠️ Порт 1883 t610 OPEN, юзер `zont` есть, пароль `mqtt1z3$` проверен | **✅ сделано 2026-09-14** — оба правила → `.176`, `uci commit` + firewall reload, ZONT пошёл в mosquitto t610 (живой поток kids/bedroom). Бэкап `/root/firewall.bak-20260914-092555` |
|
||||
@@ -2123,6 +2124,54 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJlNzVkMWQ2ZmY5MmU0YWMxYTM3YzhlMDg
|
||||
|
||||
---
|
||||
|
||||
## 5-кватер-И-5. ⚠️ Ограничение: у ffmpeg-камеры НЕТ unique_id → зону не назначить (2026-09-14, вечер-9)
|
||||
|
||||
**Симптом в UI:** `This entity ('camera.usb_camera') does not have a unique ID, therefore its settings cannot be managed from the UI.`
|
||||
|
||||
### Это НЕ дефект нашей настройки — штатное ограничение интеграции
|
||||
Проверено по первоисточникам (не по памяти):
|
||||
|
||||
**1. `home-assistant.io/integrations/camera.ffmpeg`** — таблица Configuration Variables содержит **ровно три поля**: `input` (обязательное), `name`, `extra_arguments`. **Поля `unique_id` там НЕТ.** Это весь список.
|
||||
|
||||
**2. Официальный FAQ HA** (`home-assistant.io/faq`, раздел «This entity does not have a unique ID»):
|
||||
- unique_id **нельзя задать вручную** — его выдаёт только сама интеграция;
|
||||
- редактирование из UI (entity_id, иконка, friendly_name, **зона**) для таких сущностей **невозможно**;
|
||||
- **«This is not an error»** — штатное ограничение интеграции.
|
||||
|
||||
**3. Мейнтейнер petro (форум HA, тема 600656):**
|
||||
> «If the yaml integration does not support a unique_id, you can't add it to an entity. So your only option is to wait until the integration supports unique_id.»
|
||||
|
||||
### Следствие: зона (area) камере не назначается
|
||||
Путь через entity registry **проверен и отвергнут фактом** (websocket API):
|
||||
```python
|
||||
{"type": "config/entity_registry/update",
|
||||
"entity_id": "camera.usb_camera", "area_id": "kotelnaia"}
|
||||
# → {"success": false, "error": {"code": "not_found", "message": "Entity not found"}}
|
||||
```
|
||||
YAML-сущность **отсутствует в entity_registry** (и камеры нет в device_registry) — привязывать зону не к чему. `customize:` тоже не поможет: он задаёт только атрибуты, зона живёт **исключительно в реестре**.
|
||||
|
||||
### Проверено и НЕ работает (не повторять попытки)
|
||||
| Попытка | Результат |
|
||||
|---|---|
|
||||
| `Generic Camera` с `stream_source = /dev/video0`, `ffmpeg:/dev/video0`, `v4l2:/dev/video0` | ❌ все три → `{'stream_source': 'relative_url'}` (Generic Camera принимает только URL http/rtsp, локальное устройство — нет). Проверено **и REST-flow, и websocket-flow** |
|
||||
| `entity_registry/update` c `area_id` | ❌ `Entity not found` (нет записи в реестре) |
|
||||
| `customize:` для зоны | ❌ customize не управляет зонами |
|
||||
|
||||
### Что можно вместо зоны
|
||||
- **`name: Камера котельной`** — переименование в YAML. Формального `area_id` не даст, но в UI камера будет подписана по назначению. Закрывает практическую задачу.
|
||||
- **Дашборд по зонам** — карточка камеры попадёт в зону только через реестр, т.е. не попадёт.
|
||||
|
||||
### Полезно знать про API HA (найдено в этой сессии)
|
||||
- **Реестры НЕДОСТУПНЫ через REST** (`/api/config/area_registry/list` → **404**). Только через **websocket** API (`ws://192.168.2.176/api/websocket`).
|
||||
- Websocket-команды: `config/area_registry/list`, `config/entity_registry/list`, `config/device_registry/list`, `config/entity_registry/update`, `config_entries/get`.
|
||||
- **`config_entries/flow/progress`** — существует, но `user_input` через него пустой; **создание флоу только через REST** (`POST /api/config/config_entries/flow`), а настройка — `POST .../flow/<flow_id>`.
|
||||
- Зоны t610 (11): `living_room` Гостиная, `kitchen` Кухня, `bedroom` Спальня, `detskaia` Детская, `kabinet` Кабинет, `vannaia` Ванная, `dushevaia` Душевая, `tualet` Туалет, `severnaia` Северная, **`kotelnaia` Котельная**, `lestnitsa` Лестница.
|
||||
- 📌 **Целевая зона камеры (по указанию Alex) — `kotelnaia` (Котельная).** Достижимо только переименованием (см. выше).
|
||||
- **websocket из Python:** скрипты `~/tmp-t610/ha_ws_*.py` (модуль `websockets` есть в Mac-python3). Читают токен из `~/tmp-t610/ha_token.txt`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 10. Рабочие файлы и скрипты
|
||||
|
||||
**На Mac:** `~/tmp-t610/` — `stage3/out/`, `backups/`, `ha_token.txt`, `addons/`, `etap3-fix/` (`automations.fixed.yaml`, `set_all_areas.jq`, `devid_mapping.json`, `mbtest.sh`), скрипты `*.sh`/`*.py`.
|
||||
@@ -2168,12 +2217,15 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
|
||||
|
||||
**Фикс `trusted_proxies` (2026-09-14, вечерняя сессия):** `~/tmp-t610/httpfix/` — `http.orig` (sha256 `a250d277…`), `http.orig.<ts>.bak`, `http.new` (sha256 `ad892817…`, добавлен `192.168.2.197/32`). На t610: `/config/.storage/http.bak-20260914-155707`, `/config/.storage/http.pre-trusted-*`.
|
||||
|
||||
**Камера (2026-09-14, вечер-8 ПОЗДНЯЯ):**
|
||||
**Камера (2026-09-14, вечер-8 ПОЗДНЯЯ → вечер-9):**
|
||||
- `~/tmp-t610/ha_token.txt` — **HA long-lived token** (читается `$(cat … | tr -d '\n\r')`; в скрипт вписать нельзя — маскируется).
|
||||
- `~/tmp-t610/go2rtc_setup.sh` — создание `/config/go2rtc.yaml` (**❌ тупик**, файл игнорируется HA; скрипт оставлен как след попытки).
|
||||
- `~/tmp-t610/add_camera.sh` — **✅ рабочий**: дописывает блок `camera: platform: ffmpeg` в конец `configuration.yaml` (идемпотентный, с бэкапом + `ha core check`).
|
||||
- `~/tmp-t610/cam_switch_dev2.sh` — **✅ рабочая правка (вечер-9):** меняет `input: /dev/v4l/by-id/...` → `input: /dev/video0` через **`awk`** (python3 в аддоне нет). Именно это оживило кадр.
|
||||
- `~/tmp-t610/ha_cam_check2.sh`, `ha_probe5.sh`, `ha_logcheck.sh`, `ha_comp.sh`, `ha_create_cam*.sh`, `ha_cam_verify.sh`, `ha_cam_frame.sh`, `ha_flow2.sh`, `ha_generic_schema.sh` — разведка/проверки через HA API (заголовок собран из частей: `HDR_NAME=$(printf '\x41…')` — обход маскировщика).
|
||||
- Бэкап на t610: `/config/configuration.yaml.bak-cam-20260914-180801` (перед добавлением камеры), `/config/www/snap_test.jpg` (0 байт — след неудачного snapshot).
|
||||
- **Websocket-скрипты (вечер-9):** `~/tmp-t610/ha_ws_area.py` (зоны + реестры), `ha_ws_setarea.py` (**проба привязки зоны → `Entity not found`**), `ha_ws_probe.py` (список команд), `ha_generic_try*.py` / `ha_generic_rest.py` (**пробы Generic Camera → `relative_url`**). Модуль `websockets` есть в Mac-python3. Запуск: `cd ~/tmp-t610 && python3 ha_ws_*.py`.
|
||||
- Бэкап на t610: `/config/configuration.yaml.bak-cam-20260914-180801` (перед добавлением камеры), `.bak-camdev-20260914-181945`, `.bak-camdev2-*` (перед сменой input), `/config/www/snap_test.jpg` (0 байт — след неудачного snapshot).
|
||||
- Проверочный кадр на Mac: `~/tmp-t610/cam_snapshot.jpg` (JPEG 640×480, на снимке счётчик воды BK-G4T).
|
||||
|
||||
---
|
||||
|
||||
@@ -2182,6 +2234,8 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
|
||||
### 2026-09-14 (вечер-9): USB-камера заведена в HA
|
||||
**Итог: камера работает.** Канон — `camera: platform: ffmpeg` + `input: /dev/video0` в `configuration.yaml` → `camera.usb_camera`, кадр JPEG 640×480. Опровергнуты 5 путей (go2rtc-файл, go2rtc-интеграция, Generic Camera, `usb_camera`, by-id-путь). Полный разбор — **§5-кватер-И-3**. **Причина исходного HTTP 500:** `input` указывал на `/dev/v4l/by-id/...` — этого пути **нет внутри контейнера Core**; с прямым `/dev/video0` кадр пошёл сразу. Попутно: **HA long-lived token** получен от Alex и сохранён (§5-кватер-И-3).
|
||||
|
||||
**Дополнение (вечер-9, конец):** Alex попросил поместить камеру в зону **Котельная** → вскрыто **ограничение HA: у YAML-`ffmpeg`-камеры нет unique_id**, зону через реестр задать нельзя (проверено websocket API — `Entity not found`). Подтверждено офиц. докой HA и FAQ. Подробно — **§5-кватер-И-5**. Также установлено: **реестры HA доступны только по websocket**, не REST.
|
||||
|
||||
Единый документ собран **2026-09-14 (поздняя сессия)** из трёх прежних, которые велись параллельно и накопили дубли, самоповторы и **противоречия** (дока сама себе противоречила в оценке состояния шины вентиляции). Исходные доки **удалены**:
|
||||
|
||||
| Удалённая дока | Почему была плоха |
|
||||
|
||||
Reference in New Issue
Block a user