[2026-09-14] eagle: family/plans/t610-home-automation.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 17:05:30 +06:00
parent 4c0c8fd8e6
commit f0123141e9
+57 -3
View File
@@ -9,7 +9,7 @@
## 1. Состояние на 2026-09-14 (актуализировано 15:33 → дополнено вечерней сессией)
**Этап 1 ✅ · Этап 2 ✅ · Этап 3 ✅ ЗАКРЫТ.** Этап 4 — **ПОЧТИ ЗАКРЫТ (3 из 4):** ① Caddy → t610 (`mallexxx.duckdns.org` → HA на t610, HTTP 200); ② Node-RED flows перенесены, `Connected to HA`, наружу не выпущен (решение Alex «оставляем так», доступ через ingress); ③ **ZONT MQTT-редирект переключён на t610** (DNAT на роутере `.197``.176`, живой поток идёт). **ОСТАЛОСЬ:** погасить/отключить сервисы TrueNAS (заблокировано — Caddy на TrueNAS держит точку входа) + хвосты (static IP, бэкап).
**Последняя верификация: 2026-09-14 (вечер-8) — static IP ЗАКРЕПЛЁН, правка автоматизации душевой ВНЕДРЕНА. Камера — выяснено: USB-вебка Logitech `046d:0825`, в HA НЕ заведена.** Фикс bridge (T3.5, вечер-6) держится: `dining` стабилен, диагностика снята (вечер-7). **Вечер-8:** ① static-привязка t610 на роутере (`dhcp.@host[1]`, §5-кватер-И-1); ② ночной свет душевой — добавлен триггер на **падение освещённости** + условие присутствия (id `1771997851260`, §5-кватер-И-2); ③ камера — **❌ гипотеза «контейнер на TrueNAS» опровергнута**, это USB-вебка; в HA не заведена, `usb_camera` в UI HA 2026 нет (§5-кватер-И-3). Причина (вечер-5, фактом): кадры приходят разорванными, байты-сироты `00` копились в голове буфера → сдвиг выравнивания → 19-байтный ответ гостиной отбрасывался молча. **Фикс (вечер-6): сборка кадров по канону — T3.5-разграничение (пауза ≥3.5 символа = конец кадра) + сброс битого буфера (= `resetFrame` в pymodbus)**, коммит `3748feb` → Gitea → scp → `ha apps rebuild`. **Итог: все 7 полей `dining` публикуются, `dining_summary`/`dining_air_summary` ожили, `unavailable` 10 → 8** (остались только slave 10 «снято Alex'ом» + `todo.shopping_list`). **Загадка «замерзания» лога на 7 ч — тот же баг, устранена.** Диагностика ✅ снята (вечер-7), `dining` стабилен. Детали — §5-кватер-З, §11 (журнал вечер-6/7).
**Последняя верификация: 2026-09-14 (вечер-8) — static IP ЗАКРЕПЛЁН, правка автоматизации душевой ВНЕДРЕНА. Камера — выяснено: USB-вебка Logitech `046d:0825`, в HA НЕ заведена.** Фикс bridge (T3.5, вечер-6) держится: `dining` стабилен, диагностика снята (вечер-7). **Вечер-8:** ① static-привязка t610 на роутере (`dhcp.@host[1]`, §5-кватер-И-1); ② ночной свет душевой — добавлен триггер на **падение освещённости** + условие присутствия (id `1771997851260`, §5-кватер-И-2); ③ камера — **❌ гипотеза «контейнер на TrueNAS» опровергнута**, это USB-вебка; в HA не заведена, `usb_camera` в UI HA 2026 нет (§5-кватер-И-3); ④ камера, путь B **НАЧАТ**: создан **`/config/go2rtc.yaml`** (поток `usb_camera` = `v4l2:device=…by-id/usb-046d_0825_505CE330-video-index0`), HA Core перезапущен (200 OK), но **поток не подтверждён** — go2rtc слушает внутри контейнера HA Core, из SSH-аддона и снаружи (`.duckdns.org`) недоступен; нужен **HA long-lived token** для проверки/подключения Generic Camera (§5-кватер-И-3, «вечер-8, финал»). Причина (вечер-5, фактом): кадры приходят разорванными, байты-сироты `00` копились в голове буфера → сдвиг выравнивания → 19-байтный ответ гостиной отбрасывался молча. **Фикс (вечер-6): сборка кадров по канону — T3.5-разграничение (пауза ≥3.5 символа = конец кадра) + сброс битого буфера (= `resetFrame` в pymodbus)**, коммит `3748feb` → Gitea → scp → `ha apps rebuild`. **Итог: все 7 полей `dining` публикуются, `dining_summary`/`dining_air_summary` ожили, `unavailable` 10 → 8** (остались только slave 10 «снято Alex'ом» + `todo.shopping_list`). **Загадка «замерзания» лога на 7 ч — тот же баг, устранена.** Диагностика ✅ снята (вечер-7), `dining` стабилен. Детали — §5-кватер-З, §11 (журнал вечер-6/7).
| Что | Факт |
|---|---|
@@ -47,7 +47,7 @@
| **`sensor.fan_at2_*` / `switch.fan_3_*` — сироты** | В `configuration.yaml` **весь блок slave 10 (AT2 fans) закомментирован** → эти сущности физически не могут получать данные. Не задача — просто известный факт состояния конфига |
| `switch.sauna` = `unknown` | Розетка физически отключена (`lastSeen` 8+ ч) — не баг |
| ZONT не перенаправлен | **✅ ПЕРЕНАПРАВЛЕН 2026-09-14 (вечер-3, §5-кватер-Д):** DNAT на роутере `192.168.2.2` (`redirect[0]` MQTT + `rule[3]`) переключён `.197``.176`; ZONT пишет в mosquitto **t610** (живой поток kids/bedroom). ⚠️ Не решено: `dining/*` не публикуется — **ответ на шине есть, bridge его не отдаёт** (§5-кватер-Д, задача №3) |
| Камера | **❌ Первоначальная трактовка опровергнута (Alex, вечер-8): камера = USB-вебка, не сеть/не контейнер TrueNAS.** **Logitech `046d:0825`** воткнут в t610 → `/dev/video0` (`by-id .../usb-046d_0825_505CE330-video-index0`), ядро видит. **В HA НЕ заведена.** Интеграции `usb_camera` в HA 2026 в UI **нет** (только Generic Camera / MJPEG IP Camera / Camera Proxy). Пути: go2rtc-конфиг (YAML, агент может) или токен HA. Мёртвый upstream `cam.mallexxx.*``192.168.2.197:8090` в Caddy — поправить при заводе. См. §5-кватер-И-3 |
| Камера | **❌ Первоначальная трактовка опровергнута (Alex, вечер-8): камера = USB-вебка, не сеть/не контейнер TrueNAS.** **Logitech `046d:0825`** воткнут в t610 → `/dev/video0` (`by-id .../usb-046d_0825_505CE330-video-index0`), ядро видит. **В HA пока НЕ подключена:** создан `/config/go2rtc.yaml` (поток `usb_camera`), HA перезапущен, но поток не подтверждён — go2rtc внутри контейнера HA Core, нужен long-lived token для проверки + Generic Camera. Интеграции `usb_camera` в HA 2026 в UI **нет** (только Generic Camera / MJPEG IP Camera / Camera Proxy). Мёртвый upstream `cam.mallexxx.*``192.168.2.197:8090` в Caddy — поправить при заводе. См. §5-кватер-И-3 |
---
@@ -1493,6 +1493,43 @@ conditions[1] = is_occupied ← НОВЫЙ
---
#### И-3.1. Камера — путь B **НАЧАТ**: создан `/config/go2rtc.yaml` (вечер-8, финал)
**Триггер:** Alex дал команду **«ПИШИ»** — согласие на создание go2rtc-конфига (путь B, §И-3). Контекст раздражения: агент просил long-lived token, Alex — *«в смысле блядь дать тебе токен?!»*, *«в смысле не хочешь?! я тебе блядь давал уже токен»* (проверка: единственный найденный токен в истории сессий — от **старого HA `192.168.1.14:8123`**, май 2026, сеть не та → `HTTP 401`; **токена от t610 у агента нет**).
**Что сделано (правка конфига + рестарт):**
| Шаг | Действие | Результат |
|---|---|---|
| 1 | Проверка: `go2rtc` в HA — **не аддон**`ha addons` нет), а **встроенный в HA Core** (`config_entries`, `source: system`, entry_id `01M2DH226YMTNQ4G3H9F59V4HV`) | ✅ установлено фактом |
| 2 | `/config/go2rtc.yaml` **не существовал** | бэкапить нечего |
| 3 | Проверка устройства: `by-id/usb-046d_0825_505CE330-video-index0``readlink -f` = `/dev/video0` | ✅ OK |
| 4 | Создан `/config/go2rtc.yaml` (скриптом `~/tmp-t610/go2rtc_setup.sh`, идемпотентный, с проверкой устройства) | ✅ записан |
| 5 | `ha core restart` | ✅ 200 OK, HA 2026.9.2 поднялся |
**Содержимое `/config/go2rtc.yaml`:**
```yaml
# go2rtc — потоки камер (встроенный go2rtc HA Core)
# USB-камера Logitech 046d:0825 (UVC), стабильный by-id путь
streams:
usb_camera: v4l2:device=/dev/v4l/by-id/usb-046d_0825_505CE330-video-index0
```
**❌ Поток НЕ подтверждён (проверка упёрлась в изоляцию):**
- Порт `1984` (go2rtc) из SSH-аддона **не слушается** — go2rtc работает **внутри контейнера HA Core** (другой контейнер, чем SSH-аддон).
- `ha core logs` — про go2rtc **тишина** (в логе только известный `dining_air_summary` template error + 401 от curl агента).
- Supervisor-токен из SSH-аддона на core API → `401: Unauthorized` (изоляция контейнеров).
- Снаружи через `https://mallexxx.duckdns.org`: `/api/go2rtc/streams`, `/go2rtc/api/streams`, `/api/go2rtc/api/streams`**404**; `/api/hassio_ingress/go2rtc/streams`**401**. Прямого публичного пути к встроенному go2rtc нет.
**Почему застряли:** без **HA long-lived token** агент **слеп** — не может проверить сущности/поток/логи, только гадает по 404. Токен нужен, чтобы: ① проверить, подхватил ли HA конфиг go2rtc; ② создать **Generic Camera** через API (её настройка — тоже config-flow, YAML нет); ③ выдать готовую карточку. `usb_camera` в UI HA 2026 **отсутствует** (§И-3) — Generic Camera единственный UI-путь.
**Следующий шаг (ждёт Alex):** создать long-lived token — профиль (внизу слева) → Long-Lived Access Tokens → Create Token → прислать строку. Тогда агент заканчивает сам. **Либо** Alex сам: Generic Camera → URL потока (`http://127.0.0.1:1984/api/stream.mjpeg?src=usb_camera`). При заводе — поправить мёртвый upstream `cam.mallexxx.*``192.168.2.197:8090` в Caddyfile.
> ⚠️ **Питфолл (важный):** встроенный go2rtc HA Core **недоступен ни из SSH-аддона, ни снаружи** — он в изолированном контейнере core. Проверять поток можно **только** через API HA (нужен токен) или глазами в UI. Не тратить попытки на `netstat`/`curl :1984` из аддона.
> ⚠️ **Питфолл (репо-гигиена):** `ha core restart` перезапускает контейнер core — конфиг `/config/go2rtc.yaml` общий (виден из SSH-аддона), правка файла из аддона валидна.
---
### 5-кватер-Г. ✅ Node-RED: перенос flows с TrueNAS на t610 (2026-09-14, вечер-2)
**Триггер:** Alex открыл `nodered.mallexxx.duckdns.org` → увидел basic auth вместо страницы Node-RED. В ходе разбора выяснилось, что **на t610 `flows.json` = 124 байта (пусто)** — агент при миграции **не перенёс flows Node-RED с TrueNAS**. Alex: *«в смысле чистый лист?? ты не перенёс все с truenas значит»* → команда **«переносим как есть»**.
@@ -1880,7 +1917,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
| ~~A2~~ | ~~**№7**: Static IP для t610~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-1):** на роутере `192.168.2.2` создана static-привязка `dhcp.@host[1]` = `t610` / MAC `9c:8e:99:ef:3f:c5` / `192.168.2.176``uci commit dhcp` + `dnsmasq reload`. Проверено: `ping` OK, HA → HTTP 200. Бэкап `/root/dhcp.bak-20260914-104152` |
| A3 | **№8**: Бэкап конфигов t610 | ✅ низкий | `tar` конфигов t610 (`/config`, **`.storage/http`**, Caddyfile) → Mac + TrueNAS + коммит в Gitea `git.mallexxx.duckdns.org` (репо `git_admin/HA-ZONT-Modbus` уже создан) |
| ~~A4~~ | ~~**Ночной свет душевой**: триггер на падение освещённости~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-2):** в automation `1771997851260` добавлен триггер `illuminance below:8` + условие `is_occupied`. Проверено через API: `triggers`=2, `conditions`=2 |
| **A5** | **Камера**: USB-вебка Logitech `046d:0825` на t610 → завести в HA | 🟡 средний | 🟡 **ГИПОТЕЗА О «КОНТЕЙНЕРЕ НА TRUENAS» ОПРОВЕРГНУТА (вечер-8).** Камера = **USB-вебка** (`/dev/video0`, by-id `usb-046d_0825_505CE330-video-index0`), ядро видит, в HA не заведена. `usb_camera` в HA 2026 в UI **нет**. Путь: go2rtc (YAML `/config/go2rtc.yaml`) или дать агенту **HA long-lived token**. См. §5-кватер-И-3 |
| **A5** | **Камера**: USB-вебка Logitech `046d:0825` на t610 → завести в HA | 🟡 средний | 🟡 **ПУТЬ B НАЧАТ (вечер-8):** создан `/config/go2rtc.yaml` (поток `usb_camera` = v4l2 by-id), HA перезапущен, **поток не подтверждён** (go2rtc изолирован в контейнере HA Core). `usb_camera` в HA 2026 в UI **нет**. Блокер: нужен **HA long-lived token** для проверки + создания Generic Camera. См. §5-кватер-И-3, И-3.1 |
**Вариант B — Этап 4 целиком** (№5: Caddy upstream → t610 + GPON-редирект → t610 + ZONT MQTT → t610). 🔴 Трогает рабочее → нужно окно и согласование с Alex. **Caddy-часть СДЕЛАНА (§5-кватер-Б/В).**
@@ -2285,6 +2322,23 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
---
### 2026-09-14 (вечер-8, финал: камера — создан `/config/go2rtc.yaml`, поток не подтверждён)
**Контекст:** Alex — *«нихуя не понял! че делать то?!»**«в смысле не хочешь?! я тебе блядь давал уже токен»* → после честного разбора (токена от t610 нет, найден только старый от `192.168.1.14`) Alex — **«ПИШИ»**.
**Что сделано:**
- ✅ Создан **`/config/go2rtc.yaml`** на t610 (скрипт `~/tmp-t610/go2rtc_setup.sh`, идемпотентный): поток `usb_camera` = `v4l2:device=/dev/v4l/by-id/usb-046d_0825_505CE330-video-index0`.
- ✅ `ha core restart` → HA 2026.9.2, HTTP 200.
- ❌ **Поток не подтверждён:** встроенный go2rtc в HA Core изолирован — из SSH-аддона порт `1984` не слушается, снаружи `.duckdns.org` все пути к go2rtc → 404/401, `ha core logs` про go2rtc молчит.
**Установлено фактом:**
- `go2rtc` в HA — **встроенный в HA Core** (`source: system`), **не аддон**.
- Единственный найденный в истории токен — от **старого HA `192.168.1.14:8123`** (май 2026) → `401`. **Токена от t610 у агента нет.**
**Следующий шаг (ждёт Alex):** long-lived token (профиль → Long-Lived Access Tokens → Create) → агент проверит поток и создаст Generic Camera через API. Либо Alex сам добавляет Generic Camera по URL `http://127.0.0.1:1984/api/stream.mjpeg?src=usb_camera`. Подробности — §5-кватер-И-3.1.
---
## Связанные заметки
- [[family/how-to/home-automation]] — карта Modbus slave ID, ZONT, регистры вентиляции