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

This commit is contained in:
Alexey Martemyanov
2026-09-14 22:01:16 +06:00
parent 1230aab0b3
commit 2961b3f308
+75
View File
@@ -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/<slug>/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 -> <entity> = <val>` в логе.