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

This commit is contained in:
Alexey Martemyanov
2026-09-17 16:03:34 +06:00
parent 0656011f6d
commit b0dcc072f6
+29 -7
View File
@@ -458,17 +458,32 @@ scenarios:
| Тип | В YAML | Пример |
|---|---|---|
| `11` | `trigger: {type, …}` + `blocks[]` | `trigger: {type: schedule, days: [mon,…], time: '13:26'}` |
| `46` | `blocks[].{if, then, else}` | `{id, kind?, if, then: […], else?: […]}` |
| `11` | `trigger: {type, …}` + `steps[]` | `trigger: {type: schedule, days: [mon,…], time: '13:26'}` |
| `46` | `steps[].{if, then, else}` | `{id, kind?, if, then: […], else?: […]}` |
| `47` | `{op, left, value}` или `{op, left, right}` | `{id: 8493, op: '<', left: 8492, value: 3}` |
| `48` | `{group, children}` | `{id: 8496, group: and, children: […]}` |
| `49` | `{condition: {object, operator, value}}` | старая форма, поддержана |
| `59` | `{script: <код дословно>, args: […]}` | `{id: 8502, script: 'puts "then-text"'}` |
| `59` | `{script: <код дословно>, args: […]}` | `{id: 8502, script: puts-text}` |
| **`9`** | **`{command, target, target_name, target_type, value}`** | `{id: 9826, command: …, target: 9263, target_name: 'Реле 1: Конвектор кухня', target_type: 14, value: '1'}` |
| **`5`** | **`{action, output, output_id, value, params?}`** | `{id: 9500, action: …, output: 145728, output_id: 9108, value: 1, params: [0, 0, …, 512]}` |
| `45` | `{wait: ms}` | `{id: 8489, wait: 432000000}` |
| `3` (SMS) | `raw: *id00N` — тело в `sms_notifications` | якорь YAML |
| `50`, неизвестные | `raw: […]` | `{id: 8548, raw: [50, 1, 0, 0, 109]}` |
**Type 9 — команда (реле / контур / режим).** Формат в конфиге: `[9, '<подпись>', <id цели>, '<значение>']`.
`target` разворачивается в `target_name` + `target_type`; `value` — строка (`'1'`/`'0'` или id-ссылка).
Проверено: `9826`→тип 14 (реле), `8641`→тип 16 (контур `Спальня`), `8640`→тип 20 (режим `Режим отопления`),
`8470`→тип 16 (`Контур ГВС`, значение `'8574'`).
⚠️ **Поле 4 (`'2968'`, `'8574'`, `'1'`) — не значение уставки, а ссылка/код** (напр. `'2968'` при
тексте «температуру 23.8»). Семантику поля 4 **Alex не подтверждал** — не выводить её из подписи.
**Type 5 — действие над выходом.** Формат: `[5, '<имя>', <output_ref>, <on/off>, …]`.
`output_id = output_ref >> 4`. Остальные непустые поля → `params`.
**Операторы type 47 (порядок UI `<, >, =, <=, >=`):** `0`=`<`, `1`=`>`, `2`=`=`, `3`=`<=`, `4`=`>=`.
**Логика type 48:** `0`=`and`, `1`=`or`, `2`=`not`.
**Триггер (поле 5 типа 11):**
| Поле 5 | `trigger.type` | Доп. поля |
@@ -502,6 +517,8 @@ scenarios:
| 2 | Операнды терялись | `left`/`right`/`args`**не рёбра дерева**, обход их не видит | Fixed-point sweep: собирать референсы из `raw`-тел, докидывать, повторять |
| 3 | exit 4 «Duplicate ID» | Секции эмитились дважды (явный цикл + `TYPE_ORDER`) | Убрать явный цикл; типы 5/9/3/0/36/1/14/16/20/27/53 не регистрировать в `raw_objects` (у них свои секции) |
| 4 | 🔴 **Порядок сценария терялся** | `blocks` первым + `extra_links` голыми id → сценарий = список цифр | **Плоский `steps[]` вместо `blocks`/`extra_links`** |
| 5 | 🔴 **Отдал артефакт, не прочитав сам** | Round-trip «байты сходятся» ≠ «читаемо». Alex открыл YAML и увидел в `8456` первым блоком `if`, а до него — список цифр | Читать глазами **главный/сложный кейс**, а не только простые 1-блочные сценарии. Питфолл 21 |
| 6 | **Много `raw` в шагах** | type 9/5 рендерились как `raw: [...]` хотя поля прозрачны | Раскрыты (§5c, «Type 9 / Type 5»). raw остался только у SMS (`3`) и непонятных (`50`) |
**Обязано сохраниться байт-в-байт (сохранено):**
- порядок объектов в файле (45 идёт **после** 11, но **до** 46)
@@ -716,21 +733,26 @@ https://lk.zont-online.ru/download/firmwares/H2000_PRO_<HW>__<FW>_<PROFILE>.zip
| Файл | Статус |
|---|---|
| `config-to-yml.py` | 🆕 **изменён** — парсер типов 47/48/50/59, `blocks/if/then/else`, триггер, raw-фоллбэк (§5c). **не закоммичено** |
| `yml-to-config.py` | 🆕 **изменён** — обратные `emit_*`, `_raw_links`, новые секции в `TYPE_ORDER` (§5c). **не закоммичено** |
| `config-to-yml.py` | 🆕 **изменён** — парсер типов 47/48/50/59, плоский `steps[]`, триггер, type 9/5 раскрыты, raw-фоллбэк (§5c). **не закоммичено** |
| `yml-to-config.py` | 🆕 **изменён** — обратные `emit_*`, `emit_step` по типу, новые секции в `TYPE_ORDER` (§5c). **не закоммичено** |
| `test_roundtrip.py` | ✅ в коммите `199f2b1`, без изменений |
| `zont_config/config_local_2026-09-17_14-16-35.txt` | 🆕 **34 907 байт, 660 `#Z`, 25 `#S`** конфиг с **тестовыми сценариями** Alex. Снят с `http://192.168.0.50/config.txt`. **не в git** |
| `zont_config/config_local_2026-09-17_16-02-18.txt` | 🆕 **34 962 байт, 686 строк****ПОСЛЕДНИЙ** конфиг с тестовыми сценариями (Alex пересоздал: контур `Спальня`, режим `Режим отопления`). Снят с `http://192.168.0.50/config.txt`. **не в git** |
| `zont_config/config_local_2026-09-17_16-02-18.yml` | 🆕 разобранный YAML (**финальная форма**) — round-trip ✅. **не в git** |
| `zont_config/config_local_2026-09-17_14-16-35.yml` | 🆕 разобранный YAML (предыдущий конфиг, 6110 строк). **не в git** |
| `zont_config/config_local_2026-09-17_14-16-35.txt` | 34 907 байт, 660 `#Z` — предыдущий с тестовыми сценариями. **не в git** |
| `zont_config/config_0FA7C33CC89F_…_2026-09-17_12-12-28.txt` | 32 689 байт — свежий боевой конфиг, **не в git** |
| `zont_config/archive/` | `-2`/`-3`/`-4` — ✅ **закоммичены** (`7ae0e32`) |
| `zont_local_ui_recon/config_live_192.168.0.50.txt` | живой конфиг для разведки WS-интерфейса, **не в git** |
| `zont_api_docs/` | ✅ локальная копия доки облачного API (`zont_api_docs.html`, `.txt`, `convert.py`). **не в git** |
| `read_scenarios.py` | 🆕 **читаемый дамп сценария** — дерево если/то/иначе с именами. Токенайзер `split_top()`. **не в git** |
| `dump_new_types.py`, `probe_types.py`, `trace_scenarios.py` | 🆕 скрипты разбора сценарных типов. Разбор — [[family/tech/zont-scenario-logic-11109]] §8.8. **не в git** |
| `probe_sched.py`, `verify_answers.py`, `check_ops.py`, `audit_8456.py`, `audit2.py`, `chk_extra.py` | 🆕 проверочные скрипты. **не в git** |
| `probe_sched.py`, `verify_answers.py`, `check_ops.py`, `audit_8456.py`, `audit2.py`, `chk_extra.py`, `why_raw.py` | 🆕 проверочные скрипты. **не в git** |
| `~/rasputin-tmp/zont-util/` | ✅ настроечная утилита `H1000 Programmator` 2.8.5, прошивка `.enc`, `extract.py`. Разбор — §5g-2 |
| `~/rasputin-tmp/zont-{auth-probe,recon,recon2,ws-probe}.js` | ✅ скрипты разведки локального WS. **не в git** |
**Бэкапы кода перед правкой §5c:** `/tmp/config-to-yml.py.bak`, `/tmp/yml-to-config.py.bak`.
**Не `/tmp` для артефактов** — Alex: «качай доки в папку в проекте а не в темп». YAML конфигов — только `zont_config/*.yml`.
Не запушено: `origin/main..HEAD` = 3 коммита (`199f2b1`, `7ae0e32`, `12ba22b`). Плюс **новые правки
§5c — незакоммичены**.