From 14d3622cbce4668170d721d70573cb9e5877428f Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 17 Sep 2026 13:46:05 +0600 Subject: [PATCH] [2026-09-17] eagle: family/how-to/zont-config-compiler.md family/tech/zont-api.md --- family/how-to/zont-config-compiler.md | 98 ++++-------------- family/tech/zont-api.md | 140 +++++++++++++++++++++++++- 2 files changed, 156 insertions(+), 82 deletions(-) diff --git a/family/how-to/zont-config-compiler.md b/family/how-to/zont-config-compiler.md index 8537d2ee..2ab6f654 100644 --- a/family/how-to/zont-config-compiler.md +++ b/family/how-to/zont-config-compiler.md @@ -8,6 +8,7 @@ aliases: created: '2026-09-17' namespace: family related: + - '[[family/tech/zont-api]]' - '[[family/tech/zont-config-object-types]]' - '[[family/tech/zont-scenario-logic-11109]]' - '[[family/how-to/home-automation]]' @@ -20,7 +21,7 @@ tags: - homeautomation title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml type: how-to -updated: '2026-09-17g' +updated: 2026-09-17h --- # ⚙️ ZONT Config Compiler — конвертеры `.txt ⇄ .yml` @@ -501,99 +502,38 @@ scenarios: --- -## 5g. 🔴 Локальный эндпоинт контроллера: `http://192.168.0.50/config.txt` +## 5g. 🔴 Локальный эндпоинт контроллера -**Факт (Alex, 2026-09-17):** контроллер отдаёт **весь конфиг** по HTTP **без авторизации**. - -``` -http://192.168.0.50/config.txt -``` - -| | | -|---|---| -| **Что отдаёт** | весь конфиг — тот же формат `#Z…` / `#S…`, что и файл из облака | -| **Авторизация** | **не требуется** | -| **Адрес** | `192.168.0.50` — локальный IP контроллера | - -**Что это меняет:** снятие конфига с контроллера перестаёт быть ручной операцией через облако/UI — -его можно тянуть напрямую curl'ом из локальной сети. +Контроллер отдаёт **весь конфиг** по HTTP **без авторизации**: ```bash -# снять конфиг напрямую с контроллера curl -s http://192.168.0.50/config.txt -o zont_config/config_$(date +%Y-%m-%d_%H-%M-%S).txt ``` -> ⚠️ **Не проверено:** кодировка ответа (ожидается windows-1251, как в облачных выгрузках) и коды -> ответа при недоступности. Проверить `file`/`iconv` перед тем, как полагаться на байтовую идентичность. -> -> ⚠️ **Запись через этот эндпоинт не подтверждена.** Известно только чтение. Загрузка конфига в -> контроллер — по-прежнему руками (см. §5b питфолл 8). Не предполагать наличие POST. +Формат — тот же `#Z…` / `#S…`, что парсит `config-to-yml.py`. Снятие конфига больше не ручная +операция через облако. + +**Полный разбор локального интерфейса** — WebSocket-протокол, чтение/запись `#S`-настроек, +кнопка сохранения `#S15=1`, 25 настроек против 9 в UI, утечка секретов, инструменты разведки: + +➡️ **[[family/tech/zont-api]] §6bis** --- -## 5h. 🌐 API ZONT — что доступно (исследовано 2026-09-17) +## 5h. 🌐 Облачный API ZONT — конфига не даёт -Доки скачаны в проект: `zont_api_docs/` (`zont_api_docs.html` 250 KB, `zont_api_docs.txt`, -`convert.py` — воспроизводимая HTML→text сборка). +Исследовано 2026-09-17. Доки скачаны в проект: `zont_api_docs/`. -**Источник:** https://zont-online.ru/api/docs/ - -### 🔴 Главный вывод: конфиг через API недоступен - -Публичное API — это **состояния и история**, не конфигурация. - -- Слово `scenario` в доке — **0 вхождений**. `relay` — 1. -- Ни одного метода для типов `11 / 14 / 46 / 49` (сценарии, реле, шаги, условия). -- `z3k_config` (где живут Z-объекты) упоминается **только как ссылка на ID** в `load_data`. - Метода для работы с ним **нет**. +**Главный вывод:** облачный API (`my.zont.online/api/*`, 11 методов) — это **состояния и история**, +не конфигурация. Слово `scenario` в доке — **0 раз**. Методов для типов `11/14/46/49` нет. +`z3k_config` упоминается только как источник ID. **Следствие:** конвертер `.txt ⇄ .yml` — **единственный** путь правки сценариев и реле. -Переписать управление на API нельзя, переписывать нечего. -### Все методы API (11 шт.) +**Что API всё же умеет (для H-2000 PRO):** чтение состояний (`devices?load_io=true`), +история (`load_data`), режимы отопления (`update_device`), сирена/охрана (`set_io_port`). -| Метод | Что делает | Конфиг? | -|---|---|---| -| `devices` | читает устройства + настройки (`load_io: true` → ещё и состояния) | чтение | -| `update_device` | **меняет настройки** — термостат, режимы отопления, расписание, доверенные номера, баланс SIM, OpenTherm, `custom_controls` | ⚠️ узко | -| `set_io_port` | управления состоянием: `guard-state`, `siren`, `engine-block`, `webasto` | — | -| `send_custom_command` | послать пользовательскую команду по `command_id` (ZTC/Mega SX) | — | -| `load_data` | **история** за период: `temperature`, `events`, `z3k_*` (Delta-time Array) | — | -| `raw_events` | история событий | — | -| `temperature` / `thermostat_work` | показания датчиков / работа термостата | — | -| `custom_controls` | история пользовательских статусов | — | -| `ztc_state` | питание, GSM, Wi-Fi | — | -| `generate_archive` / `download_generated_archive` | выгрузка архива | — | - -**Наш H-2000 PRO** из `update_device` получает только **отопление**: `thermostat_mode`, -`thermostat_mode_temps`, `thermostat_ext_mode`, `thermostat_ext_modes_config`, `tempschedule`, -`thermometers`, `ot_*` (OpenTherm). - -### Аутентификация - -1. `get_authtoken` (POST, с login/password) → `token` -2. Дальше — заголовок `X-ZONT-Token: ` (или Basic) -3. Обязательный заголовок `X-ZONT-Client: ` -4. На **403** — токен отозван, получать заново - -Базовый URL: `https://my.zont.online/api/<метод>` - -**Легковесный вариант:** https://my.zont.online/api/widget/v3 - -### Что это значит практически - -| Задача | Как решать | -|---|---| -| Править сценарии, реле, датчики | **только конвертер** (типы 11/14/46/49) | -| Снять конфиг | `http://192.168.0.50/config.txt` без авторизации (§5g) | -| Залить конфиг | руками (UI/облако) — API записи конфига нет | -| Смотреть состояния реле/датчиков онлайн | `devices?load_io=true` — **можно** | -| История температур/событий | `load_data` — **можно** | -| Менять режимы отопления | `update_device` — **можно** | - -**Рекомендация:** конвертер не выкидывать — он единственный путь к сценариям. API-обвязка -(мониторинг состояний + история + режимы отопления) — **отдельная задача**, которая -**дополняет** конвертер, а не заменяет его. +➡️ **Полный разбор API — [[family/tech/zont-api]]** --- diff --git a/family/tech/zont-api.md b/family/tech/zont-api.md index 3610a707..50522de8 100644 --- a/family/tech/zont-api.md +++ b/family/tech/zont-api.md @@ -3,7 +3,9 @@ aliases: - ZONT API - zont-online API - ZONT cloud API - - ZONT update_device + - ZONT local UI + - ZONT WebSocket + - ZONT firmware created: '2026-09-17' namespace: family related: @@ -19,7 +21,7 @@ tags: - reference title: "\U0001F310 ZONT Cloud API — что умеет и чего в нём нет" type: reference -updated: '2026-09-17' +updated: 2026-09-17b --- # 🌐 ZONT Cloud API — что умеет и чего в нём нет @@ -350,7 +352,139 @@ node zont-ws-probe.js ws://192.168.0.50/ws admin 1316261 --- -## 8. Связанные заметки +## 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":,"req_state":0} → {"s":…,"t":…,"id":…,"type":…,"stype":…,"name":…} +{"scmd":"#S217?"} → {"scmdres":"#S217:…"} чтение системной настройки +{"scmd":"#S217="} → запись системной настройки +{"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. Что это и где лежит + +| Параметр | Значение | +|---|---| +| Название | `H1000 Programmator` (Windows, Delphi/Borland) | +| Версия | **2.8.5** | +| exe | `prgm.2.8.5.exe` (2.9 MB) | +| Официальный источник | `https://lk.zont-online.ru/download/simple/h1000_utility_beta` (метка **beta**) | +| Интерфейс | USB (serial-over-USB) — драйвер `usbser.sys` + `Hxxxx.inf` | +| Архив | `~/rasputin-tmp/zont-util/h1000_utility_beta.bin` (4.5 MB) | +| Распаковано | `~/rasputin-tmp/zont-util/util_beta/H1000 Programmator/` | + +> 🔴 **Питфолл распаковки.** macOS `unzip` падает на кириллических именах файлов внутри архива (`write error (disk full?)` — на самом деле не disk full). Имена в CP866. Решение — Python `zipfile` с перекодировкой `cp437 → cp866`, скрипт: `~/rasputin-tmp/zont-util/extract.py`. + +### 10.2. Содержимое архива + +| Файл | Размер | Что это | +|---|---|---| +| `prgm.2.8.5.exe` | 2.9 MB | основная программа | +| `Configs/{403,406,412,414,415}.set` | 31 KB ×5 | **словари интерфейса** (UTF-8 JSON: `{"Value":0,"Edit":"Пользователь 1"}`), НЕ конфиги устройства | +| `Interface/interface.h` | 55 KB | дерево интерфейса + шаблоны `ComboSameList` по версиям HW | +| `Interface/*.rtf` | 32–70 KB | хелпы: `выходы`, `Отопление`, `пользователи`, `смс управление`, `DTMF управление` | +| `Interface/*.bmp` | 2–3 KB | иконки вкладок | +| `msvcr120.dll`, `rtl150.bpl`, `vcl150.bpl`, `vclimg150.bpl`, `xmlparser.bpl`, `mypngimg.bpl` | — | Runtime Delphi/C++Builder | + +> ⚠️ `.set` — **не** формат `config.txt`. Это словарь подписей для выпадающих списков утилиты. Не путать с [[family/tech/zont-config-object-types]]. + +### 10.3. Прошивка — формат подтверждён + +Строки в exe: `firmware_.enc`, `*.enc`, `.enc|*.enc`, `Program started`, `Program CLOSED`. + +Прошивка скачана и разобрана: + +| Файл | Размер | Энтропия | Что это | +|---|---|---|---| +| `STM_MEGA_400_.enc` | 145 177 B | **7.9986** бит/байт | зашифрованный образ прошивки (STM32, серия MEGA 400) | +| `main_c.evc` | 49 610 B | 5.6487 бит/байт | вторичный образ (частично структурированный, видны строки `Mega-CX`, `=0 25 0 0`) | + +Источник: `https://lk.zont-online.ru/download/firmwares/H2000_515__330_290.zip` (**200 OK, отдаётся без авторизации**). +Распаковано в `~/rasputin-tmp/zont-util/fw/`. + +> 🔴 `.enc` — энтропия 7.9986 = **шифрование, не простое сжатие**. Просто так не распакуется; расшифровка — задача отдельного исследования и, скорее всего, требует ключа из exe или подписи облака. + +### 10.4. Что это даёт для наших задач + +| Задача | Путь | +|---|---| +| Снять текущий конфиг | ✅ `curl http://192.168.0.50/config.txt` (без авторизации) | +| Правка сценариев | по-прежнему конвертер `.txt ⇄ .yml` + заливка через UI/утилиту | +| Мониторинг в реальном времени | ✅ WebSocket `ws://192.168.0.50/ws` (`req_ids`, `req_state`) | +| Обновление прошивки | облако ZONT или утилита по USB (Windows) | +| Автоматизация без UI | возможна — WS-протокол простой, читается `config.txt` | + +--- + +## 11. Связанные заметки - [[family/how-to/zont-config-compiler]] — конвертеры `.txt ⇄ .yml`; §5c — план переработки YAML - [[family/tech/zont-scenario-logic-11109]] — структура сценариев 11/46/49/45