From 0d41ddf2e5ff985398606ea661a9bfa93dc730ee Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 17 Sep 2026 14:57:26 +0600 Subject: [PATCH] [2026-09-17] eagle: family/tech/zont-scenario-logic-11109.md --- family/tech/zont-scenario-logic-11109.md | 109 ++++++++++++++++++----- 1 file changed, 87 insertions(+), 22 deletions(-) diff --git a/family/tech/zont-scenario-logic-11109.md b/family/tech/zont-scenario-logic-11109.md index 95bc9e34..c608b05e 100644 --- a/family/tech/zont-scenario-logic-11109.md +++ b/family/tech/zont-scenario-logic-11109.md @@ -233,14 +233,28 @@ scenarios: | Значение | Что это | Доказательство из тестовых сценариев | |---|---|---| | `0` / `1` | ручной запуск (кнопка), вкл/выкл | 64 старых сценария = `1`; `11109` = `0` | -| `8` | по **расписанию** | `#Z8597` — поле 4 = `61`, поле 5 = `3354` | -| `9` | по **триггеру** (условию) | `#Z8547`, `#Z8551` — тестовые | +| `8` | по **расписанию** | `#Z8597` — поле 4 = `61`, поле 6 = `3354` ✅ расшифровано | +| `9` | по **триггеру** (условию) | `#Z8547`, `#Z8551` — оба триггерные (подтверждено Alex) | | `10` | по **интервалу** | `#Z8599` — поле 6 = `43200000` мс = **12 ч** | -Распределение по живому конфигу: `{1: 64, 0: 1, 8: 2, 9: 2, 10: 1}`. +**Поле 6** — параметр запуска (для `10` — интервал в мс; для `8` — время запуска). -**Поле 6** — параметр запуска (для `10` — интервал в мс; для `9`/`8` — иное). -**Поле 4** — у `8597` = `61` (вероятно день недели / индекс расписания), у остальных `0`. +### 🔴 Поле 4 + поле 6 при запуске по расписанию — РАСШИФРОВАНО (2026-09-17) + +`#Z8597` «Тестовый сценарий по расписанию», Alex: **ПН, СР, ЧТ, ПТ, СБ, в 13:26**. + +| Поле | Значение | Расшифровка | +|---|---|---| +| поле 4 | `61` = `0b00111101` | **битовая маска дней недели**: бит 0=ПН, 1=ВТ, …, 6=ВС. Установлены биты **0,2,3,4,5** = ПН, СР, ЧТ, ПТ, СБ ✅ | +| поле 6 | `3354` = `0x0D1A` | **время**: старший байт `0x0D` = **13** (час), младший `0x1A` = **26** (минута) → **13:26** ✅ | + +```text +#Z8597 = 11, 'Тестовый сценарий по расписанию', [8598], 61, 3354, 8, 0, 0 + ^годнедели ^время ^тип +``` + +> Формула времени: `поле6 = (час << 8) | минута`. Начало недели — **ПН** (бит 0), не ВС. +> Проверка: `61 >> 0 & 1 = 1` (ПН есть), `61 >> 1 & 1 = 0` (ВТ нет — у Alex ВТ не отмечен) ✅. ```text #Z8456=11,'Простой тестовый сценарий',[<26 ссылок>],0,0, 8,0,0 @@ -254,17 +268,46 @@ scenarios: > это **потеря информации** для значений 8/9/10. Конвертер на новом конфиге **падает** > (`Ошибка: Условие 8496: не type 49`) — новые типы не поддержаны. -### 8.2. Новые типы объектов +### 8.2. Новые типы объектов (УТОЧНЕНО ответами Alex 2026-09-17) | Тип | Что | Формат | Пример | |---|---|---|---| -| **47** | **лист дерева условий** | `[47, <оператор>, <объект>, <значение>, <порог>]` | `[47, 3, 8552, 0, -5]` — «температура ниже −5» | -| **48** | **группа условий (И/ИЛИ)** | `[48, <логика>, []]` | `[48, 0, [8493,8495]]`, `[48, 1, [...]]`, `[48, 2, [...]]` | -| **50** | **запуск команды/сценария по id** | `[50, 1, 0, 0, ]` | `[50, 1, 0, 0, 123]`, `[50, 1, 0, 0, 109]`, `[50, 0, 1, 3351, 0]` | +| **47** | **лист дерева условий** (сравнение) | `[47, <оператор>, <левый>, <правый_или_0>, <константа>]` | `[47, 3, 8552, 0, -5]` — «погода <= -5» | +| **48** | **группа условий** | `[48, <логика>, []]` | `[48, 0, [8493,8495]]` | +| **50** | **объект-триггер запуска** (внешний/системный) | `[50, 1, 0, 0, ]` | `[50, 1, 0, 0, 109]` | | **59** | **мини-скрипт ZONT** | `[59, '<код>', <арг1>, <арг2>, <флаг>]` | `[59, 'expr "%0 + %1"', 8459, 8460, 0]` | -Наблюдённые значения поля 1 у **47**: `0, 1, 3, 4` (оператор — семантика **не подтверждена**). -У **48**: `0, 1, 2` (логика группы — семантика **не подтверждена**). +**Type 47 — модель полей.** `[47, op, LEFT, RIGHT, K]`: +- `LEFT` — объект/скрипт-выражение слева; +- если `RIGHT` != `0` — **второй объект**, сравнение двух объектов (`8495`: `var1 >= objstate 9838`, RIGHT = `8494`); +- если `RIGHT` = `0` — сравнение **с константой** из поля 4 (`8493`: `OBJECT < 3`). + +**Type 47, операторы — ПОДТВЕРЖДЕНО Alex** (порядок пунктов UI: `<`, `>`, `=`, `<=`, `>=`): + +| Поле 1 | Оператор | Доказательство (формулировка Alex) | +|---|---|---| +| `0` | `<` | `8493` «значение элемента управления < 3»; `8497` «var1 < 2» | +| `1` | `>` | `8499` «Pickle(2) > 3» | +| `2` | `=` | в тестовом блоке нет; следует из порядка UI | +| `3` | `<=` | `8553` «погода из интернета <= -5» | +| `4` | `>=` | `8495` «var1 >= значение 13/9 рад. ванная 2эт» | + +> 🔴 **Ловушка:** порядок пунктов UI (`<`,`>`,`=`,`<=`,`>=`) **не** логически упорядочен. +> `=` стоит **третьим** (код `2`), между `>` и `<=`. Не «додумывать» порядок как +> «сначала все меньше, потом все больше» — это даёт неверные коды. + +**Type 48, логика группы — ПОДТВЕРЖДЕНО Alex** (по описанию теста 8456): + +| Поле 1 | Логика | Доказательство | +|---|---|---| +| `0` | **И** (все условия) | `8496 = [48,0,[8493,8495]]` — «условие И: ...» | +| `1` | **ИЛИ** (любое) | `8501 = [48,1,[8497,8500]]` — «ИЛИ: ...» | +| `2` | **НЕ** (отрицание) | `8500 = [48,2,[8499]]` — «НЕ (...)» | + +**Type 50 — триггер запуска.** `[50, 1, 0, 0, ]`, где `` — **внешний/системный +объект**, которого нет среди `#Z` (напр. `109` — «погода из интернета»). Сценарий «по времени» +(`8547`, шаг `8550`) ссылается на `109` — в UI это тоже триггер-условие запуска +(поле 5 типа 11 = `9`). ### 8.3. Type 59 — встроенный скриптовый язык @@ -337,19 +380,41 @@ scenarios: | `8597` | Тестовый сценарий по расписанию | `8` (расписание) | | `8599` | Тестовый сценарий по интервалу | `10` (интервал, 12 ч) | -### 8.7. ⏳ ОТКРЫТЫЕ ВОПРОСЫ (заданы Alex, ответа ещё нет) +### 8.7. ✅ ВОПРОСЫ ЗАКРЫТЫ — ответы Alex (2026-09-17) -| # | Вопрос | -|---|---| -| 1 | **Type 47, поле 1** — что за оператор? Наблюдены `0, 1, 3, 4`. Гипотеза: `0`=равно, `1`=не равно, `3`=меньше, `4`=больше — **не подтверждено** | -| 2 | **Type 48, поле 1** — логика группы? Наблюдены `0, 1, 2`. Гипотеза: `0`=И, `1`=ИЛИ, `2`=НЕ — **не подтверждено** | -| 3 | **Type 50** — что за объект? `[50, 1, 0, 0, ]` — запуск по расписанию/интервалу? | -| 4 | **Type 11, поле 4** — у `8597` = `61`, у остальных `0`. Минуты? День недели? | -| 5 | **Type 59** — есть ли документация на язык? Или это внутренний формат | +Alex создал тестовые сценарии и описал, что видно в UI. Все пять вопросов закрыты: -> 🔴 **Не строить гипотезы вместо ответа.** Alex явно предложил: «если нужна будет подсказка что и -> чем является по типу/значениям — спрашивай меня». Вопросы заданы, ждём ответа. -> До ответа **правки конвертера не делать** — можно закодировать неверную семантику. +| # | Вопрос | Ответ | Проверка по конфигу | +|---|---|---|---| +| 1 | **Type 47, оператор** | Операнды в UI: **`<`, `>`, `=`, `<=`, `>=`** → коды `0..4` | ✅ все 5 листов сошлись | +| 2 | **Type 48, логика** | **`0`=И, `1`=ИЛИ, `2`=НЕ** | ✅ по описанию теста 8456 | +| 3 | **Type 50** | **Объект-триггер запуска** (внешний, напр. `109` «погода из интернета») | ✅ | +| 4 | **Type 11, поле 4** | **Маска дней недели** (`61` = ПН,СР,ЧТ,ПТ,СБ), поле 6 = `(час<<8)|мин` | ✅ 13:26 | +| 5 | **`;#a`/`;#h`/`;#p`** | (не переспрашивал; остаются гипотезой) | ⏳ | + +**Разбор тестовых сценариев Alex (ответы дословно → факты конфига):** + +| Сценарий | Что сказал Alex | Что в конфиге | +|---|---|---| +| `8597` расписание | «пн, ср, чт, пт, сб, в 13:26» | поле 4=`61`, поле 6=`3354`=13:26 ✅ | +| `8547` «по времени» | «по триггеру, триггер на день недели: пн,ср,чт,сб,вс» | поле 5=`9`, шаг `8550` → `[50,1,0,0,109]` | +| `8551` «по триггеру» | «триггер сравнение: погода из интернета <= -5, действие вывод в терминал» | `8553=[47,3,8552,0,-5]`, `8552=[49,8254,0,4]`, `8254`=«Погода из интернета», then `8554`=`puts "Температура упала ниже -5"` ✅ | +| `8547` шаг `8550` | «только одно действие: вывод "test" в терминал» | `8549=[59,'puts "test"',0,0,0]` ✅ | +| `8456` (26 ссылок) | «set var много, у каждого разный тип значения» | 7× `set var1` + 7 разных типов объектов ✅ | + +**Type 46 — модель полей ПОДТВЕРЖДЕНА (5 полей = если/то/иначе):** + +```text +#Z = [46, <вид>, , [<ТОГДА>...], [<ИНАЧЕ>...]] +``` + +Alex по тесту `8456` описал: «если (условие И: …) То: … Иначе: Сохранить событие» — +и это точно соответствует `8506 = [46, 0, 8496, [8505], []]` + `8505 = [46, 1, 8501, [8502,8503], [8504]]`, +где `[8504]` = ветка **ИНАЧЕ**. Поле 4 = список **ИНАЧЕ** (ранее помечено «семантика не подтверждена» — теперь подтверждена). + +> ⚠️ Поле 1 шага: `0` у внешнего, `1` у вложенного (`8505`) — вероятно «уровень вложенности» +> или признак вложенного блока. Точная семантика не подтверждена, но round-trip требует +> сохранять как есть. ### 8.8. Скрипты разбора (в проекте)