206 lines
11 KiB
Markdown
206 lines
11 KiB
Markdown
---
|
||
aliases:
|
||
- ZONT сценарий 11109
|
||
- Передернуть Автомат Котельной
|
||
- ZONT тип 45 задержка
|
||
- ZONT сценарная логика
|
||
- ZONT поле 2 сценария
|
||
created: '2026-09-17'
|
||
namespace: family
|
||
related:
|
||
- '[[family/how-to/zont-config-compiler]]'
|
||
- '[[family/tech/zont-config-object-types]]'
|
||
- '[[family/how-to/home-automation]]'
|
||
tags:
|
||
- family
|
||
- tech
|
||
- zont
|
||
- modbus
|
||
- homeautomation
|
||
title: 🔁 ZONT — сценарная логика (типы 11 / 46 / 49 / 45)
|
||
type: tech
|
||
updated: '2026-09-17b'
|
||
---
|
||
|
||
# 🔁 ZONT — сценарная логика (типы 11 / 46 / 49 / 45)
|
||
|
||
Как устроены сценарии в конфиге ZONT и что именно разобрано в боевом конфиге
|
||
`config_0FA7C33CC89F_0FA7C33CC89F_2026-09-17_12-12-28.txt` (598 `#Z`, 25 `#S`, 65 сценариев).
|
||
Контекст конвертеров — [[family/how-to/zont-config-compiler]].
|
||
|
||
---
|
||
|
||
## 1. Структура сценария
|
||
|
||
Сценарий — это **4 связанных типа объектов**:
|
||
|
||
```
|
||
#Z<sid>=11,'Имя',[<шаг>,<шаг>,…],0,0,<enabled>,0,0 ← сценарий
|
||
#Z<step>=46,<prio>,<cond>,[<действие>,…],[] ← шаг
|
||
#Z<cond>=49,<relay_id>,<operator>,<value> ← условие
|
||
#Z<act>=… ← действие (тип 5, 9 или 45)
|
||
```
|
||
|
||
| Тип | Роль | Формат | Поля |
|
||
|---|---|---|---|
|
||
| **11** | Сценарий | `[11, name, [step_ids], 0, 0, enabled, 0, 0]` | **8** полей. `enabled` — поле v[5] (0/1) |
|
||
| **46** | Шаг | `[46, prio, cond_id, [action_ids], []]` | **5** полей. `prio` и последнее поле — всегда 0/`[]` |
|
||
| **49** | Условие | `[49, relay_id, operator, value]` | **4** поля. `operator`: `1`=equals, иначе not_equals |
|
||
| **45** | Задержка | `[45, <миллисекунды>]` | **2** поля |
|
||
|
||
**Каноническая форма** (99% конфига): 1 сценарий → 1 шаг → 1 условие → 1 действие.
|
||
|
||
---
|
||
|
||
## 2. Действия в шаге — три разных типа
|
||
|
||
Список действий шага (`46` поле 3) может содержать объекты **трёх** типов:
|
||
|
||
| Тип | Что это | Формат | Декодирование |
|
||
|---|---|---|---|
|
||
| **5** | Действие над выходом контроллера | `[5, name, output_ref, 1, delay, impulse_dur, [], sched_bmp, sched_time, impulse_period, value]` | 11 полей. `output_ref >> 4` = id выхода; `delay` — поле 4 (мс) |
|
||
| **9** | Команда реле | `[9, name, target_relay, '1'/'0']` | 4 поля. `value` — **строка** `'1'`/`'0'`, не число |
|
||
| **45** | Пауза между действиями | `[45, ms]` | 2 поля |
|
||
|
||
> ⚠️ **Тип 45 ≠ `delay_ms` типа 5.** `delay_ms` — задержка **внутри** действия перед его выполнением.
|
||
> Тип 45 — **отдельный объект-пауза** в последовательности. Их часто путают при чтении конфига.
|
||
|
||
---
|
||
|
||
## 3. Разобранный кейс: `#Z11109` «Передернуть Автомат Котельной»
|
||
|
||
**Единственный сценарий в конфиге с нестандартной формой** — 7 действий в шаге и задержка (`45`)
|
||
прямо в поле 2 сценария (`11828`) вместо второго шага. См. §5 «Уточнение семантики поля 2».
|
||
|
||
```
|
||
#Z11109=11,'Передернуть Автомат Котельной',[11827,11828],0,0,0,0,0
|
||
#Z11823=49,11190,1,0 ← условие
|
||
#Z11827=46,0,11823,[11191,11030,11824,11029,11825,11192,11826],[]
|
||
#Z11828=45,0 ← шаг 2
|
||
#Z11824=45,20000 #Z11825=45,60000 #Z11826=45,0
|
||
#Z11029=9,'Включить реле «20/1 Автомат Котельная»',11028,'1'
|
||
#Z11030=9,'Выключить реле «20/1 Автомат Котельная»',11028,'0'
|
||
#Z11191=9,'Включить реле «virt. Запретить передергивание»',11190,'1'
|
||
#Z11192=9,'Выключить реле «virt. Запретить передергивание»',11190,'0'
|
||
#Z11028=14,'20/1 Автомат Котельная',175728,0
|
||
#Z11190=14,'virt. Запретить передергивание',179904,0
|
||
```
|
||
|
||
### Что происходит по шагам
|
||
|
||
**Условие:** `relay 11190 ('virt. Запретить передергивание') == 0` — т.е. передёргивание **не** запрещено.
|
||
|
||
**Шаг 1 (`11827`) — 7 действий подряд:**
|
||
|
||
| # | Объект | Действие | Пауза после |
|
||
|---|---|---|---|
|
||
| 1 | `11191` (type 9) | включить `virt. Запретить передергивание` | — |
|
||
| 2 | `11030` (type 9) | **выключить** `20/1 Автомат Котельная` | — |
|
||
| 3 | `11824` (type 45) | пауза | **20 000 мс** |
|
||
| 4 | `11029` (type 9) | **включить** `20/1 Автомат Котельная` | — |
|
||
| 5 | `11825` (type 45) | пауза | **60 000 мс** |
|
||
| 6 | `11192` (type 9) | выключить `virt. Запретить передергивание` | — |
|
||
| 7 | `11826` (type 45) | пауза | 0 |
|
||
|
||
**Шаг 2 (`11828`)** — на деле это не шаг, а **задержка** `[45, 0]` прямо в поле 2 сценария:
|
||
пустая пауза-заглушка. Оставлена планировщиком ZONT, функциональной нагрузки не несёт.
|
||
|
||
### Смысл логики
|
||
|
||
Это **защита от повторного передёргивания**:
|
||
1. Виртуальное реле `virt. Запретить передергивание` (id `11190`) ставится в 1 **первым** действием.
|
||
2. Условие сценария (`11823`) требует `== 0` → пока реле в 1, сценарий повторно **не запустится**.
|
||
3. Снимается реле только **после** 20 с + 60 с пауз (действие 6), т.е. через 80 секунд после старта → минимальный интервал между передёргиваниями автомата = 80 с.
|
||
|
||
### 🔴 Проблема
|
||
|
||
`#Z11109` поле v[5] = **`0`** → **сценарий выключен в контроллере**. Защита и сама функция передёргивания не работают.
|
||
|
||
---
|
||
|
||
## 4. Полные счётчики по конфигу (для сверки после правок)
|
||
|
||
| Тип | Кол-во | Комментарий |
|
||
|---|---|---|
|
||
| 11 / 46 | 65 / 65 | все одношаговые, кроме `11109` |
|
||
| 49 | 65 | все ровно 4 поля, `op=1` (equals) у всех |
|
||
| 45 | 4 | `11824`, `11825`, `11826`, `11828` — только в `11109` |
|
||
| 9 | 42 | 21 пара ВКЛ/ВЫКЛ, `value` — строка `'1'`/`'0'` |
|
||
| 5 | 66 | действия над выходами |
|
||
| 14 | 40 | реле |
|
||
| 10 | 22 | GUI-переключатели |
|
||
| 0 / 36 | 13 / 13 | дискретные датчики + вложенные конфиги |
|
||
| 52 / 51 / 53 | 93 / 11 / 64 | Modbus-регистры / устройства / ещё один слой |
|
||
| 16 / 20 | 10 / 1 | контуры и режимы отопления |
|
||
| **Всего `#Z`** | **598** | |
|
||
|
||
> Проверка после любой правки: `grep -c '^#Z' <файл>` должен дать **598**.
|
||
|
||
---
|
||
|
||
## 5. Статус разбора конвертером
|
||
|
||
| Что | Статус |
|
||
|---|---|
|
||
| Многошаговый сценарий (`[11827,11828]`) | ✅ разбирается с 2026-09-17 |
|
||
| 7 действий в шаге `11827` | ✅ разбирается с 2026-09-17 |
|
||
| Тип 45 (4 объекта) | ✅ парсер + эмиттер, секция YAML `delays` |
|
||
| Round-trip всех 4 конфигов | ✅ чисто (`test_roundtrip.py`, коммит `199f2b1`) |
|
||
| Сценарий `enabled=0` | ℹ️ факт, не баг конвертера |
|
||
|
||
### 🔴 Уточнение семантики поля 2 (важно)
|
||
|
||
Поле 2 сценария — **не «список шагов»**, а **последовательность ссылок**, куда попадают объекты
|
||
**разных типов**. Полный список: шаг (`46`) **и** задержка (`45`).
|
||
|
||
В `#Z11109` поле 2 = `[11827, 11828]`, где:
|
||
- `11827` — настоящий шаг (`46`) с условием и 7 действиями;
|
||
- `11828` — **задержка (`45,0`)**, т.е. «шаг-ожидание» без условия.
|
||
|
||
Поэтому формулировка «2 шага» неточна: **шаг один**, вторым элементом идёт задержка-заглушка.
|
||
Отсюда же — `extra_links` в YAML (см. [[family/how-to/zont-config-compiler]] §2.1): не-46 ссылки
|
||
сохраняются дословно, чтобы round-trip остался байт-точным.
|
||
|
||
> ⚠️ **Не путать с типом 45 внутри шага.** В `11827` задержки `11824`/`11825`/`11826` — это
|
||
> **действия внутри** шага. `11828` — **ссылка в поле 2 сценария**, т.е. элемент верхнего уровня.
|
||
|
||
---
|
||
|
||
## 6. План переработки YAML-структуры (2026-09-17, ждёт апрува)
|
||
|
||
Сценарии в YAML переписываются в нативную ZONT-форму **вложенных инструкций «если … то …»** —
|
||
**без HA-синтаксиса** (`triggers`, `platform: state`). Alex: «нет структура должна быть как в zont.
|
||
**триггеров нет.**»
|
||
|
||
Предлагаемая форма для `11109`:
|
||
|
||
```yaml
|
||
scenarios:
|
||
- id: 11109
|
||
name: 'Передернуть Автомат Котельной'
|
||
enabled: false
|
||
blocks:
|
||
- id: 11827
|
||
if: {id: 11823, relay: 11190, operator: equals, value: 0}
|
||
then:
|
||
- {id: 11191, action: relay_on, relay: 11190}
|
||
- {id: 11030, action: relay_off, relay: 11028}
|
||
- {id: 11824, action: wait, ms: 20000}
|
||
- {id: 11029, action: relay_on, relay: 11028}
|
||
- {id: 11825, action: wait, ms: 60000}
|
||
- {id: 11192, action: relay_off, relay: 11190}
|
||
- {id: 11826, action: wait, ms: 0}
|
||
tail:
|
||
- {id: 11828, action: wait, ms: 0} # задержка из поля 2 сценария
|
||
```
|
||
|
||
Полный план и открытые вопросы — [[family/how-to/zont-config-compiler]] §5c.
|
||
|
||
---
|
||
|
||
## 7. Связанные заметки
|
||
|
||
- [[family/how-to/zont-config-compiler]] — конвертеры `.txt ⇄ .yml`; 2 шага и тип 45 **поддержаны с 2026-09-17** (§5b)
|
||
- [[family/tech/zont-config-object-types]] — полная таблица типов объектов и `#S`-настройки
|
||
- [[family/how-to/home-automation]] — контур автоматизации, ZONT, Modbus slave ID и регистры
|