diff --git a/family/plans/t610-home-automation.md b/family/plans/t610-home-automation.md index 322b0bb7..f7de112b 100644 --- a/family/plans/t610-home-automation.md +++ b/family/plans/t610-home-automation.md @@ -3521,3 +3521,78 @@ ha core start **Верификация (подтверждено):** HA поднялась, `mallexxx.duckdns.org` = **200**, на диске все 5 полей записаны верно. **Осталось проверить (апрув истёк):** через `/api/config` — что движок отдаёт новые координаты + `unit_system.metric`; и что `weather.*` даёт данные **для Новосибирска**, а не для Польши. + +--- + +## §5-кватер-П. 🐞 Реле котла: ZONT «обрыв связи» при рабочем вкл/выкл — НАЙДЕНО И ИСПРАВЛЕНО (2026-09-14, ночь) + +**Триггер:** Alex — *«не совсем работает связка zont и реле адаптеров котлов: вкл/выкл проходит но zont докладывает про обрыв связи»* → *«Возможно нужно перезапустить с дебаг лог параметром»* → *«В папке проекта»*. + +### П-1. Симптом + +`switch.boiler_controller_power` (Zigbee, `slave 104 / рег. 1`) **включался и выключался нормально**, но **ZONT докладывал обрыв связи**. Запись работала, **чтение — нет**. + +### П-2. Диагностика (дебаг-лог) + +Включён `MODBUS_DEBUG_RAW=1` в `/addons/modbus-bridge/run.sh` (был закомментирован на строке 40; бэкап `run.sh.bak-debug-20260914-225404`), затем `ha apps restart local_modbus-bridge`. + +**Найдено в живом логе (supervisor API):** +``` +HA poll -> sensor.office_temperature_sensor_temperature = 23.47 ✅ +HA poll exception for switch.boiler_controller_power: could not convert string to float: 'on' ❌ +``` + +### П-3. 🔴 КОРНЕВАЯ ПРИЧИНА (одна строка) + +`modbus_ha_bridge.py`, строка **556** в `ha_poller()`: +```python +val = float(r.json()["state"]) # ← падает на 'on' +``` + +Для `switch` HA отдаёт `state: "on"`/`"off"` — **строку**, а не число. `float('on')` → **исключение** → значение **не попадает** в `last_values[("ha", ent)]` → bridge **не может ответить** на `READ COILS` от ZONT → **ZONT трактует как обрыв связи**. + +Для датчиков (`sensor.*`) `float()` законен → ломается **только реле**. Запись идёт другим путём (`switch.turn_on/off`) → поэтому «вкл/выкл проходит». + +### П-4. Фикс + +`modbus_ha_bridge.py` (репо `~/Automation/HA-ZONT-Modbus`), fallback-парсер: +```python +state = r.json()["state"] +try: + val = float(state) +except (TypeError, ValueError): + s = str(state).strip().lower() + if s in ("on", "true", "yes", "open", "home"): + val = 1.0 + elif s in ("off", "false", "no", "closed", "not_home"): + val = 0.0 + else: + raise ValueError(f"unparsable state: {state!r}") +``` +Дальше `value_map` (`0→0, 1→1, 256→0, 512→1`) отрабатывает штатно. + +**Коммит:** `051b019` — *«Fix HA poller: parse string states (on/off) for switch entities»* (+11/−1). **Push OK, SHA local == remote** (`051b019babb2d3b83f743481c904c1ec7f935608`). + +**Деплой (канон):** правка **в репо** → `python3 -m py_compile` (синтаксис) → `scp` в `/addons/modbus-bridge/modbus_ha_bridge.py` → сверка `sha256` local↔prod (`05fe70f4…`) → `ha apps rebuild local_modbus-bridge` → `ha apps restart`. + +### П-5. Верификация (подтверждено фактом) + +| Проверка | Результат | +|---|---| +| До патча (лог, стр. 130/345) | `HA poll exception ... could not convert string to float: 'on'` ❌ | +| **После патча (стр. 576/774/1106/1382)** | **`HA poll -> switch.boiler_controller_power = 1.0`** ✅ | +| Исключения после рестарта | **0** (оставшиеся 2 — история до перезапуска, лог кольцевой) | +| ZONT опрашивает `slave 104` | каждые **10 с**, `READ COILS`, **без обрывов** ✅ | +| Дебаг-лог | `[RAW 1]`, `[RAW 7]` — сырые байты видны ✅ | + +**Бэкапы:** `run.sh.bak-debug-20260914-225404`, `modbus_ha_bridge.py.bak-switchparse-20260914-225821` (prod). +**Откат:** вернуть бэкапы + `ha apps rebuild/restart`. + +### П-6. 📌 ПИТФОЛЛЫ (важно) + +1. **`MODBUS_DEBUG_RAW=1`** в `run.sh` — главный инструмент. Даёт сырые байты (`[RAW N] ...`), без него framing не виден. **После отладки выключить** (шумный, жрёт лог). +2. **`python3` в SSH-аддоне ОТСУТСТВУЕТ** (`python3: command not found`) — патч-скрипты на Python там не запускаются. Править **файлы в репо на Mac**, затем `scp`. +3. **`docker` из SSH-аддона недоступен** (`docker: command not found`) — внутрь контейнера не заглянуть, только логи через API. +4. **Живой лог — только supervisor API:** `http://supervisor/addons//logs` (из аддона; `127.0.0.1:80` НЕ виден — аддон в изолированной сети `172.30.33.1`). `?lines=1500` — тянуть больше строк (по умолчанию отдаёт ~100). +5. **Источник истины для реле = репо `~/Automation/HA-ZONT-Modbus`.** Правки кода — там, не в `~/tmp-t610/` и не на t610 напрямую. +6. **`source: "ha"` означает «bridge сам поллит HA-сущность»**, а не «читает с шины». Признак работы — строка `HA poll -> = ` в логе.