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

This commit is contained in:
Alexey Martemyanov
2026-09-17 18:56:36 +06:00
parent b7e945e787
commit 72ba9f774c
2 changed files with 171 additions and 55 deletions
+46 -26
View File
@@ -1,41 +1,60 @@
# 8.17. ✅ МОДЕЛЬ ЗАКРЫТА (2026-09-17, финал) — поле 5, форма сценария, type 47/49
> **Статус:** все открытые вопросы §8.16 закрыты. Ниже — подтверждённые факты.
> Таблица `TRIGGER_KINDS` **удалена из кода**; доказательство получено **тостингом 5 сценариев
> в UI**: Alex выключил и снова включил каждый тестовый сценарий, поле 5 снято до и после.
> Таблица `TRIGGER_KINDS` **удалена из кода**; доказательство получено **тостингом сценариев
> в UI**: Alex выключил/включил тестовые сценарии, поле 5 снято до и после, плюс повторный
> тостинг `8597`/`8599` дал **включённые** значения `schedule`/`interval` (`0` и `2`).
## (а) 🔴 Поле 5 типа 11 = тип запуска + флаг «выключен». ПОДТВЕРЖДЕНО тостингом
## (а) 🔴 Поле 5 типа 11 = **тип сценария** + флаг «выключен». ПОДТВЕРЖДЕНО прибора + Alex
```text
kind = field5 & 7 # 0 = ручной/расписание, 1 = триггер, 2 = интервал
type = field5 & 7 # 0 = manual | schedule, 1 = trigger, 2 = interval
enabled = not (field5 & 8) # бит 8 = сценарий ВЫКЛЮЧЕН
```
| Сценарий | Выкл | Вкл | `kind` | Прочие поля |
> 🔴 **Слово — `type`, не `kind`.** Слова `kind` в конфиге и UI нет; я его выдумал. Alex:
> «какой нахуй kind?? что это блядь значит?! я его откуда тебе высру?!» Типы назвал Alex:
> **`manual`, `trigger`, `interval`, `schedule`**.
| Сценарий | Выкл | Вкл | `type` | Прочие поля |
|---|---|---|---|---|
| `8456` «Простой тестовый» | `8` | `0` | 0 | — |
| `8597` «по расписанию» | `8` | `0` | 0 | поля 3/4 = `61`, `3354` |
| `8547` «по времени» | `9` | `1` | 1 | — |
| `8551` «по триггеру» | `9` | `1` | 1 | — |
| `9628` «Автомат.: Рад. ванная 2эт ВКЛ» | `9` | `1` | 1 | — |
| `8599` «по интервалу» | `10` | `2` | 2 | поле 6 = `43200000` мс |
| `8456` «Простой тестовый» | `8` | — | 0 = `manual` | — |
| `8597` «по расписанию» | `8` | **`0`** | 0 = `schedule` | поля 3/4 = `61`, `3354` |
| `11109` «Передернуть Котельной» | — | `0` | 0 = `manual` | 2 элемента в поле 2 |
| `8547` «по времени» | `9` | — | 1 = `trigger` | — |
| `8551` «по триггеру» | `9` | — | 1 = `trigger` | — |
| `9628` «Автомат.: Рад. ванная 2эт ВКЛ» | `9` | `1` | 1 = `trigger` | — |
| `8599` «по интервалу» | `10` | **`2`** | 2 = `interval` | поле 6 = `43200000` мс |
**🔴 Включённые `0` (8597) и `2` (8599) получены тостингом на приборе:** Alex включил оба
сценария в UI, конфиг снят заново (`curl -s http://192.168.0.50/config.txt`). До этого момента
включённые значения `schedule`/`interval` были неизвестны — были только выключенные `8`/`10`.
**Итог: у каждого типа есть вкл/выкл, и всегда `вкл + 8 = выкл`:**
| тип | вкл | выкл |
|---|---|---|
| `manual` | `0` (11109) | `8` (8456) |
| `schedule` | `0` (8597) | `8` (был) |
| `trigger` | `1` (64 шт) | `9` (8547, 8551) |
| `interval` | `2` (8599) | `10` (был) |
> ⚠️ **`manual` (0) и `schedule` (0) — один и тот же `type`.** Различаются **наличием полей 3/4**
> (`days_mask` + `time`): у расписания они заполнены, у ручного — нули. Alex: «manual от schedule
> очевидно отличаются наличием блядь schedule!»
> Кодировку расписания см. §8.1 (`61` = ПН,СР,ЧТ,ПТ,СБ; `3354` = `(13<<8)|26` = 13:26).
**Почему старая модель `{0:manual,1:manual,8:schedule,9:trigger,10:interval}` была неверна:**
она читала число как «класс запуска» целиком. На самом деле число **двухбитовое по смыслу**:
младшие 3 бита = тип, бит `8` = выключено. Отсюда все противоречия §8.16:
`9628` с `1` — триггерный (бит 8 не стоит, kind = 1), `8456` с `8` — ручной, но выключенный.
младшие 3 бита = тип, бит `8` = выключено. Отсюда все противоречия §8.16.
> ⚠️ **Ручной (0) и расписание (0) — один и тот же `kind`.** Различаются **наличием полей 3/4**
> (`days_mask` + `time`): у расписания они заполнены, у ручного — нули.
> Кодировку расписания см. §8.1 (`61` = ПН,СР,ЧТ,ПТ,СБ; `3354` = `(13<<8)|26` = 13:26).
> **Снятые гипотезы (не возвращаться):** «`field5 & 7` = значение из условия шага 46»
> (32 расхождения из 70 — пары ВКЛ/ВЫКЛ `9628`/`9629` имеют одинаковое поле `1` при
> противоположных условиях); «поле 5 не выводится из содержимого» (выводится: тип + бит 8).
**Что в коде:** `TRIGGER_KINDS`, `_raw_trigger_kind`, `_raw_trigger_params`, `time_raw` **удалены**.
Заголовок сценария в YAML теперь: `enabled`, `_f5` (поле 5 целиком), `_kind` (только если
`f5 & 7 ≠ 0`), `days_mask`, `time`, `interval_ms`.
> ⚠️ **Обновлено после правок формы:** `kind`/`kind_raw` из видимой части **убраны** — это тоже
> была выдумка (слова `kind` в конфиге нет). Всё, что нужно энкодеру, лежит в служебных
> `_f5`/`_kind` с подчёркиванием.
Заголовок сценария в YAML теперь: `enabled`, **`type`**, `days`/`days_mask`, `time`, `interval_ms`.
Служебные `_f5`/`_kind` **тоже убраны** — поле 5 полностью восстанавливается из `enabled` + `type`.
## (б) Форма YAML сценария — ПЕРЕСМОТРЕНА Alex'ом (финал сессии)
@@ -115,11 +134,12 @@ Alex отверг `if`/`then`/`else` в YAML как **выдумку**:
| # | Что | Статус |
|---|---|---|
| 1 | `dump_condition` type 49 → `{id, object, value}` вместо `{id, condition: {object, operator, value}}` | ✅ сделано |
| 2 | `dump_step` type 46 → `{id, trigger: <условие>, action: <первый then id>}`, без `if`/`then`/`else` | ✅ сделано |
| 3 | Заголовок сценария — `kind`/`kind_raw` убраны в служебные `_kind`/`_f5` | ✅ сделано |
| 2 | `dump_step` type 46 → `{id, action: <первый then id>}`; `trigger` **вынимается на уровень сценария** | ✅ сделано |
| 3 | Заголовок сценария — `kind`/`kind_raw`/`_kind`/`_f5` **убраны**, вместо них видимое поле **`type`** | ✅ сделано |
| 4 | Непустые `then`/`else` / второй+ id → что писать в форме | 🔴 **открытый вопрос, ждёт Alex** |
| 5 | `dump_action` — делегирование в `dump_step` (чтобы type 5/9 в телах не падали в `raw`) | ✅ сделано (было раньше) |
| 6 | Энкодер под новую форму | ⏸ не начат — ждёт подтверждения формы |
| 5 | `dump_action` — делегирование в `dump_step` (чтобы type 5/9 в телах не падали в `raw`) | ✅ сделано |
| 6 | Энкодер под новую форму | ⏸ **не начат** — ждёт подтверждения формы. Round-trip сломан |
| 7 | `type` для `11109` выходит `trigger` вместо `manual` | ⚠️ **баг**, гипотеза правки: `trigger` = ровно один элемент в `steps` И он типа 46. Прогон не выполнен |
### ✅ Фактический вывод парсера после правок (проверено 2026-09-17)