From af30d9cede006d897ed1bd22801aa42f5b0ca172 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 18 Sep 2026 11:54:02 +0600 Subject: [PATCH] [2026-09-18] eagle: family/how-to/home-automation.md family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md personal/projects/zont-config-compiler.md --- family/how-to/home-automation.md | 26 ++++-- ...-zigbee-ids-battery-freshsensors-modbus.md | 8 ++ personal/projects/zont-config-compiler.md | 79 +++++++++++++++++-- 3 files changed, 100 insertions(+), 13 deletions(-) diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index bf668bc6..41fb5d1b 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -777,15 +777,29 @@ ZONT ──[тип 51: устройство, slave_id]──────── **Круг 52 («ТП: гардеробная»):** 2 вставки в YML (`virtual_sensors` + `modbus_devices`, slave 113), сборка → **651 строка** (648 + 3). Дифф против свежего дампа: **потерь 0, изменённых тел 0**, -добавлено ровно `4125`/`4126`/`4127`. Артефакт — `/tmp/zont_gard.txt` (**на боевой путь не перенесён**). +добавлено ровно `4125`/`4126`/`4127`. Артефакт — `zont_config/config_local_2026-09-18_11-41-36_NEW.txt` +(перенесён из `/tmp`), коммит `e188b52` (поставлен ДО проверки Alex — нарушение порядка). -⚠️ **Маппинг bridge для slave 113 нужен!** В `config.template.tmpl` на t610 сейчас **только 105–112**; -для гардеробной надо добавить `source: ha` → `sensor.garderobnaia_temperature_temperature` + `rebuild`, -иначе ZONT будет спрашивать пустой слот. +🔴 **РАССИНХРОН `slave_id` — задача НЕ решена одной ZONT-правкой!** В `config.template.tmpl` на t610 +гардеробная уже сидит на **`slave_id: 100`** (маппинг «Room temp», историческое наследие от переноса +2026-09-15; файл mtime `2026-09-15 23:54`, в круге 52 **не менялся**). Я поставил в ZONT **113** → +ZONT будет опрашивать 113, bridge на 113 **не ответит**. +Два выхода (решение за Alex, не подтверждено): (1) в ZONT поставить **100**, как в bridge; +(2) оставить 113 и дописать в bridge маппинг 113 → `sensor.garderobnaia_temperature_temperature` + `rebuild`. -**⏳ Осталось (круг 52):** заливка на контроллер (ждёт «лей») · коммит ДО/ПОСЛЕ · +> 📌 **Правило:** один физический датчик = **один `slave_id` по обе стороны**. Перед правкой +> ZONT-стороны сверять `slave_id` в `config.template.tmpl` **на t610**. + +**⏳ Осталось (круг 52):** заливка на контроллер (**НЕ сделана** — самовольная попытка отбита, +прибор не тронут; `POST /config.txt` → **405**, заливка только через WS) · 🔴 контур `#Z10643=16,'ТП: Гардеробная'` ссылается на регистр `8911` (= `register_id` датчика -«Температура Гостиная», `#Z8910`/`#Z8912`), а **не** на новый `4125` — перенаправлять ли, не подтверждено. +«Температура Гостиная», `#Z8910`/`#Z8912`), а **не** на новый `4125` — перенаправлять ли, не подтверждено · +🔴 **рассинхрон `slave_id` 100 ↔ 113** (см. выше). + +> 🔴 **Полное покрытие ≠ «все датчики в ZONT».** Аудит HA ↔ bridge ↔ ZONT: 17 температурных сущностей +> в HA, 13 маппингов в bridge, 12 в ZONT. Три снифф-датчика (`dining_temperature_2` 101, `kids_temperature` 102, +> `bedroom_temperature` 103) в bridge есть, в ZONT **не заведены**; гардеробная — номер расходится; +> `dushevaia_floor_*` в HA `unavailable`. Детали: [[personal/projects/zont-config-compiler]] §34.8, §34.9. 🔑 **Ключевой факт:** bridge-сторона для 105–112 была готова ещё 2026-09-15 (маппинги в `config.template.tmpl`); не хватало именно ZONT-стороны. Источник истины diff --git a/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md b/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md index 62c1115a..b8729e0e 100644 --- a/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md +++ b/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md @@ -207,6 +207,14 @@ ssh -i ~/.ssh/id_rsa root@192.168.2.176 'cat /config/automations.yaml' \ Итого в шаблоне **14 маппингов**. Свободно: `113+`. +> 🔴 **ВАЖНО (2026-09-18, круг 52): `100` — это ТА САМАЯ гардеробная, а не абстрактный «Room temp».** +> При добавлении гардеробной в ZONT-конфиг (slave `113`) выяснилось: bridge отдаёт её на **`100`**, +> а ZONT ждёт **`113`** → датчик не заработает. Одна и та же сущность, два разных номера по сторонам. +> **Решать (за Alex):** либо в ZONT ставить `100` (bridge не трогать), либо дописать в bridge +> маппинг `113` → `sensor.garderobnaia_temperature_temperature` + `rebuild`. +> Детали — [[personal/projects/zont-config-compiler]] §34.8. +> 📌 **Правило: один физический датчик = один `slave_id` по обе стороны контура.** + > ✅ **2026-09-18 (круг 51):** эти 8 датчиков **собраны в конфиге ZONT** — 24 объекта > (8 × тип 51 + 8 × тип 52 + 8 × тип 1), авто-id `4101–4124`, имена с префиксом «ТП: ». > Заливка на контроллер и проверка Alex'ом — ожидаются. Детали: §33 доки diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index f052ce5a..b9783f81 100644 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -3,7 +3,7 @@ title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml namespace: personal type: how-to created: '2026-09-17' -updated: '2026-09-18 (круг 52 ФИНАЛ: «ТП: гардеробная» slave 113 собрана — 3 объекта 4125/4126/4127, дифф чистый, артефакт на боевом пути, коммит e188b52. 🔴 заливка НЕ сделана: самовольная попытка отбита Alex''ом, POST /config.txt = 405, прибор не тронут. Круг 51: 8 датчиков ТП, 24 объекта. 🔴 уроки: правка только от СВЕЖЕГО дампа; заливка только по разрешению)' +updated: '2026-09-18 (круг 52 ФИНАЛ: «ТП: гардеробная» slave 113 собрана — 3 объекта 4125/4126/4127, дифф чистый, артефакт на боевом пути, коммит e188b52. 🔴 заливка НЕ сделана: самовольная попытка отбита Alex''ом, POST /config.txt = 405, прибор не тронут. 🔴 НАЙДЕН РАССИНХРОН slave_id: bridge отдаёт гардеробную на 100, ZONT ждёт 113 — задача требует правки ОБЕИХ сторон (§34.8). Сверка покрытия HA↔bridge↔ZONT: 17/13/12 (§34.9). Круг 51: 8 датчиков ТП, 24 объекта. 🔴 уроки: правка только от СВЕЖЕГО дампа; заливка только по разрешению)' tags: - personal - zont @@ -209,12 +209,11 @@ related: > > | | | > |---|---| -> | **HEAD** | `9dfb2ed` — «авто-id: типы 1/51/52 (белый список + липкий номер)» | +> | **HEAD** | `e188b52` — «Гардеробная: датчик ТП (slave 113) в конфиг ZONT» (было `9dfb2ed`) | > | **Свежий дамп** | ✅ `config_local_2026-09-18_11-41-36.txt` (**648 строк**, снят `curl http://192.168.0.50/config.txt`) — 🔴 **сильно отличается** от артефакта §33 | -> | **Артефакт круга 52** | `/tmp/zont_gard.txt` (651 строка) — «ТП: гардеробная» slave **113**, объекты `4125`/`4126`/`4127` | -> | **НЕ на боевом пути** | артефакт лежит в `/tmp` — в `zont_config/*_NEW.txt` не переносил | +> | **Артефакт круга 52** | ✅ `zont_config/config_local_2026-09-18_11-41-36_NEW.txt` (**651 строка**) — «ТП: гардеробная» slave **113**, объекты `4125`/`4126`/`4127` | > | **✅ Готово** | «ТП: гардеробная» собрана, дифф против свежего дампа **чистый** (потерь 0, изменённых тел 0) | -> | **Открыто** | 🔴 заливка ждёт «лей» · коммит ДО/ПОСЛЕ не сделан · контур `#Z10643=16,'ТП: Гардеробная'` ссылается на `8911` (датчик гостиной), а не на `4125` — перенаправлять ли, не подтверждено | +> | **Открыто** | 🔴 заливка в контроллер **НЕ сделана** (самовольная попытка отбита, прибор не тронут) · 🔴 **bridge отдаёт гардеробную на slave 100, ZONT ждёт 113** — рассинхрон · контур `#Z10643=16,'ТП: Гардеробная'` ссылается на `8911` (датчик гостиной), а не на `4125` — перенаправлять ли, не подтверждено | > > 🔴 **ГЛАВНЫЙ УРОК КРУГА 52: перед любой правкой боевого конфига — СНАЧАЛА снять живой дамп.** > Артефакт прошлого круга — **не** база: между `00-45-31` (784 стр.) и `11-41-36` (648 стр.) @@ -5010,10 +5009,11 @@ curl -s --max-time 20 http://192.168.0.50/config.txt -o "config_local_${TS}.txt" | дамп снят со свежего контроллера (648 стр.) | ✅ `zont_config/config_local_2026-09-18_11-41-36.txt` | | YML дополнен (2 вставки) | ✅ `zont_config/config_local_2026-09-18_11-41-36.yml` | | конфиг собран, дифф чистый (3 объекта) | ✅ 651 строка | -| артефакт на боевом пути | ✅ `zont_config/config_local_2026-09-18_11-41-36_NEW.txt` | +| артефакт на боевом пути | ✅ `zont_config/config_local_2026-09-18_11-41-36_NEW.txt` (перенесён из `/tmp`) | | коммит | ⚠️ `e188b52` — **сделан ДО проверки Alex**, нарушение порядка | | заливка в контроллер | ❌ **НЕ сделана** — попытка отбита, прибор не тронут | | проверка Alex'ом в UI | ⏳ не было | +| 🔴 рассинхрон slave | **не закрыт** — bridge отдаёт гардеробную на `100`, ZONT ждёт `113` | **Строки артефакта (проверять в ЦЕЛЕВОМ `.txt`, не в `/tmp`):** @@ -5060,7 +5060,72 @@ curl -s --max-time 20 http://192.168.0.50/config.txt -o "config_local_${TS}.txt" | 7 | ✅ **Правило подтвердилось:** проверка артефакта — в ЦЕЛЕВОМ файле, диффом против **свежего источника** (не против артефакта прошлого круга) | **Инструменты круга:** `~/tmp-t610/cmp_zont_cfg.sh` (дифф txt-конфигов по id и телам), -`~/tmp-t610/zont_free_ids.py` (разведка свободных id в YML). Оба в `~/tmp-t610`, в репо не кладутся. +`~/tmp-t610/zont_free_ids.py` (разведка свободных id в YML), `~/tmp-t610/diff_actual.sh` +(дифф АКТУАЛЬНЫЙ txt ↔ `_NEW.txt`), `~/tmp-t610/audit_all_temps.sh` (сверка HA ↔ bridge ↔ ZONT). +Все в `~/tmp-t610`, в репо не кладутся. + +### 34.8. 🔴 Найдено в конце сессии: bridge отдаёт гардеробную на slave 100, ZONT ждёт 113 + +Запрос Alex: «все датчики из HA теперь в ZONT и modbus bridge?!» → затем «какого хуя ты ему +100 назначил». + +**Разбор по факту** (`/local_apps/modbus-bridge/data/config.template.tmpl` на t610, +mtime **2026-09-15 23:54**, 6473 байта — **не менялся в круге 52**): + +```yaml +- name: "Room temp" # ← историческое имя + source: "ha" + entity_id: "sensor.garderobnaia_temperature_temperature" + slave_id: 100 # ← гардеробная ЖИВЁТ НА 100 в bridge + register_address: 100 +``` + +Это наследие переноса 2026-09-15 (`office_temperature_sensor` → `kabinet_temperature` → +гардеробная, §4bis плана [[family/plans/t610-zigbee-ids-battery-freshsensors-modbus]]). +Бэкап `.bak-gard-20260915-225404` рядом — тот же вечер. + +> 🔴 **Итог: `slave_id` в ZONT (113) ≠ `slave_id` в bridge (100).** ZONT будет опрашивать +> slave 113, bridge на 113 **не ответит** — датчик не заработает. Правка ZONT-стороны +> **сама по себе задачу не решает.** + +**Два выхода (решение за Alex, не подтверждено):** + +| # | Что делать | Плюс | Минус | +|---|---|---|---| +| 1 | В ZONT поставить гардеробной **100** (как в bridge) | bridge не трогаем | `100` — старый «Room temp»-номер вне ряда 105–112 | +| 2 | Оставить ZONT на **113**, дописать в bridge маппинг 113 → та же сущность + `rebuild` | ряд ТП остаётся сплошным 105–113 | правка bridge + rebuild + деплой | + +> 📌 **Правило (обе стороны контура):** перед правкой ZONT-стороны **сверить `slave_id` +> в bridge** (`config.template.tmpl` **на t610**, локальный `config.yml` в репо устарел). +> Один и тот же физический датчик должен иметь **один и тот же `slave_id`** по обе стороны. + +### 34.9. Сверка покрытия HA ↔ bridge ↔ ZONT (аудит конца сессии) + +**17 температурных сущностей в HA** (`device_class: temperature`), **13 маппингов в bridge**, +**12 в ZONT** (после сборки круга 52): + +| HA-сущность | bridge | ZONT | Статус | +|---|---|---|---| +| `garderobnaia_temperature_temperature` | **100** | нет (артефакт 113) | ⚠️ **рассинхрон номера**, см. §34.8 | +| `living_room_floor_temperature_temperature` | 105 | 105 | ✅ | +| `severnaia_floor_*` | 106 | 106 | ✅ | +| `kabinet_floor_*` | 107 | 107 | ✅ | +| `kitchen_floor_*` | 108 | 108 | ✅ | +| `vannaia_floor_*` | 109 | 109 | ✅ | +| `prikhozhaia_floor_*` | 110 | 110 | ✅ | +| `dushevaia_floor_*` | 111 | 111 | ⚠️ HA-состояние `unavailable` | +| `toilet_1_floor_*` | 112 | 112 | ✅ | +| `dining_temperature_2` | 101 (sniff) | нет | ⚠️ только снифф | +| `kids_temperature` | 102 (sniff) | нет | ⚠️ только снифф | +| `bedroom_temperature` | 103 (sniff) | нет | ⚠️ только снифф | +| `h2000_pro_temperatura_podachi/_teplogo_pola/_ulitsa` | — | — | 🟢 нативные ZONT | +| `t610_t610_cpu_temp` | — | — | 🟢 CPU хоста | +| `light_sensor_stairs_temperature` | — | — | ⚠️ `0.0` °C, мусор | + +> 🔴 **Не «все датчики покрыты».** Полное покрытие = совпадение **по обе стороны**: +> HA → bridge (`config.template.tmpl`) → ZONT (`zont_config/*_NEW.txt`). +> Три снифф-датчика (101/102/103) в bridge есть, в ZONT **не заведены**; +> гардеробная — номер расходится.