[2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-scenario-logic-11109.md
This commit is contained in:
@@ -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-17h
|
updated: 2026-09-17i
|
||||||
---
|
---
|
||||||
|
|
||||||
# ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml`
|
# ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml`
|
||||||
@@ -384,20 +384,20 @@ diff A.txt B.txt # пусто = round-trip чистый
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5c. 🔄 Переработка структуры YAML сценариев — ПРИОСТАНОВЛЕНО, ждёт решения (2026-09-17)
|
## 5c. 🔄 Переработка структуры YAML сценариев — 🟢 СОГЛАСОВАНО, парсер дописывается (2026-09-17)
|
||||||
|
|
||||||
> ⏸ **СТАТУС: РАБОТА НЕ НАЧАТА. Alex дал «стоп» и поставил под сомнение сам проект.**
|
> ✅ **СТАТУС (обновлено 2026-09-17, вечер): Alex дал «дописывай парсер».** Семантика типов
|
||||||
> Причина — исследование облачного API ZONT ([[family/tech/zont-api]]): Alex предположил, что
|
> 47/48/50/59 **раскрыта** (ответы Alex — [[family/tech/zont-scenario-logic-11109]] §8.7),
|
||||||
> у ZONT есть свой API/формат, покрывающий датчики и автоматику, и спросил — доделывать конвертер
|
> таблица операторов и логики подтверждена фактами конфига. Работа по §5c разрешена.
|
||||||
> или переписать всё с 0.
|
|
||||||
>
|
>
|
||||||
> **Результат исследования: API конфиг не поддерживает** (сценарии/реле/11/14/46/49 — в API нет,
|
> ⚠️ **Но остались 8 непрозрачных элементов** конкретно в сценарии `8456`
|
||||||
> `scenario` в доке 0 раз). Переписывать с 0 **не на что**. Конвертер остаётся единственным путём
|
> (`#8458`, `#8463`, `#8465`, `#8467`, `#8486`, `#8488`, `#9500`, `#8457`/`#8470`).
|
||||||
> к сценариям. **Новый открытый вопрос Alex'у:** нужен ли онлайн-мониторинг ZONT в HA
|
> Alex спросил «всё ли кристально прозрачно?» — ответ: **нет**. Вопросы заданы, ответа ещё нет
|
||||||
> (отдельный проект на API, дополняет конвертер).
|
> (полный список — [[family/tech/zont-scenario-logic-11109]] §8.10).
|
||||||
>
|
>
|
||||||
> ⚠️ **Код конвертера НЕ тронут.** Коммит `199f2b1` — последнее рабочее состояние.
|
> 📌 **Решение по стратегии парсера:** сохранять байт-в-байт всё, что не понято (скрипты `59`
|
||||||
> Не начинать §5c без явного «делай» от Alex.
|
> как сырые строки, суффиксы `;#a`/`;#h`/`;#p`, отсутствующие id — как есть), без «умного» перевода.
|
||||||
|
> Тогда round-trip чистый, а непонятное не портится.
|
||||||
|
|
||||||
**Задача Alex (исходная):** «переписать блок парсинга/сборки сценариев чтобы он составлял синтаксис как у Home Assistant automations вместо текущей разбросанной структуры. с опциональными айдишниками у операторов».
|
**Задача Alex (исходная):** «переписать блок парсинга/сборки сценариев чтобы он составлял синтаксис как у Home Assistant automations вместо текущей разбросанной структуры. с опциональными айдишниками у операторов».
|
||||||
|
|
||||||
@@ -639,9 +639,14 @@ EXIT=2
|
|||||||
2. **Новые типы:** `47` (лист условия), `48` (группа И/ИЛИ), `50` (запуск по id),
|
2. **Новые типы:** `47` (лист условия), `48` (группа И/ИЛИ), `50` (запуск по id),
|
||||||
`59` (мини-скрипт: `objcmd`/`objstate`/`expr`/`set`/`puts`/`storeev`).
|
`59` (мини-скрипт: `objcmd`/`objstate`/`expr`/`set`/`puts`/`storeev`).
|
||||||
|
|
||||||
**Что нужно сделать** (после ответов Alex на семантику — [[family/tech/zont-scenario-logic-11109]] §8.7):
|
**Что нужно сделать** (семантика получена — [[family/tech/zont-scenario-logic-11109]] §8.7;
|
||||||
парсер 47/48/50/59 с рекурсивным деревом условий; поле 5 хранить как тип запуска; принимать
|
работа разрешена Alex'ом 2026-09-17 вечером, «дописывай парсер»):
|
||||||
непустое поле 4 шага; допускать не-46 типы в поле 2.
|
парсер 47/48/50/59 с рекурсивным деревом условий; поле 5 хранить как тип запуска (плюс маска дней
|
||||||
|
и время для расписания); принимать непустое поле 4 шага; допускать не-46 типы в поле 2.
|
||||||
|
|
||||||
|
> 📌 **Стратегия:** всё непонятое (скрипты `59` дословно, суффиксы `;#a`/`;#h`/`;#p`, отсутствующие id)
|
||||||
|
> сохранять байт-в-байт, без «умного» перевода — round-trip останется чистым. 8 открытых вопросов
|
||||||
|
> по сценарию `8456` — [[family/tech/zont-scenario-logic-11109]] §8.10.
|
||||||
|
|
||||||
➡️ **Полный разбор — [[family/tech/zont-scenario-logic-11109]] §8**
|
➡️ **Полный разбор — [[family/tech/zont-scenario-logic-11109]] §8**
|
||||||
|
|
||||||
@@ -664,6 +669,8 @@ EXIT=2
|
|||||||
| `zont_api_docs/` | ✅ **новая папка** — локальная копия доки облачного API ZONT (`zont_api_docs.html` 250 KB, `zont_api_docs.txt` 99 KB, `convert.py`). **не в git**. Исследование — [[family/tech/zont-api]] |
|
| `zont_api_docs/` | ✅ **новая папка** — локальная копия доки облачного API ZONT (`zont_api_docs.html` 250 KB, `zont_api_docs.txt` 99 KB, `convert.py`). **не в git**. Исследование — [[family/tech/zont-api]] |
|
||||||
| `zont_config/config_local_2026-09-17_14-16-35.txt` | 🆕 **34 907 байт, 660 `#Z`, 25 `#S`** — конфиг с **тестовыми сценариями** Alex (все виды триггеров/логики). Снят с `http://192.168.0.50/config.txt`. **не в git** |
|
| `zont_config/config_local_2026-09-17_14-16-35.txt` | 🆕 **34 907 байт, 660 `#Z`, 25 `#S`** — конфиг с **тестовыми сценариями** Alex (все виды триггеров/логики). Снят с `http://192.168.0.50/config.txt`. **не в git** |
|
||||||
| `dump_new_types.py`, `probe_types.py`, `trace_scenarios.py` | 🆕 **новые скрипты разбора** сценарных типов 47/48/50/59. Разбор — [[family/tech/zont-scenario-logic-11109]] §8.8. **не в git** |
|
| `dump_new_types.py`, `probe_types.py`, `trace_scenarios.py` | 🆕 **новые скрипты разбора** сценарных типов 47/48/50/59. Разбор — [[family/tech/zont-scenario-logic-11109]] §8.8. **не в git** |
|
||||||
|
| `read_scenarios.py` | 🆕 **читаемый дамп сценария** — дерево если/то/иначе с именами объектов. Токенайзер `split_top()` учитывает кавычки/`\`/`[]`. **не в git** |
|
||||||
|
| `probe_sched.py`, `verify_answers.py`, `check_ops.py`, `audit_8456.py`, `audit2.py` | 🆕 **проверочные скрипты** — расписание, ответы Alex против конфига, операторы, аудит 8456. **не в git** |
|
||||||
| `~/rasputin-tmp/zont-util/` | ✅ **новая папка на Mac** (вне репо) — настроечная утилита `H1000 Programmator` 2.8.5, драйвер USB, прошивка `.enc`, скрипт распаковки `extract.py`. Разбор — §5g-2, [[family/tech/zont-api]] §10 |
|
| `~/rasputin-tmp/zont-util/` | ✅ **новая папка на Mac** (вне репо) — настроечная утилита `H1000 Programmator` 2.8.5, драйвер USB, прошивка `.enc`, скрипт распаковки `extract.py`. Разбор — §5g-2, [[family/tech/zont-api]] §10 |
|
||||||
| `~/rasputin-tmp/zont-{auth-probe,recon,recon2,ws-probe}.js` | ✅ скрипты разведки локального WS-интерфейса. **не в git** |
|
| `~/rasputin-tmp/zont-{auth-probe,recon,recon2,ws-probe}.js` | ✅ скрипты разведки локального WS-интерфейса. **не в git** |
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ tags:
|
|||||||
- homeautomation
|
- homeautomation
|
||||||
title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45)
|
title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45)
|
||||||
type: tech
|
type: tech
|
||||||
updated: '2026-09-17d'
|
updated: '2026-09-17e'
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔁 ZONT — сценарная логика и конструктор логики
|
# 🔁 ZONT — сценарная логика и конструктор логики
|
||||||
@@ -420,19 +420,57 @@ Alex по тесту `8456` описал: «если (условие И: …) Т
|
|||||||
|
|
||||||
| Файл | Назначение |
|
| Файл | Назначение |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| `read_scenarios.py` | 🆕 **читаемый дамп любого сценария** — дерево если/то/иначе с именами объектов. `python3 read_scenarios.py <config> <id>` |
|
||||||
| `dump_new_types.py` | дамп типов 11/45/46/47/48/49/50/59 целиком |
|
| `dump_new_types.py` | дамп типов 11/45/46/47/48/49/50/59 целиком |
|
||||||
| `probe_types.py` | распределение поля 5 у type 11; тело контейнера; блок 8450–8560 |
|
| `probe_types.py` | распределение поля 5 у type 11; тело контейнера; блок 8450–8560 |
|
||||||
| `trace_scenarios.py` | трассировка сценарных графов, поиск сценариев с новыми типами |
|
| `trace_scenarios.py` | трассировка сценарных графов, поиск сценариев с новыми типами |
|
||||||
|
| `probe_sched.py` | 🆕 проверка расписания: маска дней + время |
|
||||||
|
| `verify_answers.py` | 🆕 кросс-проверка ответов Alex против фактов конфига |
|
||||||
|
| `check_ops.py` | 🆕 проверка таблицы операторов type 47 |
|
||||||
|
| `audit_8456.py`, `audit2.py` | 🆕 аудит прозрачности элементов сценария 8456 |
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /Users/admin/Automation/HA-ZONT-Modbus
|
cd /Users/admin/Automation/HA-ZONT-Modbus
|
||||||
python3 probe_types.py # → семантика поля 5, тестовый блок
|
python3 read_scenarios.py zont_config/config_local_2026-09-17_14-16-35.txt 8456 # дерево сценария
|
||||||
python3 dump_new_types.py # → все сценарные объекты
|
python3 read_scenarios.py zont_config/config_local_2026-09-17_14-16-35.txt # все сценарии
|
||||||
|
python3 probe_types.py # семантика поля 5, тестовый блок
|
||||||
|
python3 dump_new_types.py # все сценарные объекты
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ `trace_scenarios.py` падает на `TypeError: unhashable type: 'list'` (шаг `8457` — type 9,
|
> ✅ **Токенайзер починен.** Старый `read_scenarios.py` рвал строки со скриптами на запятых
|
||||||
> у него `cond` = `[16, 'Контур ГВС', …]`, а скрипт ждёт скаляр). Не критично — `probe_types.py`
|
> внутри кавычек (`objcmd 9102 "6,%0";#a` разваливалось). Новый `split_top()` учитывает
|
||||||
> даёт те же данные. Чинить при следующем заходе.
|
> кавычки, экранирование `\` и вложенные `[]` — теперь скрипты печатаются как есть.
|
||||||
|
|
||||||
|
### 8.10. ⏳ НЕПРОЗРАЧНЫЕ ЭЛЕМЕНТЫ СЦЕНАРИЯ 8456 (вопросы заданы Alex 2026-09-17, ответа нет)
|
||||||
|
|
||||||
|
Alex спросил: «а по всем действиям в "Простой тестовый сценарий" — тебе всё кристально прозрачно?»
|
||||||
|
Ответ — **нет**. Ниже ровно то, что не выводится из конфига. **Не строить гипотезы — ждать ответа.**
|
||||||
|
|
||||||
|
| # | Элемент | Что неясно |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | `#Z8456` поле 5 = `8` (расписание), но поле 4 = `0`, поле 6 = `0` | **Как запускается 8456?** Расписание не задано. Что значит `8` без маски/времени? Ручной запуск? |
|
||||||
|
| 2 | `#Z8458 = [59, 'objcmd 8700 "1 %0"', 10.5, 0, 1]` | Единственный скрипт с **нецелым** `%0` (`10.5`) и **флагом `1`** в поле 4 (у всех остальных `0`). Что за инструкция в UI? |
|
||||||
|
| 3 | `#Z8463 = [59, 'objcmd 9102 "6,%0";#a', 8462, 0, 0]`, где `8462` = скрипт `expr "%0 + %1"` | Аргумент = **ссылка на другой скрипт**. Что за суффикс `;#a`? |
|
||||||
|
| 4 | `#Z8465 = [59, 'objcmd 11907 ",,,%0";#h', 8464, 0, 0]`, где `8464` = `[49, 4099, 0, 8]` (условие) | Аргумент = **условие**. Что за `;#h`? |
|
||||||
|
| 5 | `#Z8467 = [59, '3', 0, 0, 0]` | Скрипт = просто цифра `3`. Константа? Зачем отдельным действием? |
|
||||||
|
| 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` — что это? |
|
||||||
|
| 8 | `#Z8457 = [9,'Установить целевую температуру 23.8...',8669,'2968']`, `#Z8470 = [9,...,8669,'8574']` | Значение `'2968'` — **отсутствующий объект**. Это «установить температуру»/«активировать режим»? |
|
||||||
|
|
||||||
|
**Что уже прозрачно (не переспрашивать):**
|
||||||
|
|
||||||
|
- 7× `set var1` и их источники: `8450`(Температура подачи, тип 27), `9864`(Статус 13/9, тип 0),
|
||||||
|
`8560`(Контур газ котла, тип 16), `9263`(Реле 1 конвектор, тип 14), `8254`(Погода из интернета, тип 1),
|
||||||
|
`4098`(Адаптер газ. котла, тип 6), `8382`(Температура Zigbee, тип 1) ✅
|
||||||
|
- `#8466` `puts "Отладка"`, `#8468` `storeev I "z"`, `#8469` `storeev A "asdf"` — вывод/события ✅
|
||||||
|
- `#8489` пауза 5 суток (`432000000` мс), дерево `#8506`→`#8505` (И/ИЛИ/НЕ + ИНАЧЕ) ✅
|
||||||
|
- `#8195` SMS `CMC оповещение` → `8192` (2 номера) ✅
|
||||||
|
- `#11109` как **вложенный сценарий** внутри 8456 ✅
|
||||||
|
- `#8507` — ссылка на **отсутствующий объект** (хвост поля 2) ✅
|
||||||
|
|
||||||
|
**Почему неясные элементы не блокируют парсер:** стратегия — сохранять их **дословно**
|
||||||
|
(type 59 как сырые строки с `arg1..arg3`, отсутствующие id — как есть). Round-trip останется
|
||||||
|
байт-точным независимо от того, понята семантика или нет.
|
||||||
|
|
||||||
### 8.9. Состояние: конвертер на новом конфиге ПАДАЕТ
|
### 8.9. Состояние: конвертер на новом конфиге ПАДАЕТ
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user