diff --git a/family/how-to/zont-config-compiler.md b/family/how-to/zont-config-compiler.md index a7bdea2f..878002af 100644 --- a/family/how-to/zont-config-compiler.md +++ b/family/how-to/zont-config-compiler.md @@ -21,7 +21,7 @@ tags: - homeautomation title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml type: how-to -updated: 2026-09-17h +updated: 2026-09-17i --- # ⚙️ 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 дал «стоп» и поставил под сомнение сам проект.** -> Причина — исследование облачного API ZONT ([[family/tech/zont-api]]): Alex предположил, что -> у ZONT есть свой API/формат, покрывающий датчики и автоматику, и спросил — доделывать конвертер -> или переписать всё с 0. +> ✅ **СТАТУС (обновлено 2026-09-17, вечер): Alex дал «дописывай парсер».** Семантика типов +> 47/48/50/59 **раскрыта** (ответы Alex — [[family/tech/zont-scenario-logic-11109]] §8.7), +> таблица операторов и логики подтверждена фактами конфига. Работа по §5c разрешена. > -> **Результат исследования: API конфиг не поддерживает** (сценарии/реле/11/14/46/49 — в API нет, -> `scenario` в доке 0 раз). Переписывать с 0 **не на что**. Конвертер остаётся единственным путём -> к сценариям. **Новый открытый вопрос Alex'у:** нужен ли онлайн-мониторинг ZONT в HA -> (отдельный проект на API, дополняет конвертер). +> ⚠️ **Но остались 8 непрозрачных элементов** конкретно в сценарии `8456` +> (`#8458`, `#8463`, `#8465`, `#8467`, `#8486`, `#8488`, `#9500`, `#8457`/`#8470`). +> Alex спросил «всё ли кристально прозрачно?» — ответ: **нет**. Вопросы заданы, ответа ещё нет +> (полный список — [[family/tech/zont-scenario-logic-11109]] §8.10). > -> ⚠️ **Код конвертера НЕ тронут.** Коммит `199f2b1` — последнее рабочее состояние. -> Не начинать §5c без явного «делай» от Alex. +> 📌 **Решение по стратегии парсера:** сохранять байт-в-байт всё, что не понято (скрипты `59` +> как сырые строки, суффиксы `;#a`/`;#h`/`;#p`, отсутствующие id — как есть), без «умного» перевода. +> Тогда round-trip чистый, а непонятное не портится. **Задача Alex (исходная):** «переписать блок парсинга/сборки сценариев чтобы он составлял синтаксис как у Home Assistant automations вместо текущей разбросанной структуры. с опциональными айдишниками у операторов». @@ -639,9 +639,14 @@ EXIT=2 2. **Новые типы:** `47` (лист условия), `48` (группа И/ИЛИ), `50` (запуск по id), `59` (мини-скрипт: `objcmd`/`objstate`/`expr`/`set`/`puts`/`storeev`). -**Что нужно сделать** (после ответов Alex на семантику — [[family/tech/zont-scenario-logic-11109]] §8.7): -парсер 47/48/50/59 с рекурсивным деревом условий; поле 5 хранить как тип запуска; принимать -непустое поле 4 шага; допускать не-46 типы в поле 2. +**Что нужно сделать** (семантика получена — [[family/tech/zont-scenario-logic-11109]] §8.7; +работа разрешена Alex'ом 2026-09-17 вечером, «дописывай парсер»): +парсер 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** @@ -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_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** | +| `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-{auth-probe,recon,recon2,ws-probe}.js` | ✅ скрипты разведки локального WS-интерфейса. **не в git** | diff --git a/family/tech/zont-scenario-logic-11109.md b/family/tech/zont-scenario-logic-11109.md index c608b05e..014e8a6b 100644 --- a/family/tech/zont-scenario-logic-11109.md +++ b/family/tech/zont-scenario-logic-11109.md @@ -19,7 +19,7 @@ tags: - homeautomation title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45) type: tech -updated: '2026-09-17d' +updated: '2026-09-17e' --- # 🔁 ZONT — сценарная логика и конструктор логики @@ -420,19 +420,57 @@ Alex по тесту `8456` описал: «если (условие И: …) Т | Файл | Назначение | |---|---| +| `read_scenarios.py` | 🆕 **читаемый дамп любого сценария** — дерево если/то/иначе с именами объектов. `python3 read_scenarios.py ` | | `dump_new_types.py` | дамп типов 11/45/46/47/48/49/50/59 целиком | | `probe_types.py` | распределение поля 5 у type 11; тело контейнера; блок 8450–8560 | | `trace_scenarios.py` | трассировка сценарных графов, поиск сценариев с новыми типами | +| `probe_sched.py` | 🆕 проверка расписания: маска дней + время | +| `verify_answers.py` | 🆕 кросс-проверка ответов Alex против фактов конфига | +| `check_ops.py` | 🆕 проверка таблицы операторов type 47 | +| `audit_8456.py`, `audit2.py` | 🆕 аудит прозрачности элементов сценария 8456 | ```bash cd /Users/admin/Automation/HA-ZONT-Modbus -python3 probe_types.py # → семантика поля 5, тестовый блок -python3 dump_new_types.py # → все сценарные объекты +python3 read_scenarios.py zont_config/config_local_2026-09-17_14-16-35.txt 8456 # дерево сценария +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, -> у него `cond` = `[16, 'Контур ГВС', …]`, а скрипт ждёт скаляр). Не критично — `probe_types.py` -> даёт те же данные. Чинить при следующем заходе. +> ✅ **Токенайзер починен.** Старый `read_scenarios.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. Состояние: конвертер на новом конфиге ПАДАЕТ