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

This commit is contained in:
Alexey Martemyanov
2026-09-17 13:51:11 +06:00
parent 14d3622cbc
commit 3768e8c1d4
2 changed files with 69 additions and 77 deletions
+58 -1
View File
@@ -310,7 +310,7 @@ diff A.txt B.txt # пусто = round-trip чистый
| 5 | Неизвестный тип объекта → exit 2, файл не создаётся | Смотреть stderr — там причина |
| 6 | `validate_config()` → exit 4 | Печатает `❌ VALIDATION ERRORS` + список причин; файл намеренно **не выдан** (вывод пустой) |
| 7 | Регистр без своего устройства / аналоговый выход с битой ссылкой | WARNING в stderr, конвертация продолжается — проверить ссылки вручную |
| 8 | Загрузка конфига в контроллер — **руками**, скрипты только конвертируют | Конвертер не имеет доступа к ZONT. ⚠️ **Снятие конфига — уже не ручное:** `http://192.168.0.50/config.txt` отдаёт весь конфиг без авторизации (§5g) |
| 8 | Загрузка конфига в контроллер — **руками**, скрипты только конвертируют | Конвертер не имеет доступа к ZONT. ⚠️ **Снятие конфига — уже не ручное:** `http://192.168.0.50/config.txt` отдаёт весь конфиг без авторизации (§5g). Заливка — утилита по USB / облако / WS **только для `#S`** (§5g-2) |
| 9 | `INFRASTRUCTURE.md`, `docker-compose.yml`, `docker run.txt` в проекте — **исторический TrueNAS-стек** | Актуальный контур — [[family/how-to/home-automation]]. Не искать `modbus-bridge`/`mbusd` на NAS |
| 10 | Дополнительных зависимостей нет | Только `pyyaml``jsonschema`/`ruamel` не нужны |
| 11 | ✅ **ИСПРАВЛЕНО 2026-09-17** — Сценарий с >1 шагом падал (exit 2) | `config-to-yml.py` теперь цикл по всем шагам; `yml-to-config.py` пишет все `step_ids` |
@@ -520,6 +520,61 @@ curl -s http://192.168.0.50/config.txt -o zont_config/config_$(date +%Y-%m-%d_%H
---
## 5g-2. 🔼 ЗАЛИВКА конфига обратно — чем и как (добыто 2026-09-17)
Снятие конфига автоматизировано (§5g), но **заливка остаётся ручной** — идёт **не** через
`config.txt` (этот путь только на чтение). Доступные каналы:
| Канал | Что умеет | Ограничение |
|---|---|---|
| **Настроечная утилита по USB** | заливка конфига + **прошивки** | Windows-only, нужен USB-кабель и драйвер |
| Облако ZONT (`my.zont.online`) | правка сценариев/реле через веб-UI | руками, по одному объекту |
| Локальный WebSocket `ws://192.168.0.50/ws` | запись `#S`-настроек (`{"scmd":"#S<n>=<val>"}` + `#S15=1`) | **`#Z`-объекты не пишутся** — только `#S` |
> 🔴 Локальный WS даёт запись **только системных `#S`-настроек** (Wi-Fi, MQTT, номер). Сценарии,
> реле, шаги (`#Z11/14/46/49`) через него **не заливаются** — для них по-прежнему утилита или облако.
### Утилита `H1000 Programmator` 2.8.5 — добыта
```bash
# официальный источник, скачивается без авторизации
curl -sL -o h1000_utility_beta.bin https://lk.zont-online.ru/download/simple/h1000_utility_beta
```
| Параметр | Значение |
|---|---|
| Версия | **2.8.5** (`prgm.2.8.5.exe`, 2.9 MB, Delphi/Borland) |
| Интерфейс | USB serial-over-USB (`usbser.sys` + `Hxxxx.inf`) |
| Архив на Mac | `~/rasputin-tmp/zont-util/h1000_utility_beta.bin` (4.5 MB) |
| Распаковано | `~/rasputin-tmp/zont-util/util_beta/H1000 Programmator/` |
| Хелпы внутри | `выходы.rtf`, `Отопление.rtf`, `пользователи.rtf`, `смс управление.rtf`, `DTMF управление.rtf` |
> 🔴 **Питфолл распаковки.** macOS `unzip` падает на кириллических именах в архиве
> (`write error (disk full?)` — на самом деле **не** disk full). Имена в CP866.
> Решение — Python `zipfile` с перекодировкой `cp437 → cp866`: `~/rasputin-tmp/zont-util/extract.py`.
> ⚠️ Пятно на репутации формата: файлы `Configs/*.set` внутри архива — **НЕ конфиги устройства**.
> Это UTF-8 JSON-словари подписей интерфейса (`{"Value":0,"Edit":"Пользователь 1"}`).
> Не пытаться парсить их нашим конвертером.
### Прошивка — формат `.enc` (зашифрован)
```bash
curl -sL -o H2000_fw.zip https://lk.zont-online.ru/download/firmwares/H2000_515__330_290.zip
```
| Файл | Размер | Энтропия | Вывод |
|---|---|---|---|
| `STM_MEGA_400_.enc` | 145 177 B | **7.9986** / 8.0 | зашифрован, не сжат |
| `main_c.evc` | 49 610 B | 5.6487 | частично структурный (`Mega-CX`) |
Прошивка тоже отдаётся **без авторизации**. Утилита грузит именно `*.enc`
(строки `firmware_.enc`, `.enc|*.enc` найдены в exe). Расшифровка — отдельное исследование.
➡️ Полный разбор утилиты и прошивки — **[[family/tech/zont-api]] §10**
---
## 5h. 🌐 Облачный API ZONT — конфига не даёт
Исследовано 2026-09-17. Доки скачаны в проект: `zont_api_docs/`.
@@ -550,6 +605,8 @@ curl -s http://192.168.0.50/config.txt -o zont_config/config_$(date +%Y-%m-%d_%H
| `zont_config/archive/` | **не в git** (`untracked`) — лежит в `.gitignore`-нейтральном состоянии |
| `zont_config/H2000_PRO_config_actual-{2,3,4}.txt` / `.yml` | ✅ **перемещены в `archive/` и закоммичены** (`7ae0e32`) |
| `zont_api_docs/` | ✅ **новая папка** — локальная копия доки облачного API ZONT (`zont_api_docs.html` 250 KB, `zont_api_docs.txt` 99 KB, `convert.py`). **не в git**. Исследование — [[family/tech/zont-api]] |
| `~/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** |
Не запушено: `origin/main..HEAD` = 3 коммита (`199f2b1`, `7ae0e32`, `12ba22b`).
+11 -76
View File
@@ -224,17 +224,24 @@ POST https://my.zont.online/api/load_data
| Параметр | Значение |
|---|---|
| Хост | `192.168.0.50` (GPON-сегмент, за `192.168.0.1`) |
| URL | `http://192.168.0.50` (или `zont.local` в домашней сети) |
| Модель | `H2000_PRO`, прошивка `723 678` (`#S7`) |
| Версия веб-интерфейса | `25.11.1` (видна в `.version` при заходе в «Сервис») |
| Логин | `admin` |
| Пароль | `1316261` (сервисный) |
| WebSocket | `ws://192.168.0.50/ws` |
| WebSocket | `ws://192.168.0.50/ws` — страница это только UI, вся логика в WS |
> 🔴 **Пароль локального UI — НЕ пароль от аккаунта `my.zont.online`.** Официальная дока
> (support.microline.ru → «Локальное управление приборами ZONT»):
> логин = «Имя пользователя» из `Настройки → Пользователи`; пароль = «**Пароль для управления
> с другого телефонного номера**». Для универсальных контроллеров в заводской конфигурации
> пользователя **нет вообще** — тогда авторизация не требуется.
>
> 💡 Тот же пароль лежит в конфиге: объект `#Z8192=4,'admin','+792****5401,…','1316261',0`.
>
> 🔴 **Симптом неверного пароля — бесконечный повтор запроса login/password.** Это не баг
> страницы: UI берёт пару из `localStorage` браузера, получает `{"auth":401}` и спрашивает
> снова. Лечение: `localStorage.clear(); location.reload()` в консоли, затем верная пара.
### 🔴 `GET /config.txt` — весь конфиг без авторизации
@@ -273,6 +280,9 @@ curl -s http://192.168.0.50/config.txt -o zont-config-live.txt # 623 стро
датчики, `27` датчики температуры, `0` дискретные датчики, `8` радиодатчики, `10` GUI-элементы,
`6` адаптеры.
`#S`-команды, которые использует сам UI: `#S7?`, `#S54?`, `#S213?`, `#S224?`, `#S4?`, `#S208?`,
`#S198?`, `#S205?`; плюс `{"scmd":"SDATE?"}``{"scmdres":"SDATE=17 9 26 7 39 10"}` (время прибора).
> 🔴 **Неявная кнопка «сохранить» — `#S15=1`.** UI шлёт её после смены Wi-Fi-настроек
> (`#S208='ssid','pass'` + `#S15=1` + через 3 с `#S208?` для проверки). Без неё запись
> не применяется. В веб-морде этой кнопки нет.
@@ -352,81 +362,6 @@ node zont-ws-probe.js ws://192.168.0.50/ws admin 1316261
---
## 9. 🔧 Локальный интерфейс: WebSocket-протокол и утечка конфига
**Исследовано 2026-09-17** на живом контроллере `192.168.0.50` (H2000+ PRO, `#S7 = H2000_PRO 723 678`).
### 9.1. Вход в локальный UI
| Поле | Значение |
|---|---|
| URL | `http://192.168.0.50` (или `zont.local` в домашней сети) |
| Логин | `admin` |
| Пароль | сервисный, лежит в конфиге: объект `#Z8192=4,'admin',…,'1316261',0` |
| Транспорт | WebSocket `ws://192.168.0.50/ws` (страница — только UI, вся логика в WS) |
> 🔴 **Логин/пароль локального UI ≠ аккаунт `my.zont.online`.** Это «Имя пользователя» и «Пароль для управления с другого телефонного номера» из `Настройки → Пользователи` контроллера ([дока](https://support.microline.ru/index.php/Локальное_управление_приборами_ZONT)).
> Симптом неверного пароля — **бесконечный повтор запроса login/password**. Это не баг страницы: UI берёт пару из `localStorage` браузера, получает `{"auth":401}` и спрашивает снова.
### 9.2. Протокол WebSocket
```text
{"user":"admin","pass":"1316261"} → {"auth":200} | {"auth":401}
{"req_ids":16} → {"ids":[…] } список id объектов класса
{"id":<n>,"req_state":0} → {"s":…,"t":…,"id":…,"type":…,"stype":…,"name":…}
{"scmd":"#S217?"} → {"scmdres":"#S217:…"} чтение системной настройки
{"scmd":"#S217=<val>"} → запись системной настройки
{"scmd":"#S15=1"} → 💾 СОХРАНИТЬ настройки на прибор
{"scmd":"SDATE?"} → {"scmdres":"SDATE=17 9 26 7 39 10"}
```
Классы объектов для `req_ids` (из JS страницы): `16, 20, 1, 27, 0, 8, 10, 6`.
`#S`-команды, которые использует сам UI: `#S7?`, `#S54?`, `#S213?`, `#S224?`, `#S4?`, `#S208?`, `#S198?`, `#S205?`, `SDATE?`.
> 💡 `#S15=1` — неявная кнопка «применить». В UI она вызывается только после смены Wi-Fi (`#S208='ssid','pass'`), вручную не нажать. Без неё запись не сохранится на прибор.
### 9.3. 🔴 `http://192.168.0.50/config.txt` — весь конфиг БЕЗ авторизации
```bash
curl -s http://192.168.0.50/config.txt # 623 строки, text/plain
```
Формат — **ровно тот, который парсит `config-to-yml.py`** (см. [[family/how-to/zont-config-compiler]]). Одна команда снимает полный конфиг контроллера, включая:
| Ключ | Что утекает |
|---|---|
| `#S202` | серийник + **пароль облака ZONT** |
| `#S217` | MQTT-брокер **с паролем** (`mqtt://zont:…@192.168.0.10:1883`) |
| `#S218` | MQTT логин/пароль |
| `#Z8192` | **сервисный пароль локального UI** в открытом виде |
> ⚠️ Любой, кто дотянется до порта 80 на `192.168.0.50`, получает все секреты без входа. Учитывать при любом пробросе/VPK-доступе к этому сегменту.
### 9.4. Полный список `#S`-настроек (25 шт., из живого конфига)
UI показывает ~9. Скрыты от пользователя: `#S36`, `#S206`, `#S209`, `#S210`, `#S211`, `#S212`, `#S214`, `#S219`, `#S222`, `#S223`, `#S225`, `#S226`, `#S124`, `#S201`, `#S203`.
Значения важных:
```text
#S124=1,9600,0,0 параметры Modbus-шины (slave, baud, …)
#S201=52200 порт облака
#S203=auto режим связи
#S12=*100# 0 USSD-код проверки баланса
#S210=2147483647,2147483647,2147483647,2147483647 лимиты
#S221=homeassistant префикс discovery
```
### 9.5. Прошивка: локально через web — НЕВОЗМОЖНО
| Проверено | Результат |
|---|---|
| `/firmware`, `/update`, `/upgrade`, `/fw.bin`, `/ota`, `/flash`, `/fw` | **404** (все HTTP-пути кроме `/` и `/config.txt`) |
| Кнопка «Обновить интерфейс» в UI | перезагрузка веб-страницы, **не** прошивка |
| Реальный путь | облако ZONT (веб-сервис) **или** настроечная утилита по USB |
---
## 10. 🔧 Настроечная утилита H1000/H2000 (добыта 2026-09-17)
### 10.1. Что это и где лежит