[2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-scenario-logic-11109.md
This commit is contained in:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user