[2026-09-14] eagle: family/plans/t610-home-automation.md
This commit is contained in:
@@ -3521,3 +3521,78 @@ ha core start
|
|||||||
|
|
||||||
**Верификация (подтверждено):** HA поднялась, `mallexxx.duckdns.org` = **200**, на диске все 5 полей записаны верно.
|
**Верификация (подтверждено):** HA поднялась, `mallexxx.duckdns.org` = **200**, на диске все 5 полей записаны верно.
|
||||||
**Осталось проверить (апрув истёк):** через `/api/config` — что движок отдаёт новые координаты + `unit_system.metric`; и что `weather.*` даёт данные **для Новосибирска**, а не для Польши.
|
**Осталось проверить (апрув истёк):** через `/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>` в логе.
|
||||||
|
|||||||
Reference in New Issue
Block a user