[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 16:18:49 +06:00
parent ebf2934d38
commit 60a25605e3
2 changed files with 118 additions and 10 deletions
+80 -1
View File
@@ -19,7 +19,7 @@ tags:
- homeautomation
title: 🔁 ZONT — сценарная логика и конструктор (11/46/47/48/49/50/59/45/9/5)
type: tech
updated: 2026-09-17e
updated: 2026-09-17f
---
# 🔁 ZONT — сценарная логика и конструктор логики
@@ -579,3 +579,82 @@ scenarios:
`actions`) рендерятся как YAML-якоря `*id00N` (`8195`, `9500` в `8456`) — читается хуже, но байт-точно.
**Артефакт:** `zont_config/config_local_2026-09-17_14-16-35.yml` (6110 строк) — в проекте, не в `/tmp`.
### 8.13. 🔴 УСТАВКА ТЕМПЕРАТУРЫ — формула `код = (t °C + 273) × 10` (подтверждено 3 точками, 2026-09-17)
**Главное открытие разбора type 9.** Поле 4 команды «Установить целевую температуру» — **не ссылка,
а закодированная уставка в Кельвинах ×10** (fixed point):
```text
код = (t_celsius + 273) * 10 обратно: t_celsius = (код - 2730) / 10
```
**Три подтверждённые точки** (Alex менял температуру в UI, я сверял с конфигом):
| Уставка в UI | Код в конфиге | Проверка |
|---|---|---|
| `22` | `2950` | `(22 + 273) * 10 = 2950` ✅ |
| `23.8` | `2968` | `(23.8 + 273) * 10 = 2968` ✅ |
| `5.2` | `2782` | `(5.2 + 273) * 10 = 2782` ✅ (предсказано заранее, совпало) |
> **Как это выглядит в конфиге:** сам код уставки лежит в поле 4, а **человекочитаемая**
> температура — только в текстовой подписи поля 2, которую контроллер собирает сам:
> `#Z8817=9,'Установить целевую температуру 5.2 для контура Спальня',10034,'2782'`.
> 🔴 **Раньше я ошибочно считал `'2950'`/`'2968'` «ссылкой на отсутствующий объект»** —
> это была уставка, просто закодированная.
>
> ⚠️ **Питфолл метода:** на **двух** точках линейная формула подбирается бесконечно многими
> способами. Я нашёл `(t+273)*10` на 22 и 23.8, но **не вшивал её в парсер**, пока Alex не дал
> третью точку (5.2). Правило: **≥3 точки, прежде чем кодировать формулу.**
**Что раскрыто в YAML (type 9):**
```yaml
- id: 8817
command: Установить целевую температуру 5.2 для контура Спальня
target: 10034
target_name: Спальня # развёрнуто из id (тип 16 = контур)
target_type: 16
value: '2782' # код как в конфиге (источник истины)
temp_c: 5.2 # ← раскодировано, ТОЛЬКО если формула сходится точно
- id: 9826
command: 'Включить реле «Реле 1: Конвектор кухня»'
target: 9263
target_name: 'Реле 1: Конвектор кухня'
target_type: 14 # 14 = реле
value: '1'
state_on: true
```
`temp_c` появляется **только** при точном совпадении формулы (`|round(t*10)-(код-2730)| < 0.5`);
иначе остаётся голый `value`. `state_on: true/false` — только при `value == '1'/'0'`.
### 8.14. `objcmd <id> "1 %0"` — запись значения в объект
Скрипт `#Z<id> = [59, 'objcmd <target> "1 %0"', <значение>, 0, <флаг>]` пишет `<значение>`
в объект `<target>`:
```yaml
- id: 8818
script: objcmd 8700 "1 %0"
args: [14.5, 0, 1]
target: 8700
target_name: Температура Детская # развёрнуто из id
set_value: 14.5 # ← «= 14.5»
```
🔴 **Питфолл имён:** у **типа 1** (виртуальный датчик) имя лежит в **поле 2**, а не в поле 1:
`#Z8700=1,'0','Температура Детская',…`. Наивный `fields[1]` даёт `'0'`.
Использовать хелпер **`_object_display_name(fields)`** — он знает про это исключение.
Проверено: `target_name` был `'0'`, после фикса — «Температура Детская».
### 8.15. Финальное состояние конвертеров (2026-09-17, вечер)
| Артефакт | Путь | Состояние |
|---|---|---|
| Сырой конфиг | `zont_config/config_local_2026-09-17_16-13-28.txt` | 34 963 Б, снят с `http://192.168.0.50/config.txt` |
| YAML | `zont_config/config_local_2026-09-17_16-13-28.yml` | в проекте, round-trip ✅ |
Round-trip чистый на **6/6** конфигах (боевой, 3 архива, `14-16-35`, `16-13-28`).
Осталось два `raw`: `8195` (SMS, тело — YAML-якорь `*id002`) и `9500` (type 5, `params` содержит якорь).