From 372117554966f31d498b12d8df85d385b87fc04f Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 18 Sep 2026 01:13:14 +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 | 39 +++-- ...-zigbee-ids-battery-freshsensors-modbus.md | 5 + personal/projects/zont-config-compiler.md | 136 ++++++++++++++++-- 3 files changed, 164 insertions(+), 16 deletions(-) diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index 30c8a2f3..c9842672 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -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, 105–112**; **26 автоматизаций: 25 `on`, 1 `off` намеренно** (`Ventilation automation on`); кнопка спальни шлёт события, диммер рулится; свет лестницы + 2 сценария подсветки работают. > > 🔴 **Уточнение 2026-09-18 (§6.1):** «9 датчиков отдаются ZONT'у» — верно **только для bridge**. -> Со стороны ZONT зарегистрированы **4** (slaves 100–103); датчики тёплых полов `105–111` bridge -> отдаёт, но **ZONT их не опрашивает** — на контроллере нет записей тип 51/52/1. В работе, см. §6.1. +> Bridge отдаёт 9 (slaves 100, 105–112). Со стороны ZONT зарегистрированы **4** (slaves 100–103). +> ✅ **Исправлено в тот же день (круг 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`: устройства `4117–4124`, регистры `4101–4108`, датчики `4109–4116`. +Имена на 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 105–112 в +`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`; diff --git a/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md b/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md index 913d4a2d..bb947ece 100644 --- a/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md +++ b/family/plans/t610-zigbee-ids-battery-freshsensors-modbus.md @@ -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` > (105–112, включая `toilet_1_floor_temperature_temperature`). Правка bridge **не требуется**. diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index b98a4a15..14b8d5f7 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 (круг 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'ы 105–111.** Скрипт `/tmp/add_floor_sensors.py` готов, **не запущен** — ждёт 1 ответ: добавлять ли slave 112 (туалет 1). · авто-id: верх окна не назван (§30.3, стоит `19999`) | +> | **✅ Готово** | Авто-id типов **1/51/52** (питфолл 107). §33: **24 объекта = 8 датчиков ТП** (slave 105–112) — устройства 51 + регистры 52 + датчики 1, цепочка проверена, круг чистый, регресс 10/10 | +> | **Открыто** | 🔴 **имя slave 106** (Alex: «не ТП серая, а zigbee серая») · **заливка в контроллер** ждёт «лей» · **коммит ПОСЛЕ** проверки Alex'ом · верх окна id стоит `19999` (§30.3) | > -> Свежие круги: §27 (46 — `set_contour_target`), §28 (47–49 — `call_sub`, `send_sms`, `exit`, `scenario_orphans`), §30 (50 — авто-id + валидация ссылок), §31 (разведка Zigbee → Modbus), §32 (**51 — авто-id типов 1/51/52**). +> Свежие круги: §27 (46), §28 (47–49), §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 105–112 +(`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: `** → `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` | — | ✅ (4101–4124) | + +### 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** → коммит ПОСЛЕ. Не коммитить результат до его проверки. + +