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

This commit is contained in:
Alexey Martemyanov
2026-09-17 12:19:38 +06:00
parent 06a4a79034
commit 46f48ff909
3 changed files with 212 additions and 5 deletions
+15 -2
View File
@@ -52,7 +52,8 @@ updated: '2026-09-17b'
| 28 | Таблицы сопротивлений | *(raw)* | `resistance_tables` |
| **36** | Конфиги дискретных датчиков (вытащены из вложенной структуры типа 0) | `raw` | вложено в `discrete_sensors[].config` |
| 42 | GUI-вкладки | `name` | `gui_tabs` |
| 46 | Шаги сценариев | *(raw; помечаются как уже разобранные)* | внутри `scenarios` |
| **45** | 🔴 **Задержка-объект (пауза в мс) в списке действий шага**`[45, ms]`. **Конвертером НЕ поддержан** | *ничего — объекта нет в YAML* | **нет секции** — теряется |
| 46 | Шаги сценариев | `[46, prio, cond_id, [action_ids], []]` — 5 полей | внутри `scenarios` |
| 49 | Условия сценариев | *(raw; помечаются как уже разобранные)* | внутри `scenarios` |
| 51 | Modbus-устройства | `slave_id`, `name`, `poll_interval`, `timeout`, `registers`, `raw_params` | `modbus_devices` |
| 52 | Modbus-регистры | `name`, `register`, `bit_width`, `repeat_period`, `num_vars`, `raw_params` | **вложены в своё устройство 51** |
@@ -87,10 +88,21 @@ Modbus-регистры (тип 52) в конфиге — **отдельные
⚠️ Если регистр ссылается на устройство, которого нет — `config-to-yml.py` предупреждает в stderr (`WARNING: … references non-existent …`), но не падает. Аналогично для аналоговых выходов (53).
### 2.3. Сценарии (11 + 46 + 49)
### 2.3. Сценарии (11 + 46 + 49 + 45)
Тип 11 парсится **целиком**`when` (условия) и `do` (действия) собираются в человекочитаемый вид, включая шаги (46) и условия (49). Сами 46/49 при разборе помечаются как «уже вложенные» — в YAML отдельными секциями их нет.
Полная структура, формат полей и разобранный боевой кейс — [[family/tech/zont-scenario-logic-11109]].
🔴 **Жёсткие лимиты конвертера (найдено 2026-09-17)** — падение с exit 2 на первом же невыразимом объекте:
- `config-to-yml.py:473` — сценарий ровно с **1 шагом** (`len(steps) == 1`). 2-й шаг = падение.
- `config-to-yml.py:489` — шаг ровно с **1 действием** (`len(actions) == 1`). 2+ действий = падение.
- Тип **45** не обрабатывается вообще → объект молча теряется при round-trip.
**Действие в шаге может быть объектом трёх типов:** `5` (действие над выходом, 11 полей), `9` (команда реле, 4 поля, `value`**строка** `'1'`/`'0'`), `45` (пауза в мс, 2 поля).
> ⚠️ **Тип 45 ≠ `delay_ms` типа 5.** `delay_ms` (поле 4 типа 5) — задержка внутри действия. Тип 45 — отдельный объект-пауза между действиями.
### 2.4. `*`-маркеры
Специальные записи вида `#Z<id>=*` — «пустой» / унаследованный объект. Обрабатываются отдельным блоком; в YAML сохраняются как маркер.
@@ -116,5 +128,6 @@ Modbus-регистры (тип 52) в конфиге — **отдельные
## 3. Связанные заметки
- [[family/how-to/zont-config-compiler]] — как пользоваться конвертерами, питфоллы, обход
- [[family/tech/zont-scenario-logic-11109]] — структура сценариев 11/46/49/45, разбор «Передёрнуть Автомат Котельной»
- [[family/how-to/home-automation]] §6 — карта slave ID, регистры AT2/реле/заслонок в HA
- [[family/tech/t610-hang-investigation]] — расследование зависаний хоста (не связано напрямую, но тот же контур)
+142
View File
@@ -0,0 +1,142 @@
---
aliases:
- ZONT сценарий 11109
- Передернуть Автомат Котельной
- ZONT тип 45 задержка
- ZONT сценарная логика
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-17'
---
# 🔁 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` «Передернуть Автомат Котельной»
**Единственный сценарий в конфиге с нестандартной формой** — 2 шага и 7 действий в одном шаге.
```
#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]`, пустая пауза-заглушка. Оставлен планировщиком 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. Связанные заметки
- [[family/how-to/zont-config-compiler]] — конвертеры `.txt ⇄ .yml`, план доработки под 2 шага и тип 45
- [[family/tech/zont-config-object-types]] — полная таблица типов объектов и `#S`-настройки
- [[family/how-to/home-automation]] — контур автоматизации, ZONT, Modbus slave ID и регистры