[2026-09-14] eagle: family/how-to/t610-access.md family/plans/home-automation-migration-t610.md family/plans/t610-addons-deployment.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 13:46:58 +06:00
parent 3ceebed695
commit 1a715a65e4
3 changed files with 57 additions and 19 deletions
+51 -14
View File
@@ -7,7 +7,7 @@
> ✅ **Состояние на 2026-09-14 (Этап 3 ЗАКРЫТ, z2m = 15 устройств):** z2m, mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция**. **HA-конфиг перенесён с TrueNAS** (`.storage` реестры + конфиги + `www/`): HA запущен, **11 зон, MQTT-интеграция цела, ошибок нет**. Zigbee-розетки добавлены: `heating_cable_plug` (NEO NAS-WR01B, греющий кабель) и **`boiler_controller_power`** (`0xa4c1381694217e10`, TS011F, Котельная — питание контроллеров котлов), мёртвые устройства (3 шт.) **удалены из z2m**. Реестр HA = **332 сущности, hex = 0**. **Зоны проставлены у 18 устройств.**
> ✅ **Автоматизации: 16 шт., 15 `on` + 1 `off`, 0 `unavailable`** (было 13 «мёртвых» — `device_id` перемаплены + hex-`entity_id` почищен **и в триггерах**).
> ✅ **HTTP-варнинг устранён** (блок `http:` → `.storage/http`), **`modbus.host` = `192.168.2.176`** (НЕ `127.0.0.1` — см. питфолл ниже), **modbus-bridge 404 исправлены** (+rebuild аддона).
> **ОСТАЛСЯ ОДИН БЛОКЕР — аппаратный:** 32 заслонки вентиляции `unavailable` (шина не отвечает, exception 0x0B) → CH340 #2 нужно физически подключить к линиям A/B шины. Конфиг верный. **Разбор доведён 2026-09-14:** mbusd слушает 502, TCP принимает соединения, но лог показывает только `conn_open/close` (ни байта в serial), Modbus-запрос к slave 11 → пусто. См. §«Диагностика шины вентиляции (mbusd)».
> **ОШИБКА В ПРЕДЫДУЩЕЙ РЕДАКЦИИ — ИСПРАВЛЕНО 2026-09-14 (поздняя сессия).** Ранее здесь было записано «блокер аппаратный: шина не подключена, работа за Alex». **ЭТО НЕВЕРНО — шина вентиляции РАБОТАЕТ.** Прямая проверка Modbus-запросами (регистры **из конфига HA**, не reg 0!) дала живые ответы: `slave 11 reg 5 → OK data=640001`, `slave 11 reg 8 → OK`, `slave 12 reg 1 → OK data=640001`, `slave 10 → OK` (значение 100), `slave 2 → OK`, `slave 3 → OK`, `slave 20 → OK`. Ответы **нестабильны** (то `OK`, то `EXC 0x0B`) — вероятная причина: короткий `timeout` mbusd (1000 мс) + `retries 3`, тогда как реле-модули заслонок отвечают медленно. **Что осталось выяснить:** почему HA не получает эти данные, хотя снаружи они есть (смотреть лог `homeassistant.components.modbus` в HA, а не mbusd). См. §«Диагностика шины вентиляции (mbusd)».
> 🔑 **CH340 привязывать ТОЛЬКО по `by-path`.** Доказано: у двух CH340 нет серийников → в `/dev/serial/by-id/` для них **один общий симлинк** (ведёт на `ttyUSB1`, на `ttyUSB0` ссылки нет). 🔴 Перепутывание кабелей CH340 #1/#2 **не даст ошибки** — аддоны поднимутся, но будут работать не с теми шинами. См. §«ГЛАВНЫЙ ПИТФОЛЛ».
>
> 🔑 **Ключевой вывод:** HA связывает сущности по **`unique_id`**, а не по `entity_id`. Смена `friendly_name` в z2m **сохраняет человеческие `entity_id`** — дублей нет.
@@ -298,24 +298,61 @@ ZONT (modbus-bridge): /dev/serial/by-path/pci-0000:00:12.0-usb-0:3:1.0-por
> ✅ **Плюс аддонов:** старая проблема гонки udev ([[family/how-to/zont-modbus-bridge-udev-race-protection]]) на t610 **неактуальна** — Supervisor сам ждёт устройство при старте аддона, скрипты ожидания tty не нужны.
## Диагностика шины вентиляции (mbusd) — состояние на 2026-09-14
## Диагностика шины вентиляции (mbusd) — ИСПРАВЛЕНО 2026-09-14 (поздняя сессия)
**mbusd настроен ВЕРНО, проблема аппаратная.** Полный разбор (чтобы не переделывать):
> 🔴 **ВНИМАНИЕ: предыдущая версия этого раздела была ОШИБОЧНОЙ.** Два ложных вывода, оба опровергнуты:
> 1. ~~«проблема аппаратная, линии A/B не подключены / шина обесточена, работа за Alex»~~ → **НЕВЕРНО. Шина работает, устройства отвечают.**
> 2. ~~«в логе mbusd только `conn_open/close` → запросы до порта не доходят»~~ → **НЕВЕРНО. Эти `conn_open` от `192.168.2.157` — МОИ СОБСТВЕННЫЕ запросы: Mac сидит за роутером, и через NAT все запросы к `192.168.2.176:502` выглядят как трафик от `.157` (роутер «Rasputin», eth0 `192.168.2.157`). Никакого «постороннего клиента, который жрёт слоты mbusd» не существует.**
### Как проверять шину ПРАВИЛЬНО
**Ключевая ошибка:** слать Modbus-запрос на **reg 0**. В конфиге HA заслонки читаются с **reg 5, 7, 8** (и т.д.), а не с 0. У молчащего устройства ответа не будет ни на одном регистре, у живого — ответ по своим регистрам. **Сначала смотреть адреса в конфиге:**
```bash
ssh root@192.168.2.176 "sed -n '95,130p' /config/configuration.yaml"
# у заслонок: slave: 11, address: 5 / 7 / 8, write_type: holding, command_on: 256, command_off: 512
```
**Проверка (Python, TCP на mbusd):**
```python
import socket, struct
def rd(slave, addr, qty=1, timeout=4):
pdu = struct.pack('>BHH', 3, addr, qty)
mbap = struct.pack('>HHHB', 1, 0, len(pdu)+1, slave)
s = socket.create_connection(('192.168.2.176', 502), timeout=timeout)
s.sendall(mbap+pdu); r = s.recv(256); s.close()
return 'OK '+r[9:].hex() if len(r)>=9 and not (r[7]&128) else 'EXC 0x%02X' % r[8]
```
**Фактические результаты (2026-09-14):**
| Slave | Что это (по [[family/how-to/home-automation]]) | reg | Ответ |
|---|---|---|---|
| **11** | **Relay module — заслонки** (спальня/гостиная/детская/кухня) | 5 | ✅ `OK data=640001` |
| **11** | | 8 | ✅ `OK data=00` |
| **11** | | 7 | ❌ `EXC 0x0B` |
| **12** | **Relay module — заслонки 2** (кабинет/север/вытяжки) | 1 | ✅ `OK data=640001` |
| **10** | Vent control (AT2 вентиляторы) | — | ✅ `OK` (значение 100) |
| **2, 3** | датчики Детская / Спальня | — | ✅ `OK` |
| **20** | Газ котёл вкл | — | ✅ `OK` |
**Вывод:** шина вентиляции **живая**, mbusd **работает**, заслонки (11, 12) **отвечают**. Ответы **нестабильны** — один и тот же slave на reg 5 отвечает, на reg 7 нет.
**Гипотеза причины нестабильности:** `timeout = 1000 мс` в mbusd слишком короткий — реле-модули заслонок отвечают медленнее, mbusd не дожидается и отдаёт `0x0B` (`GATEWAY TARGET DEVICE FAILED TO RESPOND`). **Что делать:** поднять `timeout` до 3000 мс, `retries` снизить до 1, перезапустить `local_mbusd`, проверить, уйдут ли `unavailable` из HA.
**Что остаётся невыясненным:** почему HA видит `unavailable`, если снаружи данные приходят (44 `unavailable`: ~32 заслонки `intake_damper_*`/`exhaust_damper_*` + вентиляторы `fan_3_*`/`fan_at2_*`). **Смотреть нужно лог HA** (`homeassistant.components.modbus`, `pymodbus`), а НЕ лог mbusd — mbusd как транспорт исправен.
### Актуальные проблемы (не путать с «аппаратным блокером»)
| Проверка | Команда | Результат |
|---|---|---|
| Аддон запущен | `ha apps info local_mbusd` | `state: started` |
| Порт слушается | `nc -z 192.168.2.176 502` | ✅ **открыт** |
| Устройство в опциях | `ha apps info local_mbusd \| grep -A8 'options:'` | `device: /dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4) ✅ |
| Параметры | там же | speed 9600, mode 8n1, retries 3, timeout 1000, trx `addc` |
| Modbus-запрос к slave 11 | `printf '\x0b\x03\x00\x00\x00\x01\xd5\xba' \| nc 192.168.2.176 502` | ❌ **пусто (нет ответа)** |
| Лог mbusd | `ha apps logs local_mbusd \| tail -20` | только `conn_open()`/`conn_close()`**запросы до порта не доходят** |
| Аддон запущен | `ha apps info local_mbusd` | `state: started` |
| Порт слушается | `nc -z 192.168.2.176 502` | ✅ открыт |
| Устройство | `ha apps info local_mbusd \| grep -A8 'options:'` | `by-path ...0:4:1.0-port0` (CH340 #2, порт 4) ✅ |
| Параметры | там же | speed 9600, mode 8n1, **timeout 1000** ⚠️, retries 3, trx `addc` |
| Шина отвечает | Python-запрос на reg из конфига HA | ✅ **ДА** (см. таблицу выше) |
**Интерпретация:** TCP-уровень работает (соединение принимается, `conn_open` от `192.168.2.176`, `172.30.32.1`, `192.168.2.157`), но **по serial-шине обмена нет** → Modbus RTU не получает ответов от slave 11 (заслонки). HA показывает exception **0x0B** = `GATEWAY TARGET DEVICE FAILED TO RESPOND`.
**Вывод: конфиг верный, дело в физике.** Варианты: линии **A/B** вентиляционной шины не подключены к CH340 #2, либо шина обесточена, либо неверны slave-адреса/скорость. **Работа за Alex** — проверить физическое подключение CH340 #2 к шине вентиляции.
> ⚠️ Проверить, что CH340 #2 действительно смотрит на вентиляцию (а не перепутан с ZONT), **без физического вмешательства нельзя** — на шине вентиляции никто не отвечает, эталонного трафика для сравнения нет. См. §«ОПАСНОСТЬ ТИХОГО СБОЯ» выше.
> ⚠️ **Не путать при диагностике:** раньше бытовало мнение «в логе mbusd `conn_open/close` от `.157` = посторонний клиент забивает слоты». **Это ложный след.** `.157` — это eth0 роутера Rasputin, через который идёт весь трафик из локалки 192.168.2.x; источник — сам Mac. Источник в логе mbusd — всегда адрес того, кто реально открывает TCP-соединение. ⚠️ **Также:** `nc` на OpenWrt (busybox) не поддерживает `-z` — для проверок портов с роутеров использовать `curl`/`wget`.
>
> ️ **Конфиг HA modbus:** `configuration.yaml` → `modbus: [{name: rtu_bus, type: tcp, host: 192.168.2.176, port: 502}]`. Slave 10 (AT2 fans) **закомментирован** в конфиге с пометкой «not responding on vent bus» — чтобы не блокировать опрос заслонок. После починки шины — раскомментировать.