[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 16:08:39 +06:00
parent b0dcc072f6
commit ebf2934d38
2 changed files with 50 additions and 10 deletions
+8 -5
View File
@@ -21,7 +21,7 @@ tags:
- homeautomation - homeautomation
title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml
type: how-to type: how-to
updated: 2026-09-17k updated: 2026-09-17l
--- ---
# ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml` # ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml`
@@ -388,13 +388,16 @@ diff A.txt B.txt # пусто = round-trip чистый
## 5c. 🔄 Переработка структуры YAML сценариев — ✅ СДЕЛАНО 2026-09-17 ## 5c. 🔄 Переработка структуры YAML сценариев — ✅ СДЕЛАНО 2026-09-17
> ✅ **СТАТУС (2026-09-17, ночь): парсер и энкодер дописаны, форма — плоский `steps[]`, > ✅ **СТАТУС (2026-09-17, ночь, финал): парсер и энкодер дописаны, форма — плоский `steps[]`,
> round-trip чистый на 6 конфигах.** Семантика типов 47/48/50/59 раскрыта (ответы Alex — > round-trip чистый на 6 конфигах.** Семантика типов 47/48/50/59 раскрыта (ответы Alex —
> [[family/tech/zont-scenario-logic-11109]] §8.7), операторы и логика подтверждены фактами > [[family/tech/zont-scenario-logic-11109]] §8.7), операторы и логика подтверждены фактами
> конфига. Код реализован. **Не закоммичено** — ждёт команды Alex. > конфига. **Type 9 и type 5 раскрыты из `raw` в читаемую форму.** Код реализован.
> **Не закоммичено** — ждёт команды Alex.
> >
> 📄 **Артефакт:** `zont_config/config_local_2026-09-17_14-16-35.yml` (6110 строк) — свежий > 📄 **Артефакты (в проекте):** `zont_config/config_local_2026-09-17_16-02-18.yml` — **финальный**
> локальный конфиг в читаемой форме, лежит в проекте (не в `/tmp`). > разобранный конфиг (686 строк, Alex пересоздал сценарий); `zont_config/config_local_2026-09-17_14-16-35.yml`
> — предыдущий (6110 строк). Оба в `zont_config/`, не в `/tmp`.
**Задача Alex (исходная):** «переписать блок парсинга/сборки сценариев чтобы он составлял синтаксис как у Home Assistant automations вместо текущей разбросанной структуры. с опциональными айдишниками у операторов». **Задача Alex (исходная):** «переписать блок парсинга/сборки сценариев чтобы он составлял синтаксис как у Home Assistant automations вместо текущей разбросанной структуры. с опциональными айдишниками у операторов».
+42 -5
View File
@@ -17,9 +17,9 @@ tags:
- zont - zont
- modbus - modbus
- homeautomation - homeautomation
title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45) title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45/9/5)
type: tech type: tech
updated: '2026-09-17g' updated: 2026-09-17e
--- ---
# 🔁 ZONT — сценарная логика и конструктор логики # 🔁 ZONT — сценарная логика и конструктор логики
@@ -459,8 +459,39 @@ Alex спросил: «а по всем действиям в "Простой т
| 4 | `#Z8465 = [59, 'objcmd 11907 ",,,%0";#h', 8464, 0, 0]`, где `8464` = `[49, 4099, 0, 8]` (условие) | Аргумент = **условие**. Что за `;#h`? | | 4 | `#Z8465 = [59, 'objcmd 11907 ",,,%0";#h', 8464, 0, 0]`, где `8464` = `[49, 4099, 0, 8]` (условие) | Аргумент = **условие**. Что за `;#h`? |
| 5 | `#Z8467 = [59, '3', 0, 0, 0]` | Скрипт = просто цифра `3`. Константа? Зачем отдельным действием? | | 5 | `#Z8467 = [59, '3', 0, 0, 0]` | Скрипт = просто цифра `3`. Константа? Зачем отдельным действием? |
| 6 | `#Z8486`/`#Z8488` = `set var1`, arg1 = `8485`/`8487`**type 50** | Type 50 стоит как **источник значения** для var1, а не как триггер. Это то же самое, что триггер? | | 6 | `#Z8486`/`#Z8488` = `set var1`, arg1 = `8485`/`8487`**type 50** | Type 50 стоит как **источник значения** для var1, а не как триггер. Это то же самое, что триггер? |
| 7 | `#Z9500 = [5,'Вкл. Рад. ванная 2эт',145728,1,0,0,[],0,0,0,512]` | Объект выхода `145728` **отсутствует** в конфиге. Поле 10 = `512` — что это? | | 7 | `#Z9500 = [5,'Вкл. Рад. ванная 2эт',145728,1,0,0,[],0,0,0,512]` | Объект выхода `145728` **отсутствует** в конфиге. Поле 10 = `512` — что это? → ✅ **пункт 7 ЗАКРЫТ**: `145728` — id выхода (`output_id = 145728 >> 4 = 9108`), `512` — код. Alex: «145728 — это очевидно id». **Выводить семантику `512` из подписи не нужно** |
| 8 | `#Z8457 = [9,'Установить целевую температуру 23.8...',8669,'2968']`, `#Z8470 = [9,...,8669,'8574']` | Значение `'2968'`**отсутствующий объект**. Это «установить температуру»/«активировать режим»? | | 8 | `#Z8457 = [9,'Установить целевую температуру 23.8...',8669,'2968']`, `#Z8470 = [9,...,8669,'8574']` | → ✅ **пункт 8 ЗАКРЫТ**: type 9 = `[9, '<подпись>', <id цели>, '<значение>']`. Цель — реле (14) / контур (16) / режим (20). Поле 4 — **ссылка/код, не уставка**`'2968'`» при тексте «23.8»). Alex подтвердил: `8470` → цель `8669` = «Контур ГВС» |
### 8.12. 🔴 Type 9 и Type 5 — модель полей (подтверждено Alex 2026-09-17, вечер)
**Type 9 — команда (реле / контур / режим отопления):**
```text
#Z<id> = [9, '<подпись команды>', <id цели>, '<значение>']
```
| Часть | Смысл | Пример |
|---|---|---|
| поле 2 | подпись, собранная UI | `'Установить целевую температуру 22 для контура Спальня'` |
| поле 3 | **id цели** → тип 14 (реле) / 16 (контур) / 20 (режим) | `10034` = `Спальня` (16), `8574` = `Режим отопления` (20), `9263` = `Реле 1: Конвектор кухня` (14) |
| поле 4 | **значение как строка**`'1'`/`'0'` (вкл/выкл) **или ссылка/код** | `9826``'1'` (вкл реле), `8470``'8574'`, `8457``'2968'` |
🔴 **Ловушка:** поле 4 ≠ значение уставки. У `8457` подпись «температуру 23.8», а поле 4 = `'2968'`
(ссылка на отсутствующий объект). **Не выводить значение из текста подписи.**
**Type 5 — действие над выходом контроллера:**
```text
#Z<id> = [5, '<имя>', <output_ref>, <on/off>, <delay>, <impulse>, [], bmp, time, <code>]
```
`output_id = output_ref >> 4`. Пример `9500`: `output_ref=145728``output_id=9108`, `value=1`.
> ✅ **Ответы Alex (пересозданный сценарий):** «`8457` — поменял температуру на 22, контур на Спальня»
> (→ новый `#Z8641=9,'Установить целевую температуру 22 для контура Спальня',10034,'2950'`);
> «`8470`: `8669` это очевидно Контур ГВС. больше там полей в UI нет. добавил второе такое же действие
> но с "для Всех контуров"» (→ новый `#Z8640=9,'Включить режим «Режим отопления»',8574,'1'`).
**Что уже прозрачно (не переспрашивать):** **Что уже прозрачно (не переспрашивать):**
@@ -493,7 +524,7 @@ Alex спросил: «а по всем действиям в "Простой т
| 4 | Ссылки в поле 2 — допускать не-46 типы (45, 11, 3, 5, 9) | ✅ **плоский `steps[]`** — каждый элемент по порядку, тело инлайн | | 4 | Ссылки в поле 2 — допускать не-46 типы (45, 11, 3, 5, 9) | ✅ **плоский `steps[]`** — каждый элемент по порядку, тело инлайн |
| 5 | Round-trip всех 5 конфигов | ✅ **6/6** (боевой + 3 архива + новый локальный + live) | | 5 | Round-trip всех 5 конфигов | ✅ **6/6** (боевой + 3 архива + новый локальный + live) |
**Счётчики нового конфига (для сверки):** `660 #Z`, `25 #S`, байт — 34 907. **Счётчики конфига `config_local_2026-09-17_14-16-35.txt` (для сверки):** `660 #Z`, `25 #S`, байт — 34 907.
| Тип | Кол-во | | Тип | Кол-во | | Тип | Кол-во | | Тип | Кол-во |
|---|---|---|---|---| |---|---|---|---|---|
@@ -503,6 +534,12 @@ Alex спросил: «а по всем действиям в "Простой т
| 9 | 44 | | 50 | 3 | | 9 | 44 | | 50 | 3 |
| 59 | 28 | | 0/36 | 13/13 | | 59 | 28 | | 0/36 | 13/13 |
**Финальный конфиг `config_local_2026-09-17_16-02-18.txt`** (Alex пересоздал сценарий, вечер):
`686 строк`, **34 962 байт**. Сценарий `8456` полностью перегенерирован (новые id 86408777):
добавлены `#Z8640=9,'Включить режим «Режим отопления»',8574,'1'` и
`#Z8641=9,'Установить целевую температуру 22 для контура Спальня',10034,'2950'`.
YAML — `zont_config/config_local_2026-09-17_16-02-18.yml`, round-trip ✅.
### 8.11. ✅ ФИНАЛЬНАЯ YAML-форма сценария — плоский `steps[]` (2026-09-17) ### 8.11. ✅ ФИНАЛЬНАЯ YAML-форма сценария — плоский `steps[]` (2026-09-17)
> 🔴 **Урок, который стоит запомнить.** Первая реализация делила поле 2 на `blocks` (шаги 46) + > 🔴 **Урок, который стоит запомнить.** Первая реализация делила поле 2 на `blocks` (шаги 46) +