[2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-config-object-types.md

This commit is contained in:
Alexey Martemyanov
2026-09-17 19:22:03 +06:00
parent 4d75f4f69e
commit 3e4dc4c8cf
2 changed files with 394 additions and 80 deletions
+46 -29
View File
@@ -16,7 +16,7 @@ tags:
- reference
title: "\U0001F9E9 ZONT Config — типы объектов"
type: reference
updated: '2026-09-17c'
updated: '2026-09-17d'
---
# 🧩 ZONT Config — типы объектов
@@ -52,11 +52,11 @@ updated: '2026-09-17c'
| 28 | Таблицы сопротивлений | *(raw)* | `resistance_tables` |
| **36** | Конфиги дискретных датчиков (вытащены из вложенной структуры типа 0) | `raw` | вложено в `discrete_sensors[].config` |
| 42 | GUI-вкладки | `name` | `gui_tabs` |
| **45** | Задержка-объект (пауза в мс) в списке действий шага — `[45, ms]` | `ms` | `delays` |
| 46 | Шаги сценариев | `[46, prio, cond_id, [action_ids], []]` — 5 полей | `scenario_steps` |
| 45 | Задержка-объект (пауза в мс) в списке действий шага — `[45, ms]` | `ms` | инлайн в `steps[].then[].wait` |
| 46 | Шаги сценариев | `[46, <flag>, <cond_id>, [<then_ids>], [<else_ids>]]` — 5 полей; в YAML `{id, flag?, if, then[], else[]}` | инлайн в `scenarios[].steps[]` |
| **47** ⚠️ | **Лист дерева условий (конструктор логики)**`[47, <оператор>, <объект>, <значение>, <порог>]` | ❌ **НЕ ПОДДЕРЖАН** | — |
| **48** ⚠️ | **Группа условий И/ИЛИ**`[48, <логика>, [<id>]]` | ❌ **НЕ ПОДДЕРЖАН** | — |
| 49 | Условия сценариев | `relay_id`, `operator`, `value` | `scenario_conditions` |
| 49 | Условия сценариев | `relay_id`, `operator`, `value` | инлайн в `steps[].if` |
| **50** ⚠️ | **Запуск команды/сценария по id**`[50, 1, 0, 0, <id>]` | ❌ **НЕ ПОДДЕРЖАН** | — |
| 51 | Modbus-устройства | `slave_id`, `name`, `poll_interval`, `timeout`, `registers`, `raw_params` | `modbus_devices` |
| 52 | Modbus-регистры | `name`, `register`, `bit_width`, `repeat_period`, `num_vars`, `raw_params` | **вложены в своё устройство 51** |
@@ -101,48 +101,70 @@ Modbus-регистры (тип 52) в конфиге — **отдельные
> ✅ **РАСКРЫТО 2026-09-17 (типы назвал Alex):** поле 5 типа 11 = **тип сценария + флаг «выключен»**:
> `тип`: `0` = `manual` | `schedule`, `1` = `trigger`, `2` = `interval`;
> `поле5 = тип + 8`, если сценарий **выключен**; `enabled = not (field5 & 8)`.
> `поле5 = тип + 8`, если сценарий **выключен**; `enabled = not (поле5 & 8)`.
> `manual` и `schedule` дают одно число `0` — различаются только полями 3/4 (`days_mask`/`time`).
> Подробности и таблица 70 сценариев — [[family/how-to/zont-config-compiler]] §5j.
> Подробности и таблица 70 сценариев — [[family/how-to/zont-config-compiler]] §5j, §6b.
>
> ❌ **Снято:** `kind = field5 & 7` (это не «kind», а тип) и гипотеза «поле5 = значение условия
> шага 46» (32 расхождения из 70). Старая модель `{0:manual, 8:schedule, 9:trigger, 10:interval}`
> — выдумка, удалена из кода.
>
> 🔴 **Поле 5 в YAML НЕ хранится** (`type`/`field5` вырезаны Alex) — только `enabled` производное.
> **Чем отличать `manual` от `trigger` — открытый вопрос, см. §2.3a.**
Тип 11 парсится **целиком** — из него собирается `steps[]` (шаги 46 со своими условиями 49), включая многошаговые сценарии и много действий в шаге.
> 🔴 **ФОРМА ПЕРЕСМОТРЕНА (2026-09-17, финал).** Секции `scenario_steps` / `scenario_conditions` /
> **АКТУАЛЬНАЯ ФОРМА (2026-09-17, конец сессии).** Секции `scenario_steps` / `scenario_conditions` /
> `delays` / `scenario_scripts` / `scenario_raw_objects` **убраны** — тела живут только внутри
> `steps[]`. Осталась одна служебная секция `scenario_orphans`. Форма согласована Alex:
> `steps[]`. Осталась одна служебная секция `scenario_orphans`. **Ничего не поднимается на
> уровень сценария:**
>
> ```yaml
> - id: 9691
> name: 'Автомат.: Прихожая (н/п) (14/14) ВКЛ'
> enabled: true
> trigger:
> - id: 9729
> steps:
> - id: 9819
> if:
> id: 9729
> object: 9495
> value: 1
> steps:
> - id: 9819
> action: 9563
> then:
> - id: 9563
> descr: 'Включить выход 14/14: Прихожая (н/п)'
> target: 146064
> value: 1
> ```
>
> `trigger` ← поле 3 шага 46 (`9729`), `steps[].action` ← поле 4 (`[9563]`).
> `trigger` поднят на **уровень сценария**, не шага. Слова `if`/`then`/`condition`/`operator`/
> `group`/`kind` в YAML **запрещены** — их нет в конфиге.
> Полностью — [[family/how-to/zont-config-compiler]] §5j.
> `if` ← поле 2 (`cond_id`), `then` ← поле 3 (`[9563]`), `else` ← поле 4, `flag` ← поле 1.
> `then`/`else`/`if`/`flag` — **имена полей записи 46**, поэтому разрешены.
> `type` / `field5` / `kind` / `_f5` / `trigger` (на уровне сценария) / `action` — **запрещены**.
> Полностью — [[family/how-to/zont-config-compiler]] §6a.
### 2.3a. 🔴 Открытый вопрос: `manual` vs `trigger` без `type`/`field5`
**Тип сценария из тела не выводится.** Опровергнуто фактами на 70 сценариях:
| сценарий | поле 5 | шаги в поле 2 | фактически |
|---|---|---|---|
| `11109` | `0` | `11827`, `11828` | manual |
| `8456` | `8` | 27 элементов, среди них `8863` (46) | manual, выключен |
| `9628` | `1` | `9756` (46) | trigger |
| `8547` | `9` | `8550` (46) | trigger, выключен |
Наличие шага 46 в `steps` **не признак trigger**: он есть и у обоих manual-сценариев.
Формула «есть шаг 46 → база 1» дала 2 расхождения (`11109`, `8456`) и откачена.
**Ждёт решения Alex.** Полный разбор — [[family/how-to/zont-config-compiler]] §6.
Полная структура, формат полей и разобранный боевой кейс — [[family/tech/zont-scenario-logic-11109]].
⚠️ **Полнота парсера ограничена конфигами без конструктора логики.** На локальном конфиге с типами
**47/48/50/59** конвертер **падает** (`Ошибка: Условие 8496: не type 49`). Эти типы — визуальный
конструктор логики ZONT, ещё **не поддержаны** (см. §1 таблицу и [[family/tech/zont-scenario-logic-11109]] §8).
⚠️ **Полнота парсера ограничена конфигами без конструктора логики.** Типы **47/48/50/59**
визуальный конструктор логики ZONT (см. §1 таблицу и [[family/tech/zont-scenario-logic-11109]] §8).
**Лимиты сняты 2026-09-17** (были жёсткие ограничения, падал с exit 2 на первом невыразимом объекте):
- ~~`config-to-yml.py:473` — сценарий ровно с 1 шагом~~ → теперь цикл по всем шагам
- ~~`config-to-yml.py:489` — шаг ровно с 1 действием~~ → теперь весь список действий
- ~~Тип **45** не обрабатывается~~ → парсер + эмиттер, секция `delays`
- ~~Тип **45** не обрабатывается~~ → парсер + эмиттер
Подробности правки — [[family/how-to/zont-config-compiler]] §5b.
@@ -152,16 +174,11 @@ Modbus-регистры (тип 52) в конфиге — **отдельные
`#Z8456` в поле 2 держит `11109` — это id **сценария**, отдельного объекта-шага нет.
Подстановка имени (`run_scenario: <имя>`) убрана как выдумка — см. [[family/how-to/zont-config-compiler]] §5j.
**Поле `type` сценария в YAML** (`manual`/`trigger`/`interval`/`schedule`) выводится из тела:
`trigger` = поднятый триггер (шаг 46), `interval` = есть `interval_ms`, `schedule` = есть
`days`/`time`, иначе `manual`. Поле 5 при сборке = `{manual:0, schedule:0, trigger:1, interval:2}[type] + (0 if enabled else 8)`.
> ⚠️ **Известная ошибка вывода `type`:** `#Z11109` получает `trigger`, хотя он `manual` (поле 5 = `0`).
> У него тоже есть шаг 46, но в поле 2 **два** элемента (`11827` + пауза `11828`), у настоящих
> trigger — ровно один. Правка-гипотеза: `trigger` = ровно один элемент в `steps` И он типа 46. **Не проверена.**
> ⚠️ **Тип 45 ≠ `delay_ms` типа 5.** `delay_ms` (поле 4 типа 5) — задержка внутри действия. Тип 45 — отдельный объект-пауза между действиями.
> 📌 **Поле 1 записи 46** (`#Z8862=46,1,…`) — в YAML ключ `flag`, пишется только если ≠ 0.
> Семантика **неизвестна** (встречается 1 раз из 69, всегда вложенный шаг) — не выдумывать.
### 2.4. `*`-маркеры
Специальные записи вида `#Z<id>=*` — «пустой» / унаследованный объект. Обрабатываются отдельным блоком; в YAML сохраняются как маркер.