[2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-api.md
This commit is contained in:
@@ -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
@@ -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. Что это и где лежит
|
||||
|
||||
Reference in New Issue
Block a user