[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

This commit is contained in:
Alexey Martemyanov
2026-09-18 01:13:14 +06:00
parent 9b974e5b00
commit 3721175549
3 changed files with 164 additions and 16 deletions
+31 -8
View File
@@ -54,8 +54,10 @@ updated: 2026-09-18
> **Итог:** удалены три слоя мусора (127 сущностей `platform=mqtt` + 18 устройств); **23 устройства ZHA** с читаемыми ID в едином виде (`<зона>_<роль>`), все в зонах; **12 автоматизаций контроля батарей** (порог 20 %, push + persistent); **9 температурных Zigbee-датчиков** отдаются ZONT'у как виртуальные Modbus slave **100, 105112**; **26 автоматизаций: 25 `on`, 1 `off` намеренно** (`Ventilation automation on`); кнопка спальни шлёт события, диммер рулится; свет лестницы + 2 сценария подсветки работают.
>
> 🔴 **Уточнение 2026-09-18 (§6.1):** «9 датчиков отдаются ZONT'у» — верно **только для bridge**.
> Со стороны ZONT зарегистрированы **4** (slaves 100103); датчики тёплых полов `105–111` bridge
> отдаёт, но **ZONT их не опрашивает** — на контроллере нет записей тип 51/52/1. В работе, см. §6.1.
> Bridge отдаёт 9 (slaves 100, 105112). Со стороны ZONT зарегистрированы **4** (slaves 100103).
> ✅ **Исправлено в тот же день (круг 51):** датчики тёплых полов `105–112` собраны в конфиге
> контроллера (24 объекта: 8×51 + 8×52 + 8×1, авто-id, имена «ТП: …»). Заливка на контроллер
> и проверка Alex'ом — ожидаются. См. §6.1.
>
> 🔴 **2026-09-16 (ночь): вычищены 185 призраков Z2M** из архива реестра (`deleted_entities` 360 → 175). Призраки живут **именно в архиве**, а не в `entities` — UI «Обслуживание» их показывал, `/api/states` и WS-реестр нет. Живые (572) не тронуты. Снесены также остатки аддонов `go2rtc`/`file_editor`/`samba_share` и старые `switch_as_x`-обёртки.
> 🔴 **План этажей (`home-plan`) ссылался на снесённого призрака** `light.smart_light_stairs_l1` → ошибка на карте. Исправлено на `light.light_stairs_left`. Проверять ссылки плана после сноса: `~/tmp-t610/fix_plan_stairs.sh`.
@@ -745,12 +747,33 @@ ZONT ──[тип 51: устройство, slave_id]────────
только контур отопления `#Z10152=16,'Тёплый пол'` и его штатный датчик `#Z8432=27`. Ни одной записи
типа 51/1 для тёплых полов нет → bridge их отдаёт, ZONT **не спрашивает**.
** Состояние регистрации (2026-09-18, круг 51):** работа **в процессе**. Энкодер научился
выдавать авто-id для типов **1 / 51 / 52** (коммит `9dfb2ed`), поэтому 21 новый объект
(7 × тип 51 + 7 × тип 52 + 7 × тип 1) добавляются **без прописанных id**. Имена на ZONT-стороне —
**короткий префикс «ТП: »** (`ТП: гостиная`, `ТП: серая`, …), решение Alex, не полная фраза
«Температура … тёплый пол». Скрипт `/tmp/add_floor_sensors.py` (флаг `--toilet` для 8-го датчика,
slave 112) готов и **не запущен** — ждёт ответа Alex по slave 112. Детали: §32 доки компилятора.
** Состояние регистрации (2026-09-18, круг 51, 2-я часть): 24 объекта СОБРАНЫ в конфиге ZONT.**
Энкодер научился выдавать авто-id для типов **1 / 51 / 52** (коммит `9dfb2ed`), поэтому 24 новых
объекта (**8 × тип 51 + 8 × тип 52 + 8 × тип 1**) добавлены **без прописанных id** — номера выдал
аллокатор из окна `4098..19999`: устройства `41174124`, регистры `41014108`, датчики `41094116`.
Имена на ZONT-стороне — **короткий префикс «ТП: »** (`ТП: гостиная`, `ТП: кабинет`, …), решение Alex.
| slave | HA-сущность | устройство (51) | регистр (52) | датчик (1) | имя в ZONT |
|---|---|---|---|---|---|
| 105 | `living_room_floor_*` | `4117` | `4101` | `4109` | ТП: гостиная |
| 106 | `severnaia_floor_*` | `4118` | `4102` | `4110` | ТП: серая ⚠️ имя уточняется |
| 107 | `kabinet_floor_*` | `4119` | `4103` | `4111` | ТП: кабинет |
| 108 | `kitchen_floor_*` | `4120` | `4104` | `4112` | ТП: кухня |
| 109 | `vannaia_floor_*` | `4121` | `4105` | `4113` | ТП: ванная |
| 110 | `prikhozhaia_floor_*` | `4122` | `4106` | `4114` | ТП: прихожая |
| 111 | `dushevaia_floor_*` | `4123` | `4107` | `4115` | ТП: душевая |
| 112 | `toilet_1_floor_*` | `4124` | `4108` | `4116` | ТП: туалет 1 |
**Проверено:** цепочка устройство→регистр→датчик по всем 8 — зелёная; круг `783 → 783` ЧИСТЫЙ;
txt→yml→txt байт-в-байт; регресс 10 снапшотов зелёный. 785 → **809 строк**.
**⏳ Осталось:** имя slave 106 (Alex: «не ТП серая, а zigbee серая — там нет ТП»; префикс «ТП: »
у остальных 7 не пересматривался) · **заливка на контроллер** (ждёт «лей») · **коммит ПОСЛЕ**
проверки Alex'ом (в рабочем дереве незакоммичены `yml-to-config.py` + целевой `.yml`).
🔑 **Ключевой факт:** bridge-сторона была готова ещё 2026-09-15 (8 маппингов slave 105112 в
`config.template.tmpl`) — работы на мосте **ноль**; не хватало именно ZONT-стороны. Источник истины
по маппингам — `config.template.tmpl` **на t610**, локальный `config.yml` в репо **устарел**.
Детали и питфоллы (107 — липкий id, 108 — `register_id`) — §32, §33 доки компилятора.
**Порядок работ (обе стороны!).** Bridge-сторона и ZONT-сторона правятся **разными файлами** и
деплоятся по-разному: bridge — `/addons/modbus-bridge/data/config.template.tmpl` на t610 + `rebuild`;
@@ -207,6 +207,11 @@ ssh -i ~/.ssh/id_rsa root@192.168.2.176 'cat /config/automations.yaml' \
Итого в шаблоне **14 маппингов**. Свободно: `113+`.
> ✅ **2026-09-18 (круг 51):** эти 8 датчиков **собраны в конфиге ZONT** — 24 объекта
> (8 × тип 51 + 8 × тип 52 + 8 × тип 1), авто-id `4101–4124`, имена с префиксом «ТП: ».
> Заливка на контроллер и проверка Alex'ом — ожидаются. Детали: §33 доки
> [[personal/projects/zont-config-compiler]], карта — [[family/how-to/home-automation]] §6.1.
> ✅ **ПОДТВЕРЖДЕНО ФАКТОМ 2026-09-18:** живой шаблон `/addons/modbus-bridge/data/config.template.tmpl`
> на t610 (mtime `2026-09-15 23:54`, 6473 байта) содержит **все 8** маппингов `floor_temperature`
> (105112, включая `toilet_1_floor_temperature_temperature`). Правка bridge **не требуется**.
+128 -8
View File
@@ -3,7 +3,7 @@ title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml
namespace: personal
type: how-to
created: '2026-09-17'
updated: '2026-09-18 (круг 51: авто-id для типов 1/51/52 + липкий номер (питфолл 107), коммит 9dfb2ed)'
updated: '2026-09-18 (круг 51, 2-я часть: 8 виртуальных датчиков ТП в конфиг ZONT, 24 объекта; питфолл 108 — register_id неизвестен в проходе датчика; заливка/коммит ждут Alex)'
tags:
- personal
- zont
@@ -48,6 +48,13 @@ aliases:
- ZONT питфолл 106
- ZONT питфолл 107
- ZONT липкий id
- ZONT питфолл 108
- ZONT register_slave
- ZONT пред-проход регистров
- ZONT датчики ТП
- ZONT тёплый пол modbus
- ZONT 8 виртуальных датчиков
- ZONT circle 51 floor sensors
- ZONT keep sticky id
- ZONT alloc None не кэширует
- ZONT двойной id объект пропадает
@@ -192,20 +199,20 @@ related:
| **Снять живой конфиг** | 🔴 `curl -s http://192.168.0.50/config.txt`**без авторизации** |
| **ZONT в общем контуре** | [[family/how-to/home-automation]] §6 |
> ### 📍 Текущее состояние (2026-09-18, после §32 = круг 51)
> ### 📍 Текущее состояние (2026-09-18, после §33 = круг 51, 2-я часть)
>
> | | |
> |---|---|
> | **HEAD** | `9dfb2ed` — «авто-id: типы 1/51/52 (белый список + липкий номер)» |
> | **Круг** | **10/10 зелёный**, 759 → 759 объектов |
> | **Артефакт** | `zont_config/config_local_2026-09-18_00-45-31.yml` (идентичен `23-21-20`) |
> | **Круг** | **10/10 зелёный**, 759 → 759 объектов (+ §33: 809 строк с 24 новыми) |
> | **Артефакт** | `zont_config/config_local_2026-09-18_00-45-31.yml` |
> | **Свежий дамп** | ✅ снят 2026-09-18 00:45 — **идентичен** `23-21-20` (`diff` пуст) |
> | **✅ Готово** | Авто-id для типов **1 / 51 / 52** (`_LEAF_TYPES = {9, 1, 51}` + снятие барьеров `'id'` + **липкий номер** через `keep()`, питфолл 107). Приёмка зелёная, регресс 10/10 |
> | **Открыто** | 🔴 **§31: 7 Zigbee-датчиков тёплых полов → slave 105111.** Скрипт `/tmp/add_floor_sensors.py` готов, **не запущен** ждёт 1 ответ: добавлять ли slave 112 (туалет 1). · авто-id: верх окна не назван (§30.3, стоит `19999`) |
> | **✅ Готово** | Авто-id типов **1/51/52** (питфолл 107). §33: **24 объекта = 8 датчиков ТП** (slave 105112) — устройства 51 + регистры 52 + датчики 1, цепочка проверена, круг чистый, регресс 10/10 |
> | **Открыто** | 🔴 **имя slave 106** (Alex: «не ТП серая, а zigbee серая») · **заливка в контроллер** ждёт «лей» · **коммит ПОСЛЕ** проверки Alex'ом · верх окна id стоит `19999` (§30.3) |
>
> Свежие круги: §27 (46`set_contour_target`), §28 (4749 — `call_sub`, `send_sms`, `exit`, `scenario_orphans`), §30 (50 — авто-id + валидация ссылок), §31 (разведка Zigbee → Modbus), §32 (**51 — авто-id типов 1/51/52**).
> Свежие круги: §27 (46), §28 (4749), §30 (50 — авто-id + валидация ссылок), §32 (**51 — авто-id типов 1/51/52, питфолл 107**), §33 (**51 (2) — 8 датчиков ТП, питфолл 108**).
>
> ✅ Снято с открытого в §28.6: «5 `objcmd`-орфанов» и «поле 4 = `2` у `expr`» — **работы не требуют** (орфанов нет; поле производное).
> ✅ Снято с открытого в §28.6: «5 `objcmd`-орфанов» и «поле 4 = `2` у `expr`» — **работы не требуют**.
---
@@ -4777,4 +4784,117 @@ if 'id' not in obj:
«снял id → собрал → объект есть в выводе → круг чистый». Питфолл 106/107 показывает, что
«круг чистый» сам по себе **не доказательство**.
---
## 33. 🚧 Круг 51 (2-я часть) — 8 виртуальных датчиков ТП в конфиг ZONT (2026-09-18)
**Задача Alex:** «Тяни и конвертируй свежий конфиг и добавь в него entity zigbee датчиков
температуры которых в нем нет через виртуальные modbus устройства в bridge».
### 33.1. Снятый конфиг и результат сверки
| | |
|---|---|
| **Снято** | `curl -s http://192.168.0.50/config.txt``zont_config/config_local_2026-09-18_00-45-31.txt` (38174 байт) |
| **Сверка** | свежий конфиг **байт-в-байт идентичен** `config_local_2026-09-17_23-21-20.txt` (`diff` пуст) |
| **Артефакт** | `zont_config/config_local_2026-09-18_00-45-31.yml` |
| **Снапшот-коммит** | `12842e2` (перед правками) |
### 33.2. ✅ БОЛЬШАЯ НАХОДКА: мосто-сторона уже была готова — работы НОЛЬ
Проверка показала, что **всё уже сделано 2026-09-15**: в
`/addons/modbus-bridge/data/config.template.tmpl` на t610 лежат **8 маппингов** slave 105112
(`source: ha`, `int16`, `divider: 10`) на сущности:
| slave | HA-сущность |
|---|---|
| 105 | `sensor.living_room_floor_temperature_temperature` |
| 106 | `sensor.severnaia_floor_temperature_temperature` |
| 107 | `sensor.kabinet_floor_temperature_temperature` |
| 108 | `sensor.kitchen_floor_temperature_temperature` |
| 109 | `sensor.vannaia_floor_temperature_temperature` |
| 110 | `sensor.prikhozhaia_floor_temperature_temperature` |
| 111 | `sensor.dushevaia_floor_temperature_temperature` |
| 112 | `sensor.toilet_1_floor_temperature_temperature` |
> 🔑 **Почему датчиков «не было»:** bridge отдавал значения, но **ZONT о них не знал** — в конфиге
> контроллера не было объектов типа 51/52/1. Проблема была на стороне ZONT, а не bridge.
> Проверять надо **обе** стороны, а не только ту, о которой спросили.
⚠️ Локальный `config.yml` в репо (`~/Automation/HA-ZONT-Modbus/config.yml`) — **устаревший**:
в нём `sensor.office_temperature_sensor_temperature` (имя, снесённое переименованием 2026-09-15).
Источник истины — `config.template.tmpl` **на t610**, не файл в репо.
### 33.3. 🔴 ПИТФОЛЛ 108 — `register_id` виртуального датчика неизвестен в его проходе
Датчик (тип 1) обрабатывается в цикле `virtual_sensors` (**строка ~329**), а его регистр (тип 52)
получает номер от аллокатора в проходе устройства (тип 51, **строка ~1776**) — **позже**.
Поле `register_id` — целое число (строка 341), ссылку-символ энкодер не понимает.
Значит, датчик не может знать номер своего регистра.
**Лечение — пред-проход сразу после создания `_alloc`** (до всех emit-циклов):
1. всем вложенным регистрам без `id` выдать номер (`alloc` + `keep` — липкий);
2. построить карту `slave_id -> id первого регистра`;
3. раскрыть в `virtual_sensors` ключ **`register_slave: <slave_id>`** → `register_id: <номер>`,
сам ключ `register_slave` удалить. Ошибка при неизвестном slave — `ConversionError`, не тишина.
Так **оба** прохода видят явный номер: датчик ссылается на готовый, устройство печатает тот же
в поле-ссылке.
**Скрипт:** `/tmp/fix_prescan_registers.py` (вставка одного блока, анкер `count==1`).
### 33.4. ✅ РЕЗУЛЬТАТ — 24 объекта (8 устройств + 8 регистров + 8 датчиков)
785 → **809 строк** (+24). Все id выданы аллокатором (окно `4098..19999`), префикс имени
**«ТП: »** (решение Alex):
| slave | устройство (51) | регистр (52) | датчик (1) | имя |
|---|---|---|---|---|
| 105 | `4117` | `4101` | `4109` | ТП: гостиная |
| 106 | `4118` | `4102` | `4110` | ТП: серая ⚠️ см. §33.6 |
| 107 | `4119` | `4103` | `4111` | ТП: кабинет |
| 108 | `4120` | `4104` | `4112` | ТП: кухня |
| 109 | `4121` | `4105` | `4113` | ТП: ванная |
| 110 | `4122` | `4106` | `4114` | ТП: прихожая |
| 111 | `4123` | `4107` | `4115` | ТП: душевая |
| 112 | `4124` | `4108` | `4116` | ТП: туалет 1 |
Форма строк (эталон `#Z8381`/`#Z8383`/`#Z8382`):
```text
#Z4117=51,105,'ТП: гостиная',5000,300000,[],[],0,[4101]
#Z4101=52,'Знач. темп.',100,16,0,1,16,0,1,29,1,4
#Z4109=1,'0','ТП: гостиная',0,0,0,60000,[],[],[],4101,[],0,0,0
```
### 33.5. ✅ Проверки (все фактом)
| Проверка | Инструмент | Результат |
|---|---|---|
| Цепочка устройство→регистр→датчик, 8 шт. | `/tmp/check_chain.py` | **вся зелёная** |
| Round-trip полного файла | `test_roundtrip.py` | **ЧИСТЫЙ**, 783→783 объекта, 808 строк |
| Байт-в-байт txt→yml→txt | `diff` | **идентично** |
| Регресс 10 снапшотов | `test_roundtrip.py` цикл | **10/10 зелёный** |
| id в окне `4098..19999` | — | ✅ (41014124) |
### 33.6. ⏳ ОТКРЫТО на конец сессии
1. **Имя slave 106 уточняется Alex** (последняя правка). Alex: «не тп серая а давай zigbee серая,
там нет ТП». Предложены 3 варианта, ответа нет: `ТП: zigbee серая` / `zigbee серая` / другое.
⚠️ **Префикс «ТП: » у остальных 7 не пересматривался** — менять только 106, если Alex не скажет иначе.
2. **Заливка в контроллер НЕ сделана** — ждёт слова Alex («лей»). Команда: `curl` на `192.168.0.50/config.txt`.
3. **Коммит ПОСЛЕ проверки Alex'ом** — не сделан. В рабочем дереве незакоммичены:
`yml-to-config.py` (пред-проход) + `zont_config/config_local_2026-09-18_00-45-31.yml` (+24 объекта).
Последний коммит — `9dfb2ed` (аллокатор).
4. Круг после заливки — перегнать, сверить с `zont_config/config_local_2026-09-18_00-45-31.yml`.
**Инструменты круга:** `/tmp/add_floor_sensors.py` (идемпотентная вставка 8 датчиков, флаг
`--no-toilet`), `/tmp/check_chain.py` (проверка цепочки), `/tmp/show_new.py` (вывод новых id),
`/tmp/zont_before_add.yml` (копия до вставки). Все в `/tmp`, в репо не кладутся.
> 📌 **Порядок заливки боевого конфига (напоминание):** снапшот-коммит ДО → правки → **проверка
> Alex'ом в UI ZONT** → коммит ПОСЛЕ. Не коммитить результат до его проверки.