[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:
@@ -9,6 +9,7 @@ created: '2026-09-17'
|
||||
namespace: family
|
||||
related:
|
||||
- '[[family/tech/zont-config-object-types]]'
|
||||
- '[[family/tech/zont-scenario-logic-11109]]'
|
||||
- '[[family/how-to/home-automation]]'
|
||||
- '[[family/how-to/gitea-config]]'
|
||||
tags:
|
||||
@@ -19,7 +20,7 @@ tags:
|
||||
- homeautomation
|
||||
title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml
|
||||
type: how-to
|
||||
updated: '2026-09-17c'
|
||||
updated: '2026-09-17d'
|
||||
---
|
||||
|
||||
# ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml`
|
||||
@@ -144,6 +145,7 @@ grep -c '^#Z' /tmp/zont_new.txt
|
||||
|
||||
`1, 3, 4, 5, 6, 7, 9, 10, 11, 14, 16, 20, 24, 25, 27, 28, 42, 46, 49, 51, 52, 53, 57`
|
||||
➕ дополнительно обрабатываются **`0`** (дискретные датчики — индикаторы состояния реле) и **`36`** (их вложенные конфиги).
|
||||
❌ **НЕ обрабатывается `45`** (задержка-объект) — см. §5, п. 13.
|
||||
Полная таблица с полями — [[family/tech/zont-config-object-types]].
|
||||
|
||||
---
|
||||
@@ -182,6 +184,45 @@ grep -c '^#Z' A.txt B.txt # счётчик объектов
|
||||
| 8 | Загрузка конфига в контроллер — **руками**, скрипты только конвертируют | Конвертер не имеет доступа к ZONT |
|
||||
| 9 | `INFRASTRUCTURE.md`, `docker-compose.yml`, `docker run.txt` в проекте — **исторический TrueNAS-стек** | Актуальный контур — [[family/how-to/home-automation]]. Не искать `modbus-bridge`/`mbusd` на NAS |
|
||||
| 10 | Дополнительных зависимостей нет | Только `pyyaml` — `jsonschema`/`ruamel` не нужны |
|
||||
| 11 | 🔴 **Сценарий с >1 шагом → exit 2** | `config-to-yml.py:473` `require(len(steps) == 1)` жёстко. Обход: нет — нужна правка кода |
|
||||
| 12 | 🔴 **Шаг с >1 действием → exit 2** | `config-to-yml.py:489` `require(len(actions) == 1)`. Обход: нет |
|
||||
| 13 | 🔴 **Тип 45 (задержка, мс) не поддержан вообще** | Нет парсера в `config-to-yml.py`, нет эмиттера в `yml-to-config.py`. Объект молча теряется при round-trip |
|
||||
| 14 | ⚠️ `>` в шелле затирает `.yml` до старта питона | Проверять exit-код до переноса файла в репо |
|
||||
|
||||
### Ограничения конвертера, требующие доработки (найдено 2026-09-17)
|
||||
|
||||
Прогон боевого конфига `config_0FA7C33CC89F_…_2026-09-17_12-12-28.txt` (598 `#Z`, 25 `#S`) вскрыл **4 дырки** в сценарной логике — все четыре независимы, падает на первой же:
|
||||
|
||||
| # | Чего нет | Где в коде | Что теряется | Масштаб в конфиге |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 2-й и последующие шаги сценария | `config-to-yml.py:473` (только 1 шаг); `yml-to-config.py:314` — `[step_id]` захардкожен, `:328` — пишет один шаг | шаг `11828` сценария `11109` | 1 сценарий из 65 |
|
||||
| 2 | Тип **45** — задержка в мс, `[45, ms]` | нет ни в одном скрипте | 4 объекта: `11824`=20000, `11825`=60000, `11826`=0, `11828`=0 | 4 объекта |
|
||||
| 3 | Несколько действий в одном шаге | `config-to-yml.py:489` (`len(actions)==1`) | шаг `11827` содержит **7** действий | 1 шаг из 65 |
|
||||
| 4 | — (информационно) сценарий выключен | `enabled` = поле v[5] сценария | `#Z11109` — `enabled=0` | 1 сценарий |
|
||||
|
||||
> ✅ Остальные 64 сценария — каноническая одношаговая форма `11 → [46] → 49`, конвертер их разбирает корректно. Все 65 условий (49) имеют ровно 4 поля `[49, relay, op, value]`, `op=1` = equals у всех. Все 64 «простых» шага — ровно 5 полей `[46, prio, cond, [1 действие], []]`.
|
||||
|
||||
**Тип 45 vs `delay_ms` у типа 5 — это разные вещи:**
|
||||
- `delay_ms` живёт **внутри** объекта-действия типа 5 (поле 4) — уже поддержан обоими скриптами.
|
||||
- Тип **45** — **самостоятельный объект-задержка** в списке действий шага. Восстановленный формат: `[45, <миллисекунды>]`, 2 поля. Проверено на 4 объектах, больше в конфиге не встречается.
|
||||
|
||||
---
|
||||
|
||||
## 5a. План доработки сценариев (согласован 2026-09-17, ожидает апрува)
|
||||
|
||||
**Этап 1 — только конвертеры, конфиг не трогать.**
|
||||
1. Бэкап обоих скриптов: `cp config-to-yml.py yml-to-config.py /tmp/zont-backup-<дата>/`
|
||||
2. `config-to-yml.py`: снять `len(steps)==1` → список шагов; снять `len(actions)==1` → список действий; добавить парсер type 45 в новую секцию `delays`.
|
||||
3. `yml-to-config.py`: эмитить все шаги `v[2]` (не один), все действия; добавить эмиттер type 45.
|
||||
4. Проверка round-trip: `TXT → YAML → TXT` на боевом конфиге, 598 объектов, `diff` чистый (см. §4).
|
||||
|
||||
**Стоп-точка:** показать Alex профиль YAML по `11109` перед правкой логики.
|
||||
|
||||
**Этап 2 — правка YAML** (только после ответа на вопрос: (а) просто `enabled: true` / (б) добавить триггер по событию / (в) другое).
|
||||
|
||||
**Этап 3 — `YAML → TXT`, сверка счётчиков, коммит ДО → Alex заливает руками → Alex проверяет руками → коммит ПОСЛЕ.**
|
||||
|
||||
> 🔴 Порядок работ с боевыми конфигами: **коммит ДО → правка → заливка → ПРОВЕРКА АЛЕКСОМ руками → коммит ПОСЛЕ**. Мой `read back` = «конфиг записался», НЕ «работает».
|
||||
|
||||
---
|
||||
|
||||
@@ -196,9 +237,19 @@ grep -c '^#Z' A.txt B.txt # счётчик объектов
|
||||
| `zont_config/H2000_PRO_config_actual-4.txt` / `-4.yml` | то же |
|
||||
| `zont_config/archive/` | не добавлена в git |
|
||||
| `zont_config/config_0FA7C33CC89F_…_2026-09-17_12-12-28.txt` | 32 689 байт — свежеснятый конфиг с контроллера, не закоммичен |
|
||||
| одноимённый `.yml` | **0 байт** — конвертация запускалась и не завершилась |
|
||||
| одноимённый `.yml` | **0 байт** — см. причину ниже (не «недоделанная конвертация», а падение на 1 объекте) |
|
||||
|
||||
> 🔴 **Пустой `.yml` (0 байт) рядом с непустым `.txt`** — признак незавершённой конвертации. Пересобрать шагом 2 из §3 перед использованием.
|
||||
> 🔴 **Причина пустого `.yml` (0 байт) — найдена 2026-09-17.** `config-to-yml.py` падает с exit 2 на **первом** невыразимом объекте и не пишет ничего:
|
||||
>
|
||||
> ```
|
||||
> $ python3 config-to-yml.py zont_config/config_0FA7C33CC89F_…_2026-09-17_12-12-28.txt > /tmp/zont.yml
|
||||
> Ошибка: Сценарий 11109: поддерживается только 1 шаг
|
||||
> EXIT=2 → /tmp/zont.yml = 0 байт
|
||||
> ```
|
||||
>
|
||||
> Проверка: `.yml` 0 байт **всегда** означает, что конвертер не «не доехал», а **упал на конкретном объекте**. Смотреть stderr, а не перезапускать вслепую.
|
||||
>
|
||||
> ⚠️ `>` в шелле **затирает целевой файл ещё до старта питона** — поэтому рядом с непустым `.txt` появляется пустой `.yml`. Писать через `>/tmp/out.yml` и только после успешного exit-кода переносить в репо.
|
||||
|
||||
**Содержимое проекта, не относящееся к конвертерам:**
|
||||
|
||||
@@ -214,6 +265,7 @@ grep -c '^#Z' A.txt B.txt # счётчик объектов
|
||||
## 7. Связанные заметки
|
||||
|
||||
- [[family/tech/zont-config-object-types]] — таблица типов объектов (0, 1…57, 36) и `#S`-настройки
|
||||
- [[family/tech/zont-scenario-logic-11109]] — разобранная логика сценария «Передёрнуть Автомат Котельной»
|
||||
- [[family/how-to/home-automation]] — контур автоматизации, ZONT, Modbus slave ID и регистры (§6)
|
||||
- [[family/how-to/gitea-config]] — Gitea: креды, создание репо, питфоллы
|
||||
- [[family/how-to/ha-automations]] — автоматизации HA
|
||||
|
||||
Reference in New Issue
Block a user