[2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-scenario-logic-11109.md
This commit is contained in:
@@ -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` содержит якорь).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user