[2026-09-14] eagle: family/plans/t610-home-automation.md
This commit is contained in:
@@ -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 ЗАКРЕПЛЁН, правка автоматизации душевой ВНЕДРЕНА. Камера — БЛОКИРОВАНА (SSH TrueNAS).** Фикс bridge (T3.5, вечер-6) держится: `dining` стабилен, диагностика снята (вечер-7). **Вечер-8:** ① static-привязка t610 на роутере (`dhcp.@host[1]`, §5-кватер-И-1); ② ночной свет душевой — добавлен триггер на **падение освещённости** + условие присутствия (id `1771997851260`, §5-кватер-И-2); ③ камера — не сделано, SSH на TrueNAS не прошёл (§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). Причина (вечер-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) |
|
||||
| Камера | Контейнер был на TrueNAS, остановлен при восстановлении пула. В Caddy остался мёртвый upstream `192.168.2.197:8090`. **2026-09-14 (вечер-8): попытка начать — БЛОКИРОВАНА**, SSH на TrueNAS не прошёл (`root@.197` → publickey denied; `truenas_admin`+sudo отменена на апруве). См. §5-кватер-И-3, задача A5 |
|
||||
| Камера | **❌ Первоначальная трактовка опровергнута (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 |
|
||||
|
||||
---
|
||||
|
||||
@@ -108,6 +108,7 @@ ha supervisor logs | tail -60 # диагностика сборки local add-
|
||||
| CH340 #1 | `usb-1a86_USB_Serial-if00-port0` | `pci-0000:00:12.0-usb-0:3:1.0-port0` | `/dev/ttyUSB0` | USB1 порт 3 → **вентиляция** ✅ |
|
||||
| CH340 #2 | `usb-1a86_USB_Serial-if00-port0` ⚠️ тот же | `pci-0000:00:12.0-usb-0:4:1.0-port0` | `/dev/ttyUSB1` | USB1 порт 4 → **ZONT** ✅ |
|
||||
| Zigbee Inswift ZBP-MG21 | `usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00` | `pci-0000:04:00.0-usb-0:1:1.0` | `/dev/ttyACM0` | USB3 порт 1 |
|
||||
| **Вебка Logitech `046d:0825`** ({`/dev/video0`}) | `usb-046d_0825_505CE330-video-index0` ⚠️ **by-id стабилен** (serial есть) | `pci-0000:00:12.2-usb-0:1:1.0-video-index0` | — | USB2 порт 1 (`pci-0000:00:12.2`) |
|
||||
|
||||
> 🔴 **Правило проверки привязки = ФИЗИЧЕСКИЙ ТЕСТ.** `dmesg`/`by-path` показывают только «CH340 в порту 3 / в порту 4», но **не говорят, какой кабель к какому прибору идёт**. Надёжно — только выдернуть шнур и посмотреть, какое гнездо отвалилось: `dmesg | grep -iE "ch341|ttyUSB|disconnect" | tail`. (Именно так Alex установил правду за 1 минуту.)
|
||||
|
||||
@@ -1448,11 +1449,47 @@ conditions[1] = is_occupied ← НОВЫЙ
|
||||
> ⚠️ **Питфолл `ha core`:** команды `reload` **нет** (только `check` и `restart`). Перезагрузка автоматизаций/скриптов — **через сервис API** (`/api/services/automation/reload`, `/api/services/script/reload`).
|
||||
> ⚠️ **Питфолл Hermes (снова):** inline `$(cat file)` и jq-выражения со скобками `( … )` в двойных кавычках **ломаются** при передаче. Токен передавать через `-H @file` (файл заголовка), jq-фильтры — простые, без вложенных скобок.
|
||||
|
||||
#### И-3. Камера — 🔴 НЕ ВЫПОЛНЕНО (блокер)
|
||||
#### И-3. Камера — ❌ ПЕРВОНАЧАЛЬНАЯ ГИПОТЕЗА ОПРОВЕРГНУТА, камера = USB-вебка (вечер-8, дописано)
|
||||
|
||||
Дошли до поиска контейнера на TrueNAS — **SSH не прошёл**: `root@192.168.2.197` → `Permission denied (publickey)`; попытка `truenas_admin@192.168.2.197` + `sudo docker` **отменена на апруве** (Alex прислал сообщение вместо апрува). Прав по плану не сделано.
|
||||
**Известное из §1:** контейнер камеры был на TrueNAS, остановлен при восстановлении пула; в Caddy остался мёртвый upstream `192.168.2.197:8090`. План: найти образ/папку → поднять на t610 → поправить upstream в Caddyfile.
|
||||
**Как продолжить:** `ssh -i ~/.ssh/id_rsa truenas_admin@192.168.2.197` + sudo (см. [[family/how-to/truenas-access]]; при неудаче локального IP — через `mallexxx.duckdns.org`).
|
||||
> 🔴 **ОПРОВЕРГНУТО (Alex, вечер-8): камера НЕ сетевая и НЕ контейнер на TrueNAS. Это USB-вебка, физически воткнутая в t610.**
|
||||
> Первоначальная запись «контейнер был на TrueNAS, остановлен при восстановлении пула; мёртвый upstream `192.168.2.197:8090`» — **неверная трактовка**. Alex: *«нахуя ты пытаешься sudo на truenas? камеру на ha настрой»* → *«usb»*. Возня с SSH на TrueNAS и поиск docker-контейнера — **изначально не тот путь**, прекращена.
|
||||
|
||||
**Факты (проверено на t610, `lsusb` + sysfs):**
|
||||
|
||||
| Что | Факт |
|
||||
|---|---|
|
||||
| Модель | **Logitech `046d:0825`** (UVC-вебка, USB-класс `uvcvideo`); `product`/`manufacturer` в дескрипторе **пустые** |
|
||||
| Топология | `/sys/bus/usb/devices/2-1/` (хост `usb2` = EHCI `pci-0000:00:12.2`) |
|
||||
| Узлы | `/dev/video0` (поток), `/dev/video1` (метаданные) — имя `UVC Camera (046d:0825)` |
|
||||
| Стабильный путь | `/dev/v4l/by-id/usb-046d_0825_505CE330-video-index0` (⚠️ **by-id стабилен** — serial `505CE330` есть, в отличие от CH340) |
|
||||
| by-path | `pci-0000:00:12.2-usb-0:1:1.0-video-index0` |
|
||||
| Драйвер | поднят сам, `v4l2-ctl` в HA OS **отсутствует** (форматы смотреть нечем без установки) |
|
||||
|
||||
**Ключевой факт по HA 2026: интеграции `usb_camera` в UI НЕТ.** В списке «Добавить интеграцию» по запросу «USB» не находится; доступны только:
|
||||
- **Generic Camera** (берёт поток по URL — в т.ч. MJPEG/RTSP)
|
||||
- **MJPEG IP Camera**
|
||||
- **Camera Proxy**
|
||||
|
||||
**Почему агент не может завести камеру сам:**
|
||||
1. `usb_camera` — **config-flow интеграция**: настройка живёт в `.storage/core.config_entries`, **YAML-схемы у неё нет** → дописать блок в `configuration.yaml` нельзя, HA его проигнорирует. Правка файлов (`configuration.yaml`, `automations.yaml`) в прошлых сессиях работала именно потому, что те интеграции YAML-based.
|
||||
2. Пройти UI-флоу через API агент может только с **HA long-lived token** — у агента его **нет** (`env` содержит только `EAGLE_DASH_TOKEN`/`PORTAINER_TOKEN`).
|
||||
3. Прямая запись в `.storage/core.config_entries` руками — **внутреннее хранилище HA**, риск битого реестра интеграций; без явного согласия Alex не делать.
|
||||
|
||||
**Рабочие пути (не сделано, выбор за Alex):**
|
||||
|
||||
| Путь | Как | Плюс/минус |
|
||||
|---|---|---|
|
||||
| **A. Вручную в UI** | Alex: Настройки → Устройства и службы → +Добавить → искать «USB Camera» | ❌ **недоступно** — интеграции нет в списке (вечер-8) |
|
||||
| **B. go2rtc-слой** | Создать `/config/go2rtc.yaml`: `streams: {logitech: v4l2:device=/dev/v4l/by-id/usb-046d_0825_505CE330-video-index0}` → рестарт → подключить через интеграцию **go2rtc** (уже стоит в config_entries) или **Generic Camera** по URL `http://127.0.0.1:1984/api/stream.mjpeg?src=logitech` | ✅ агент может сделать конфигом (YAML-based) |
|
||||
| **C. Дай токен HA** | Alex даёт long-lived token → агент проходит config-flow по API сам | ✅ самый быстрый, но нужен токен |
|
||||
|
||||
**Что для распознавания (вопрос Alex *«по таймеру снимки, распознавание можно?»*):**
|
||||
- `usb_camera` — **тупой мост**: поток + `camera.snapshot`, никакой детекции.
|
||||
- Снимки по таймеру — ✅ автоматизацией `camera.snapshot` раз в N мин (нужна уже заведённая `camera.*`).
|
||||
- Детекция объектов (`person`/`cat`…) — **Frigate** (аддон); хочет **RTSP**, а `usb_camera` отдаёт MJPEG → нужен **go2rtc как мост** (V4L2 → RTSP). На USB-вебке Frigate **грузит CPU** (нет аппаратного энкодера) — на t610 надо пробовать.
|
||||
- Лица — `double-take` поверх Frigate.
|
||||
|
||||
**Итог:** камера **физически на месте и видна ядру**, но в HA **не заведена**. Заведено будет через go2rtc (путь B) — тогда же поправить мёртвый upstream `cam.mallexxx.duckdns.org` в Caddyfile.
|
||||
|
||||
---
|
||||
|
||||
@@ -1843,7 +1880,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** | **Камера**: поднять контейнер на t610, поправить upstream в Caddy | 🟡 средний | 🔴 **БЛОКИРОВАНО 2026-09-14:** SSH на TrueNAS не прошёл (`root@.197` → publickey denied; попытка `truenas_admin`+sudo отменена на апруве). Контейнер был на TrueNAS (остановлен при восстановлении пула), в Caddy мёртвый upstream `192.168.2.197:8090`. См. §5-кватер-И-3 |
|
||||
| **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 |
|
||||
|
||||
**Вариант B — Этап 4 целиком** (№5: Caddy upstream → t610 + GPON-редирект → t610 + ZONT MQTT → t610). 🔴 Трогает рабочее → нужно окно и согласование с Alex. **Caddy-часть СДЕЛАНА (§5-кватер-Б/В).**
|
||||
|
||||
@@ -2230,6 +2267,24 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
|
||||
|
||||
---
|
||||
|
||||
### 2026-09-14 (вечер-8, доп.: камера — опровержение гипотезы «контейнер на TrueNAS», камера = USB-вебка)
|
||||
|
||||
**Контекст:** Alex — *«нахуя ты пытаешься sudo на truenas? камеру на ha настрой»* → на уточнение «что за камера» ответ: *«usb»*. Далее: *«заводи-заводи»*, потом *«и как оно? по таймеру снимки, распознавание какое-то можно будет сделать так?»* → на список вариантов: *«да. встроенная»* → в UI интеграции `usb_camera` **не нашлось**, Alex показал скриншот со списком (Generic Camera / MJPEG IP Camera / Camera Proxy) и спросил *«ты точно не можешь ее добавить? ты же сам все до этого настраивал почему через ui только?»* → *«ну инструкцию тогда давай если не можешь сам»*.
|
||||
|
||||
**Что установлено фактом:**
|
||||
- Камера = **USB-вебка Logitech `046d:0825`**, воткнута в t610 → `/dev/video0` + `/dev/video1`, имя `UVC Camera (046d:0825)`, by-id `usb-046d_0825_505CE330-video-index0` (serial `505CE330` — **by-id стабилен**, в отличие от CH340).
|
||||
- **`v4l2-ctl` в HA OS отсутствует** — форматы/разрешения смотреть нечем без установки пакета.
|
||||
- **Интеграции `usb_camera` в HA 2026 в UI НЕТ** — только Generic Camera / MJPEG IP Camera / Camera Proxy.
|
||||
- **Почему агент не сделал сам:** `usb_camera` — config-flow интеграция (нет YAML-схемы, настройка в `.storage/core.config_entries`); пройти флоу по API можно только с **HA long-lived token**, которого у агента **нет**. Прямая правка `.storage` — неоправданный риск.
|
||||
|
||||
**Что сделано:** только разведка + установление фактов. **Правок в конфигах не делалось.** Инструкция для Alex выдана, но упёрлась в отсутствие `usb_camera` в UI.
|
||||
|
||||
**Следующий шаг (ждёт Alex):** путь **B** — `/config/go2rtc.yaml` (`streams: logitech: v4l2:device=...`) → рестарт → подключение через go2rtc/Generic Camera; либо путь **C** — дать агенту long-lived token. См. §5-кватер-И-3.
|
||||
|
||||
> 🔴 **Питфолл (методологический):** «мёртвый upstream в Caddy» ≠ «сервис был сетевым контейнером». Агент по мёртвому upstream `192.168.2.197:8090` **домыслил** сетевую камеру с контейнером на TrueNAS и полез в SSH/sudo — **не тот путь**. Правило (согласуется с USER.md): при непонятном устройстве **спрашивать/проверять физику**, а не строить гипотезу по косвенному признаку.
|
||||
|
||||
---
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[family/how-to/home-automation]] — карта Modbus slave ID, ZONT, регистры вентиляции
|
||||
|
||||
Reference in New Issue
Block a user