[2026-09-14] eagle: family/how-to/home-automation.md family/how-to/truenas-infrastructure.md family/how-to/zont-modbus-bridge-udev-race-protection.md family/plans/t610-home-automation.md
This commit is contained in:
@@ -1977,7 +1977,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
|
||||
| ~~5-арх~~ | ~~«Перенести Caddy на OpenWrt/t610»~~ — **❌ ОТВЕРГНУТО (§5-кватер-Б):** на OpenWrt 80/443 заняты `uhttpd`; у Caddy 17 доменов TrueNAS → при переносе падение t610 положит все медиасервисы. **Caddy остаётся на TrueNAS.** | — |
|
||||
| ~~6~~ | ~~Остановить + отключить автозапуск сервисов на TrueNAS (не удалять — откат). **✅ РАЗБЛОКИРОВАНО 2026-09-14:** условие снято — п. **5-мк СДЕЛАН** (ZONT MQTT → t610). **Гасим ТОЛЬКО стек автоматизации:** `homeassistant` (8123), `mbusd` (502), `mosquitto` (1883), `nodered` (1880), + `zigbee2mqtt`/`modbus-bridge` если есть. **🔴 Caddy НЕ ГАСИТЬ и не переносить** — он не в списке, он рабочий элемент (17 доменов TrueNAS + `mallexxx.*` → t610) | **🔄 АУДИТ ПРОВЕДЁН 2026-09-14 (см. §5-кватер-Л).** Факты: `zigbee2mqtt` (Exited 2) и `modbus-bridge` (Exited 0) легли **синхронно 14.09 01:59** — сами, при переносе USB на t610; `mbusd` формально `Up` но спамит `can't open /dev/ttyUSB0` (адаптеров на TrueNAS НЕТ — в `/sys/bus/usb` только принтер Samsung `04e8:3425`); `homeassistant` Up, но `modbus.host=.197` → холостой. **Гасить (stop + `--restart=no`, НЕ `rm`):** `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`. **Caddy НЕ трогать.** Побочная находка: `HA_TOKEN` открытым текстом в compose `modbus-bridge`. **Ждёт решения Alex:** `nodered` сразу или страховка 2 дня | **✅✅ ВЫПОЛНЕНО 2026-09-14 (ночная сессия).** Alex: «Гасим nodered» + «ser2net тоже гасить» + «inpxer не трогай». **Погашено 7 контейнеров** (`docker stop` + `docker update --restart=no`, **НЕ `rm`**, папки `docker/*` целы): `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`, **`ser2net`**. Все → `restart=no` / `exited`. **Проверено:** порты 502/1883/8123/1880 на TrueNAS **свободны**; `mallexxx.duckdns.org` **HTTP 200**; MQTT `modbus/#` на t610 живой (`23.11`/`25.04`); RTSP камеры `:8554` OPEN; `.197:502` CLOSED. **Caddy НЕ тронут.** `inpxer` / `inpx-web` / `library` по указанию Alex **НЕ трогались**. Полный разбор — **§5-кватер-Л** |
|
||||
| ~~7~~ | ~~Static IP для t610 на роутере (сейчас DHCP)~~ — **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-1):** `dhcp.@host[1]` = `t610` / MAC `9c:8e:99:ef:3f:c5` / `192.168.2.176`, бэкап `/root/dhcp.bak-20260914-104152` | ✅ закрыто |
|
||||
| 8 | Бэкап конфигов t610 → Mac + TrueNAS + git (Gitea `git.mallexxx.duckdns.org`). **📌 Добавить в бэкап:** `/config/.storage/http` (фикс `trusted_proxies`), сам `Caddyfile`, `/config/go2rtc.yaml` (камера + поворот `#rotate=90`), `/config/automations.yaml`, а также `data/config.template.tmpl` аддона `modbus-bridge` (там живёт маппинг реле котла) | **✅ СДЕЛАНА ЧАСТЬ 1/3 (2026-09-14):** git-синк в Gitea (`~/Automation/HA-ZONT-Modbus`, коммит `9d31118`, 4 файла: `configuration.yaml`, `automations.yaml`, `go2rtc.yaml`, `config.yml`). **✅ ЧАСТЬ 2/3 — АВТОБЭКАП НА TRUENAS РАБОТАЕТ** (см. §5-кватер-К). Осталась часть 3/3: копия на Mac. **⚠️ Caddyfile в автобэкап НЕ входит** — он на TrueNAS, не на t610 (учесть отдельно) |
|
||||
| ~~8~~ | ~~Бэкап конфигов t610 → Mac + TrueNAS + git (Gitea `git.mallexxx.duckdns.org`). **📌 Добавить в бэкап:** `/config/.storage/http` (фикс `trusted_proxies`), сам `Caddyfile`, `/config/go2rtc.yaml` (камера + поворот `#rotate=90`), `/config/automations.yaml`, а также `data/config.template.tmpl` аддона `modbus-bridge` (там живёт маппинг реле котла)~~ — **✅✅ ЗАКРЫТО ПОЛНОСТЬЮ (2026-09-14, ночная сессия): все 3/3 части сделаны.** ① **git-синк** в Gitea (`~/Automation/HA-ZONT-Modbus`, коммит `9d31118`, 4 файла: `configuration.yaml`, `automations.yaml`, `go2rtc.yaml`, `config.yml`); ② **автобэкап на TrueNAS** — крон юзером `nas` 03:30 ежедневно, ротация 14 (`[[family/plans/t610-backup-to-truenas]]`); ③ **копия на Mac** — ✅ **СДЕЛАНА (подтверждено Alex 2026-09-14)**. **⚠️ Caddyfile в автобэкап НЕ входит** — он на TrueNAS, не на t610 (учесть отдельно) | ✅ закрыто |
|
||||
| ~~9~~ | ~~**Zigbee-реле котла → modbus-bridge**~~ — **✅✅ ВЫПОЛНЕНО + ПОДТВЕРЖДЕНО ALEX 2026-09-14 (вечер-13, §5-кватер-И-7):** `switch.boiler_controller_power` = **`slave 104, рег. 1`** (bidirectional). Бэкап `.bak-relay-20260914-200827` | ✅ закрыто |
|
||||
|
||||
**✅ Закрыто в этой сессии (2026-09-14, поздняя):**
|
||||
@@ -1996,7 +1996,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
|
||||
- **📹 Поворот камеры 90°** — `#rotate=90` в `/config/go2rtc.yaml` (нативный параметр go2rtc, работает при транскодинге). Поток стал `480x640`, кадр проверен, CPU `load 0.20`. **Alex: «Все хорошо, в ту»** — направление подтверждено. Канон — §5-кватер-И-6 (КАНОН-2). Бэкап `/config/go2rtc.yaml.bak-rotate-20260914-202817`, скрипт `~/tmp-t610/relay/patch_rotate.py`.
|
||||
- **📹 B3 / Этап 4 закрыт** — факт-проверка роутера: `firewall.@redirect[0]` (MQTT) и `@rule[3]` `dest_ip=192.168.2.176` (ZONT MQTT → t610). Отдельного «GPON-роутера» нет.
|
||||
- **📹 Caddy ПЕРЕСТРОЕН** — из `Caddyfile` убраны `cam.*` (камера на t610 по RTSP) и `nodered.*` (ingress HA); на t610 ведёт **только** `mallexxx.duckdns.org` → `192.168.2.176:80`. Обновлён [[family/how-to/truenas-infrastructure]].
|
||||
- **⚠️ ОСТАЛОСЬ 1 пункт:** ① **п.8** — бэкап конфигов t610 (A3) → **✅ ЗАКРЫТ по факту 2026-09-14 (v4, см. [[family/plans/t610-backup-to-truenas]]):** git-синк (`9d31118`) + автобэкап на TrueNAS работает (датасет `backup/t610` `nas:nas`, SMB-шара `t610` id=3, pull-ключ в `backup/t610/.ssh/`, скрипт v4, крон id=3 `nas` 03:30, архив ~6 МБ / 162 файла → rclone → Mail.ru). **Хвост:** копия на Mac (часть 3/3) + `Caddyfile` (живёт на TrueNAS, не в t610-бэкапе); ② **п.6** — погасить на TrueNAS стек автоматизации (`homeassistant`/`mbusd`/`mosquitto`/`nodered`) — **РАЗБЛОКИРОВАН** (5-мк закрыт), **Caddy не гасить**. Хвост: ротация токена из remote `nolvu-landing`; в роутере `redirect[1]` HA `8123`→`.197` помечен `enabled='0'` — мёртвый, можно удалить.
|
||||
- **✅✅ ОСТАЛОСЬ 0 пунктов (2026-09-14, ночь):** ① **п.8** — бэкап конфигов t610 (A3) → **✅ ЗАКРЫТ ПОЛНОСТЬЮ 3/3:** git-синк (`9d31118`) + автобэкап на TrueNAS (крон `nas` 03:30, ротация 14 → rclone → Mail.ru) + **копия на Mac (часть 3/3 сделана, подтверждено Alex 2026-09-14)**. См. [[family/plans/t610-backup-to-truenas]]. **Хвост:** `Caddyfile` в t610-бэкап не входит (он на TrueNAS — учесть отдельно); ② **п.6** — погасить на TrueNAS стек автоматизации → **✅ ВЫПОЛНЕНО 2026-09-14 (ночь), §5-кватер-Л:** погашено 7 контейнеров (`homeassistant`/`mbusd`/`mosquitto`/`nodered`/`zigbee2mqtt`/`modbus-bridge`/`ser2net`) + `library` по команде Alex, **Caddy не тронут**. **Остаток хвостов:** ротация токена из remote `nolvu-landing`; в роутере `redirect[1]` HA `8123`→`.197` помечен `enabled='0'` — мёртвый, можно удалить; `inpx-web`/`inpxer` в циклическом краше (не трогать).
|
||||
- **✅ Синк конфигов в git (2026-09-14, ночь):** репозиторий `~/Automation/HA-ZONT-Modbus` → Gitea `git_admin/HA-ZONT-Modbus`, коммит **`9d31118`** (запушен, remote SHA = local). Синкнуто фактически изменившееся: `configuration.yaml` (http-блок → `.storage/http`; `modbus.host` `.197`→`.176`), `automations.yaml` (`device_id` перегенерированы, `light.0xa4c13882a4b42db0`→`light.bed_dimmer`, +`illuminance`, +`is_occupied`), **новый** `homeassistant/go2rtc.yaml`, `config.yml` (+реле котла slave 104/рег 1). `modbus_ha_bridge.py` и `scripts.yaml` — уже совпадали по sha256. **Паттерн: сначала sha256 прод↔репо, потом тянуть только diff.**
|
||||
|
||||
**✅ Закрыто / установлено в этой сессии (2026-09-14, позднейшая, Modbus-диагностика):**
|
||||
@@ -2299,7 +2299,7 @@ curl -o /dev/null -w "%{http_code} %{content_type}\n" "http://192.168.2.176:8090
|
||||
`/config/configuration.yaml.bak-cam-20260914-180801` (до блока), `.bak-camdev-20260914-181945`, `.bak-camdev2-*` (перед сменой input).
|
||||
|
||||
### 🧹 Осталось убрать
|
||||
- `/config/go2rtc.yaml` — **создан по ошибке, HA его не читает.** Удалить (спросить Alex).
|
||||
- ~~`/config/go2rtc.yaml` — **создан по ошибке, HA его не читает.** Удалить (спросить Alex).~~ → **❌ ОТМЕНЕНО (2026-09-14, вечер-13, подтверждено фактом ночной сессией): файл УДАЛЯТЬ НЕЛЬЗЯ.** Он **нужен аддону `a889bffc_go2rtc-hardware`** (AlexxIT) — тот читает именно `/config/go2rtc.yaml`. Факт-проверка: файл существует, **1333 б, `-rw------- root:root`, mtime 20:28**, внутри финальный конфиг камеры (`usb_camera_h264: ffmpeg:device?video=/dev/video0&input_format=mjpeg&video_size=640x480#video=h264#rotate=90`). Прежняя пометка «создан по ошибке, HA его не читает» верна **только для встроенного go2rtc HA Core** (тот генерирует свой `/tmp/go2rtc_XXXX.yaml` и `/config/`-файл игнорирует). **Актуальный канон — §5-кватер-И-6 (КАНОН-2).**
|
||||
|
||||
### 🔑 HA Long-Lived Access Token (t610)
|
||||
Выдан Alex'ом 2026-09-14. Хранится: `~/tmp-t610/ha_token.txt` (локально), этот док.
|
||||
@@ -2885,11 +2885,11 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
|
||||
|
||||
**Новые питфоллы (см. §5-кватер-И-3/И-5):** HA на t610 слушает **порт 80** (не 8123) — все REST-вызовы туда; из SSH-аддона Core недоступен (сетевая изоляция) → API вызывать с Mac; обход маскировщика — токен в файл + `read -r` (не `$(...)`) + заголовок из кусков; `pip install websocket-client` нужен **без** `--user` (venv).
|
||||
|
||||
**Осталось:** удалить `/config/go2rtc.yaml` (ждёт команды); снять устаревшую строку `cam.*` из `truenas-infrastructure.md`.
|
||||
**Осталось:** ~~удалить `/config/go2rtc.yaml` (ждёт команды)~~ → **❌ ОТМЕНЕНО (вечер-13, подтверждено фактом): файл НЕ удалять, он нужен аддону `go2rtc-hardware`.** Строка `cam.*` из `truenas-infrastructure.md` — ✅ снята.
|
||||
|
||||
### 2026-09-14 (вечер-9-продолжение): unique_id, зона котельной, `Resource busy`
|
||||
Разбор вопроса Alex «это штатный и единственный способ добавить usb камеру?». **Проверено по первоисточникам:** у `camera.ffmpeg` **нет** поля `unique_id` (только `input`/`name`/`extra_arguments`) → сущность не попадает в `entity_registry` → **зону (`kotelnaia`) назначить нельзя** (`Entity not found`). Это **штатное ограничение**, а не дефект (офиц. FAQ HA: «This is not an error»). Generic Camera отвергает все локальные входы (`/dev/video0`, `ffmpeg:`, `v4l2:`, `file://` → `relative_url`). **Итог: для USB-вебки штатный путь ОДИН — `camera: platform: ffmpeg`.** ⚠️ **ЭТОТ ВЫВОД ❌ ОПРОВЕРГНУТ вечер-11** — верен был лишь в рамках «Core сам открывает устройство». Схема «внешний MJPEG-сервис + Generic Camera по URL» даёт и `unique_id`, и зону (см. запись вечер-11 выше). Также пойман и устранён новый питфолл: пробы Generic Camera держали `/dev/video0` → `Resource busy` → камера 500; лечение `ha core restart`. Полный разбор — **§5-кватер-И-5** и «Питфоллы» в §5-кватер-И-3.
|
||||
**Осталось (ждёт Alex) — ✅ ОБА ВОПРОСА ЗАКРЫТЫ вечер-11:** камера **переименована** в «Камера котельной» и **получила зону** `kotelnaia` (через Generic Camera, а не переименованием); лишний `/config/go2rtc.yaml` — **всё ещё на месте**, ждёт команды на удаление.
|
||||
**Осталось (ждёт Alex) — ✅ ЗАКРЫТО:** камера **переименована** в «Камера котельной» и **получила зону** `kotelnaia` (через Generic Camera, а не переименованием); ~~лишний `/config/go2rtc.yaml` — **всё ещё на месте**, ждёт команды на удаление~~ → **❌ ОТМЕНЕНО (вечер-13, подтверждено фактом): файл НЕ лишний — он нужен аддону `a889bffc_go2rtc-hardware` и содержит боевой конфиг камеры с `#rotate=90`. Удаление сломало бы камеру.**
|
||||
|
||||
### 2026-09-14 (вечер-9): USB-камера заведена в HA — ⚠️ схема ПОЗЖЕ ЗАМЕНЕНА (вечер-11)
|
||||
**Итог того момента:** камера работала через `camera: platform: ffmpeg` + `input: /dev/video0` в `configuration.yaml` → `camera.usb_camera`, кадр JPEG 640×480. Опровергнуты 5 путей (go2rtc-файл, go2rtc-интеграция, Generic Camera, `usb_camera`, by-id-путь).
|
||||
@@ -3383,7 +3383,7 @@ docker update --restart=no <те же 7>
|
||||
|
||||
- 🔴 **`rm` НЕ делали.** Папки `/mnt/RED_2TB/docker/{ha,mbusd,mosquitto,nodered,zigbee2mqtt,modbus-bridge,ser2net}/` **целы** — откат = `docker start` + `docker update --restart=unless-stopped`.
|
||||
- 🔴 **Caddy НЕ тронут** (17 доменов TrueNAS + `mallexxx.*` → t610).
|
||||
- **`inpxer` / `inpx-web` / `library` — НЕ трогались** (Alex: «inpxer не трогай»).
|
||||
- **`inpxer` / `inpx-web` — НЕ трогались** (Alex: «inpxer не трогай»). **`library` — погашен ПОЗЖЕ, отдельной командой Alex** (см. Л-4 п.1), в первую волну 7 контейнеров не входил.
|
||||
|
||||
### Л-3. Верификация (после гашения)
|
||||
|
||||
@@ -3400,7 +3400,7 @@ docker update --restart=no <те же 7>
|
||||
|
||||
### Л-4. ⚠️ Найденные минные поля (НЕ трогались — отдельное решение Alex)
|
||||
|
||||
1. 🔴 **`library` рестартует циклически — `RestartCount=29745`.** Caddy на него ссылается (`library.mallexxx.duckdns.org → library:8080`, basic_auth `books-admin`) → **домен сейчас мёртв**. Создан 24.08 09:11, падает непрерывно.
|
||||
1. ✅ **`library` — ПОГАШЕН 2026-09-14 (по команде Alex).** Был в циклическом краше: `RestartCount=29752`, `state=restarting`, `restart=unless-stopped`. Caddy на него ссылается (`library.mallexxx.duckdns.org → library:8080`, basic_auth `books-admin`) → **домен сейчас мёртв** (и был мёртв до гашения). Сделано: `docker stop library` + `docker update --restart=no` → `state=exited`, `restart=no`. **Не удалён**, папка `/mnt/RED_2TB/docker/library/` цела. **Открыто:** почему падал (образ `library-app:latest` из `build: .` — локальная сборка, тот же паттерн, что утраченный `cups-splix`/камера при пересоздании пула) — копать при отдельной задаче.
|
||||
2. 🔴 **Конфликт порта 502 (устранён гашением).** До гашения: `mbusd` и `ser2net` **оба** мапили `0.0.0.0:502`, **оба** просили `/dev/ttyVent:/dev/ttyUSB0`. `ser2net` в `Created` → при старте **порт был бы занят**. Теперь оба `restart=no`, конфликт снят.
|
||||
3. 🔴 **`inpx-web` (порт 18081) и `inpxer` (порт 18080) — оба `Exited (1)`, `RestartCount=13`.** Caddy: `books.mallexxx.duckdns.org → 192.168.2.197:18080` → **ведёт в мёртвый `inpxer`**. По указанию Alex **не трогались**.
|
||||
4. ⚠️ **Секрет открытым текстом:** `HA_TOKEN` (long-lived HA, `eyJhbG...wkME`) прямо в `/mnt/RED_2TB/docker/modbus-bridge/docker-compose.yml` → `environment`. Кандидат на вынос в `.env` + ротацию. Также `MQTT_PASS: mqtt1z3$` там же.
|
||||
@@ -3409,6 +3409,6 @@ docker update --restart=no <те же 7>
|
||||
|
||||
- [ ] Откат при необходимости: `docker start <name>` + `docker update --restart=unless-stopped <name>`
|
||||
- [ ] **Удаление** — отдельным шагом, не раньше чем через 2–3 дня стабильной работы (Alex: сначала «остановить, не удалять»)
|
||||
- [ ] Разобраться с `library` / `inpx-web` / `inpxer` (минные поля Л-4)
|
||||
- [ ] Разобраться с `inpx-web` / `inpxer` (минное поле Л-4 п.3; `library` уже погашен)
|
||||
- [ ] Вынести `HA_TOKEN` из compose в `.env` + ротация
|
||||
- [ ] Ротация токена из remote `nolvu-landing` (хвост п.3-гт)
|
||||
|
||||
Reference in New Issue
Block a user