[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:32:14 +06:00
parent 9b65e8f2c7
commit 4e63dc7bbe
2 changed files with 172 additions and 19 deletions
+18 -12
View File
@@ -42,7 +42,7 @@ updated: 2026-09-17e
| 7 | Радиомодули | `address`, `name` | `radio_modules` |
| 9 | MQTT-команды (кнопка GUI → управление реле) | `name`, `target_relay`, `value` | `relay_commands` |
| 10 | GUI-переключатели | `name` | `gui_switches` |
| 11 | Сценарии | `name`, `when`, `do`**парсятся полностью, человекочитаемо** | `scenarios` |
| 11 | Сценарии | `name`, `steps[]`**парсятся полностью**; `trigger` выводится из тела, поле 5 не хранится (только `enabled`) | `scenarios` |
| 14 | Реле | `name`, `address`, `state` | `relays` |
| 16 | Отопительные контуры | `name` | `heating_circuits` |
| 20 | Режимы отопления | `name` | `heating_modes` |
@@ -54,20 +54,22 @@ updated: 2026-09-17e
| 42 | GUI-вкладки | `name` | `gui_tabs` |
| 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` | инлайн в `steps[].if` |
| **50** ⚠️ | **Запуск команды/сценария по id**`[50, 1, 0, 0, <id>]` | ❌ **НЕ ПОДДЕРЖАН** | — |
| **47** | **Лист дерева условий (конструктор логики)**`[47, <оператор>, <объект>, <значение>, <порог>]` | `op`, `left`, `right`, `value` | инлайн в `if` шага |
| **48** | **Группа условий И/ИЛИ/НЕ**`[48, <логика 0=И,1=ИЛИ,2=НЕ>, [<id>]]` | `group`, `children[]` | инлайн в `if` шага |
| 49 | Условия сценариев | `relay_id`, `operator`, `value` | инлайн в `trigger` / `steps[].if` |
| **50** | **Маска дней недели**`[50, 1, 0, 0, <days_mask>]` (`109 = 0b1101101` = пн,ср,чт,сб,вс) | *raw* (семантика маски подтверждена Alex) | инлайн как объект-условие |
| 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** |
| 53 | Аналоговые выходы | `name`, `min`, `max`, `value`, `offset`, `scale`, `flags`, `address` | `analog_outputs` |
| 57 | MQTT-топики | `topic`, `sensors` | `mqtt_topics` |
| **59** ⚠️ | **Мини-скрипт ZONT**`[59, '<код>', <арг1>, <арг2>, <флаг>]` | **НЕ ПОДДЕРЖАН** | — |
| **59** | **Мини-скрипт ZONT**`[59, '<код>', <арг1>, <арг2>, <флаг>]` | `descr`, `args[]` | инлайн в `then`/`else` |
> ⚠️ **Типы 47 / 48 / 50 / 59 обнаружены 2026-09-17** в локальном конфиге с контроллера
> (`config_local_2026-09-17_14-16-35.txt`, 660 `#Z`) — это **конструктор логики** ZONT.
> Конвертер на таком конфиге **падает** (`Ошибка: Условие 8496: не type 49`).
> Полный разбор — [[family/tech/zont-scenario-logic-11109]] §8.
> **Типы 47 / 48 / 50 / 59 — ПОДДЕРЖАНЫ** (раскрыты 2026-09-17, ответы Alex —
> [[family/tech/zont-scenario-logic-11109]] §8.7): это **конструктор логики** ZONT.
> `47` = лист сравнения (`op`/`left`/`right`/`value`), `48` = группа (`group` = `and`/`or`/`not`,
> `children[]`), `50` = маска дней недели, `59` = мини-скрипт (`descr` + `args`).
> В YAML они разворачиваются **инлайн** внутри `if` / `then` / `else`.
> Операторы type 47: `0=<`, `1=>`, `2===`, `3=<=`, `4=>=`. Логика type 48: `0=И`, `1=ИЛИ`, `2=НЕ`.
---
@@ -155,10 +157,14 @@ Modbus-регистры (тип 52) в конфиге — **отдельные
> ```
>
> `if` ← поле 2 (`cond_id`), `then` ← поле 3 (`[9563]`), `else` ← поле 4, `flag` ← поле 1.
> `then`/`else`/`if`/`flag` — **имена полей записи 46**, поэтому разрешены.
> `then`/`else`/`if`/`flag` — **имена полей записи 46**, поэтому разрешены; `then`/`else` — **пара**.
> **`trigger:` на уровне сценария РАЗРЕШЁН** — выводится из тела (ровно один шаг 46), не подставляется.
> `type` / `field5` / `kind` / `_f5` / `action` — **запрещены**.
> Полностью — [[family/how-to/zont-config-compiler]] §6a.
> Полностью — [[family/how-to/zont-config-compiler]] §6a, правки после коммита — §6d.
>
> ⚠️ **Питфолл (§6d):** условие для `trigger:` вынимается из шага **переносом (`pop`)**, не копией.
> `deepcopy` даёт PyYAML-анкоры `&idNNN`/`*idNNN`; убирание `if` из `dump_step` теряет условие у ВСЕХ
> шагов, включая manual. Проверять надо **файл на диске**, а не прогон в `/tmp`.
### 2.3a. ✅ `manual` vs `trigger` — РЕШЕНО (2026-09-17, финал)