11 KiB
aliases, created, namespace, related, tags, title, type, updated
| aliases | created | namespace | related | tags | title | type | updated | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
2026-09-17 | family |
|
|
🔁 ZONT — сценарная логика (типы 11 / 46 / 49 / 45) | tech | 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, функциональной нагрузки не несёт.
Смысл логики
Это защита от повторного передёргивания:
- Виртуальное реле
virt. Запретить передергивание(id11190) ставится в 1 первым действием. - Условие сценария (
11823) требует== 0→ пока реле в 1, сценарий повторно не запустится. - Снимается реле только после 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:
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 и регистры