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

This commit is contained in:
Alexey Martemyanov
2026-09-17 15:53:25 +06:00
parent 4eae38bab8
commit 0656011f6d
2 changed files with 99 additions and 26 deletions
+43 -3
View File
@@ -19,7 +19,7 @@ tags:
- homeautomation
title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45)
type: tech
updated: '2026-09-17f'
updated: '2026-09-17g'
---
# 🔁 ZONT — сценарная логика и конструктор логики
@@ -489,8 +489,8 @@ Alex спросил: «а по всем действиям в "Простой т
|---|---|---|
| 1 | Парсер типов **47/48/50/59** + рекурсивное дерево условий | ✅ `dump_condition`/`dump_leaf`/`dump_action` |
| 2 | Поле 5 типа 11 — **тип запуска** (0/1/8/9/10), не `enabled` | ✅ `trigger: {type, days, time, interval_ms}` |
| 3 | Поле 4 шага — принимать непустые списки | ✅ `blocks[].else` |
| 4 | Ссылки в поле 2 — допускать не-46 типы (45, 11, 3, 5, 9) | ✅ `extra_links` + `_raw_links` |
| 3 | Поле 4 шага — принимать непустые списки | ✅ `else``steps[]`) |
| 4 | Ссылки в поле 2 — допускать не-46 типы (45, 11, 3, 5, 9) | ✅ **плоский `steps[]`** — каждый элемент по порядку, тело инлайн |
| 5 | Round-trip всех 5 конфигов | ✅ **6/6** (боевой + 3 архива + новый локальный + live) |
**Счётчики нового конфига (для сверки):** `660 #Z`, `25 #S`, байт — 34 907.
@@ -502,3 +502,43 @@ Alex спросил: «а по всем действиям в "Простой т
| 45 | 5 | | 48 | 3 |
| 9 | 44 | | 50 | 3 |
| 59 | 28 | | 0/36 | 13/13 |
### 8.11. ✅ ФИНАЛЬНАЯ YAML-форма сценария — плоский `steps[]` (2026-09-17)
> 🔴 **Урок, который стоит запомнить.** Первая реализация делила поле 2 на `blocks` (шаги 46) +
> `extra_links` (голые id). Round-trip был чистый (байты сходились), но **сценарий читался как
> список цифр**: `blocks` выводился первым, а всё «до него» — 25 элементов «установка температуры,
> `puts`, `set var1`, пауза 5 суток» — лежало в `extra_links` без тел. Alex: «почему там блядь if
> идет первым блоком?! где все что до него происходит?!»
> **Вывод: round-trip ≠ читаемость. Артефакт надо читать глазами до отдачи.**
**Правильная форма** — одно поле `steps`, плоский список = поле 2 сценария **как есть**:
```yaml
scenarios:
- id: 8456
name: Простой тестовый сценарий
trigger: {type: schedule}
_raw_trigger_kind: 8
steps:
- {id: 8457, raw: [9, 'Установить целевую температуру 23.8 …', 8669, '2968']}
- {id: 8458, script: 'objcmd 8700 "1 %0"', args: [10.5, 0, 1]}
- {id: 8463, script: 'objcmd 9102 "6,%0";#a', args: [8462, 0, 0]}
- {id: 11109, run_scenario: Передернуть Автомат Котельной}
- {id: 8466, script: 'puts "Отладка"', args: [0, 0, 0]}
- {id: 8473, script: 'set var1', args: [8471, 0, 0]} # + ещё 6 × set var1
- {id: 8489, wait: 432000000} # пауза 5 суток
- id: 8506 # шаг с условием — тоже элемент
if: {id: 8496, group: and, children: [
{id: 8493, op: '<', left: 8492, value: 3},
{id: 8495, op: '>=', left: 8472, right: 8494}]}
then: [{id: 8505, kind: 1, if: {…}, then: [{id: 8502, script: 'puts "then-text"'}], else: [{id: 8504, script: 'storeev A "alert"'}]}]
- {id: 8507, unresolved: true}
```
**Диспетчер `dump_step()`** — по типу элемента:
`46``if/then/else`, `59``script`+`args`, `47/48/49`→дерево условий, `45``wait`, `50``trigger_object` (raw),
`11``run_scenario`, `5/9/3``raw`-тело. **Мелкая деталь:** тела объектов чужих секций (`sms_notifications`,
`actions`) рендерятся как YAML-якоря `*id00N` (`8195`, `9500` в `8456`) — читается хуже, но байт-точно.
**Артефакт:** `zont_config/config_local_2026-09-17_14-16-35.yml` (6110 строк) — в проекте, не в `/tmp`.