Files
obsidian-vault/family/tech/zont-api.md
T

494 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
aliases:
- ZONT API
- zont-online API
- ZONT cloud API
- ZONT local UI
- ZONT WebSocket
- ZONT firmware
created: '2026-09-17'
namespace: family
related:
- '[[family/how-to/zont-config-compiler]]'
- '[[family/tech/zont-scenario-logic-11109]]'
- '[[family/tech/zont-config-object-types]]'
- '[[family/how-to/home-automation]]'
tags:
- family
- tech
- zont
- api
- reference
title: "\U0001F310 ZONT Cloud API — что умеет и чего в нём нет"
type: reference
updated: 2026-09-17b
---
# 🌐 ZONT Cloud API — что умеет и чего в нём нет
> **Исследовано 2026-09-17** по запросу Alex: «У зонта есть api и вероятно свой какой-то формат
> включая все датчики и автоматику. Изучай подробно вопрос… что нам для комфортного управления
> контроллером на самом деле надо. Доделывать конвертер или переделать все с 0.»
>
> **Итог одной строкой:** облачный API ZONT **не работает с конфигом** (сценарии, реле, шаги,
> условия). Конвертер `.txt ⇄ .yml` — по-прежнему **единственный** путь к правке сценариев.
> API годится только для **мониторинга** и узкого набора настроек (отопление).
>
> ⚠️ **Уточнено 2026-09-17 (см. §6bis):** это верно для *облачного* API. **Локальный**
> интерфейс контроллера конфиг отдаёт — причём `GET /config.txt` **вообще без авторизации**,
> в формате нашего парсера. Прошивка локально не обновляется.
---
## 1. Локальная копия доки (в проекте)
Доки скачаны в проект, не в `/tmp` (указание Alex: «качай доки в папку в проекте а не в темп»):
| Файл | Размер | Что это |
|---|---|---|
| `/Users/admin/Automation/HA-ZONT-Modbus/zont_api_docs/zont_api_docs.html` | 250 KB | полная дока как есть (одна страница) |
| `…/zont_api_docs.txt` | 99 KB / 3381 строка | читаемый текст, таблицы → ` \| ` |
| `…/convert.py` | — | воспроизводимая HTML→text конвертация |
```bash
cd /Users/admin/Automation/HA-ZONT-Modbus/zont_api_docs
curl -s -L 'https://zont-online.ru/api/docs/' -o zont_api_docs.html # обновить
python3 convert.py # → zont_api_docs.txt
```
> 📌 **Вся дока — ОДНА страница.** Отдельных URL вида `/api/docs/update_device` **нет** (404).
> Ссылки `#update_device` — это внутренние якоря. Не пытаться качать методы по отдельности.
---
## 2. Полный список методов API (всего 11)
| Метод | Назначение | Пишет конфиг? |
|---|---|---|
| `get_authtoken` | получить токен (Basic auth → `X-ZONT-Token`) | — |
| `devices` | список устройств + **Настройки**; `load_io: true` → ещё и **Состояния** | — |
| `update_device` | **изменение Настроек** устройства | ⚠️ узкий набор, см. §4 |
| `set_io_port` | управление Состоянием: `guard-state`, `siren`, `engine-block`, `webasto` | — |
| `send_custom_command` | послать пользовательскую команду по `command_id` | — |
| `load_data` | **история** данных за период (типы: `temperature`, `events`, `z3k_*`…) | — |
| `raw_events` | история событий (обёртка над `load_data`) | — |
| `temperature` / `thermostat_work` / `custom_controls` / `ztc_state` | история / состояние | — |
| `generate_archive` / `download_generated_archive` | выгрузка архива | — |
| `add_device` / `delete_device` | добавить / удалить устройство | — |
### Формат запроса
```
POST https://my.zont.online/api/<method>
Header: X-ZONT-Client: <email> (обязательный)
Auth: Basic <login:password> ИЛИ X-ZONT-Token: <token>
Body: JSON (предпочтительно) / form-encoded / GET-параметры
Ответ: JSON, всегда поле "ok": true|false; при ошибке "error" + "error_ui"
```
Рекомендованный поток аутентификации: `get_authtoken` (с логином/паролем) → дальше по токену,
пароль не хранить. При `403` токен мог быть отозван — перезапросить.
---
## 3. 🔴 Главный вывод: конфига в API НЕТ
**Проверено фактом по локальной копии доки:**
| Что искали | Найдено в доке |
|---|---|
| слово `scenario` | **0 раз** |
| слово `relay` | **1 раз** |
| `z3k_config` (конфиг контроллера) | **2 раза** — только как ссылка для ID |
| метод для чтения/записи `z3k_config` | **нет** |
Наши объекты конфига — сценарии (**11**), реле (**14**), шаги (**46**), условия (**49**),
задержки (**45**) — в API **не представлены вообще**. Ни чтения, ни записи.
`z3k_config` упоминается лишь как источник числовых ID: в `z3k_temperature` «ключом является
ID объекта из `z3k_config`», в `z3k_boiler_adapter` — «ID адаптера из `z3k_config` (например 4097, 4098)».
То есть API **ссылается** на конфиг, но **работать с ним не даёт**.
> ⚠️ Это не «ещё не нашли метод» — это перебор **всех** 11 методов из оглавления доки.
> `send_custom_command` — не то: он шлёт заранее заданную в настроечной утилите команду по `command_id`.
---
## 4. Что `update_device` реально умеет
Единственный метод, который меняет Настройки. Доступные области (по разделам доки):
| Раздел | Ключи настроек |
|---|---|
| Общие | `name`, `serial`, `timezone` |
| Беспроводная сеть | `balance` (`ussd`/`warning`/`limit`), `trusted_phones`, `gsm_roaming` |
| Управление отоплением (ZONT H) | `thermostat_mode`, `thermostat_mode_temps`, `thermostat_ext_mode`, `thermostat_ext_modes_config`, `tempschedule`, `thermometers`, `ot_*` (OpenTherm) |
| Пользовательские команды (ZTC-7xx, Mega SX) | `custom_controls`**не наш случай** (H-2000 PRO) |
| Авто (ZTC) | `auto-ignition`, двери/капот/багажник |
> 🔴 **Для H-2000 PRO через API доступно практически только отопление** — режимы, целевые
> температуры, расписание, параметры OpenTherm. Сценариев/реле там нет.
**Семантика:** для составного параметра можно передать **часть** внутренних полей — остальные
сохранят прежние значения. Ответ содержит **только изменённые** параметры и их новые значения.
```json
// запрос
{"device_id": 1580, "thermostat_mode_temps": {"comfort": 21}}
// ответ — изменилось только comfort, остальные вернулись как есть
{"ok": true, "thermostat_mode_temps": {"comfort": 21, "econom": 16, "idle": 5, "full_off": false}}
```
---
## 5. `load_data` — история (только чтение)
```json
POST https://my.zont.online/api/load_data
{"requests": [
{"device_id": 1580, "data_types": ["temperature", "events"],
"mintime": 1495011600, "maxtime": 1495022400}
]}
```
Ответ: `responses[]` в том же порядке, что `requests`, каждый с полями по имени типа данных.
Времена — **unix time** (секунды, UTC). Вложенные параметры → **только** `Content-Type: application/json`.
**Формат значений — Delta-time Array (DTA):** массив пар `[delta_секунд, значение]`, где первая
метка абсолютная, последующие — **отрицательные смещения** назад во времени.
**Типы данных (`data_types`), релевантные нашему контуру:**
| Тип | Для чего | Модели |
|---|---|---|
| `temperature` | показания температурных датчиков | — |
| `events` | события | — |
| `z3k_temperature` | история датчиков, **ключ = ID объекта из `z3k_config`** | H-2000+, H-2000 PRO, Climatic, H1V.02, SMART NEW |
| `z3k_radio_sensor` | радиодатчики | по аналогии |
| `z3k_heating_circuit` | контуры отопления | по аналогии |
| `z3k_web_element` | пользовательские кнопки | по аналогии |
| `z3k_boiler_adapter` | котёл по OpenTherm / EMS / BSB — **шаг до 1 мин** | H-2000+ / PRO / PRO.V2 |
| `custom_controls` | пользовательские статусы (битовая маска) | Mega SX, H-1000, ZTC |
| `ztc_state` | питание, GSM, Wi-Fi | — |
> `z3k_boiler_adapter` даёт те же ряды, что графики в личном кабинете: `s` (флаги состояния
> `ch`/`dhw`/`fl`/`cl`/`ch2`/`di`/`f`), `cs`/`cs2` (расчётная t теплоносителя), `bt` (фактическая),
> `rwt` (обратка), `dt` (ГВС), `ot` (улица), `rml` (модуляция горелки), `wp` (давление),
> `ff` (авария `{c, f}`), `rp`/`rt`/`rors`/`db`/`b` (уставки) и др.
**`custom_controls` — битовая маска:** значение — целое, каждый бит = состояние статуса с этим id.
```
[[1498710120, 0], [-86, 6], [-5, 2]]
→ все статусы выкл → через 86 с включились статусы 1 и 2 (6 = 110₂) → ещё через 5 с статус 2 выключился
```
---
## 6. Ответ на вопрос «доделывать или переделать с 0»
**Переделать с 0 — не на что.** API не предоставляет доступа к сценариям/реле, поэтому
«переписать управление на API» технически невозможно. Переписать можно было бы только
**мониторинг**, и это дополнение, а не замена.
| Путь | Что даёт | Ограничение |
|---|---|---|
| **1. Конвертер `.txt ⇄ .yml`** (текущий) | правка сценариев, реле, датчиков, Modbus | загрузка в контроллер **руками** |
| **2. API-обвязка (дополнение)** | онлайн-состояния (`devices?load_io=true`), история (`load_data`), отопление (`update_device`), сирена/охрана (`set_io_port`) | сценарии **недоступны** |
| **3. Локальный интерфейс (§6bis)** | 🔴 `GET /config.txt`**весь конфиг без авторизации**, в формате парсера | только чтение; запись — WS `#S<n>=` + `#S15=1` |
| **4. «Переделать с 0»** | ❌ не существует API, на который переписать | |
### Рекомендация (доложена Alex, решения пока нет)
- **Конвертер не выкидывать** — он единственный путь к сценариям. Доделывать §5c
(`blocks/if/then`, см. [[family/how-to/zont-config-compiler]]) имеет смысл.
- **API-обвязка — отдельная задача на потом:** мониторинг реле/датчиков, графики из
`load_data`, правка режимов отопления. **Дополняет** конвертер, не заменяет.
- **Открытый вопрос Alex'у:** нужен ли онлайн-мониторинг ZONT в HA. От ответа зависит,
браться ли за API-часть вообще.
---
## 6bis. 🟢 ЛОКАЛЬНЫЙ интерфейс контроллера — вот где реально есть конфиг
> **Исследовано 2026-09-17** (вторая половина того же дня, после починки транзита
> Rasputin → `192.168.0.0/24`, см. [[family/how-to/rasputin-router]]).
>
> **Итог одной строкой:** облачный API конфига не даёт (§3), но **локальный HTTP/WS интерфейс
> самого контроллера отдаёт ВЕСЬ конфиг**, причём `config.txt` — **вообще без авторизации**.
Это меняет вывод §6: путь «снять конфиг с прибора» больше не требует настроечной утилиты
и ручного экспорта — достаточно `curl`.
### Адрес и доступ
| Параметр | Значение |
|---|---|
| Хост | `192.168.0.50` (GPON-сегмент, за `192.168.0.1`) |
| Модель | `H2000_PRO`, прошивка `723 678` (`#S7`) |
| Версия веб-интерфейса | `25.11.1` (видна в `.version` при заходе в «Сервис») |
| Логин | `admin` |
| Пароль | `1316261` (сервисный) |
| WebSocket | `ws://192.168.0.50/ws` |
> 🔴 **Пароль локального UI — НЕ пароль от аккаунта `my.zont.online`.** Официальная дока
> (support.microline.ru → «Локальное управление приборами ZONT»):
> логин = «Имя пользователя» из `Настройки → Пользователи`; пароль = «**Пароль для управления
> с другого телефонного номера**». Для универсальных контроллеров в заводской конфигурации
> пользователя **нет вообще** — тогда авторизация не требуется.
### 🔴 `GET /config.txt` — весь конфиг без авторизации
```bash
curl -s http://192.168.0.50/config.txt -o zont-config-live.txt # 623 строки
```
Отдаёт **ровно тот формат `#S`/`#Z`**, который парсит `config-to-yml.py`
(см. [[family/how-to/zont-config-compiler]]). Ни логина, ни токена не нужно.
Остальные испытанные HTTP-пути → **404**: `/api`, `/config`, `/config.json`, `/backup`,
`/download`, `/firmware`, `/update`, `/upgrade`, `/fw.bin`, `/ota`, `/flash`, `/log`,
`/status`, `/users`, `/export`, `/import`, `/sdcard`, `/cgi-bin/*`, `/z3k_config`.
### Протокол WebSocket
Вход (виден в JS страницы, воспроизведён вручную):
```json
{"user":"admin","pass":"1316261"}
{"auth":200} // 401 при неверной паре
```
Дальше три вида команд:
| Команда | Что делает | Пример ответа |
|---|---|---|
| `{"req_ids":N}` | список id объектов класса N | `{"ids":[8560,8669,9877,…]}` |
| `{"scmd":"#S<n>?"}` | **чтение** любой системной настройки | `{"scmdres":"#S217:mqtt://…"}` |
| `{"scmd":"#S<n>=<val>"}` | **запись** настройки | `{"cmdres":0}` (0 = ок) |
| `{"scmd":"#S15=1"}` | 🔴 **СОХРАНИТЬ** изменения | — |
| `{"id":N,"cmd":M}` | команда объекту (реле, режим) | — |
| `{"id":N,"req_state":0}` | запросить состояние объекта | — |
Классы для `req_ids` (из JS): `16` отопит. контуры, `20` режимы отопления, `1` виртуальные
датчики, `27` датчики температуры, `0` дискретные датчики, `8` радиодатчики, `10` GUI-элементы,
`6` адаптеры.
> 🔴 **Неявная кнопка «сохранить» — `#S15=1`.** UI шлёт её после смены Wi-Fi-настроек
> (`#S208='ssid','pass'` + `#S15=1` + через 3 с `#S208?` для проверки). Без неё запись
> не применяется. В веб-морде этой кнопки нет.
### 25 настроек `#S` в живом конфиге — UI показывает только 9
Веб-интерфейс показывает `#S7`, `#S200`, `#S202`, `#S204`, `#S208`, `#S54`, `#S198`, `#S205`,
`SDATE`. В конфиге их **25**. Неявные:
| Ключ | Значение (живое, 2026-09-17) | Что это |
|---|---|---|
| `#S217` | `mqtt://zont:mqtt1z3$@192.168.0.10:1883` | MQTT-брокер **с паролем в открытом виде** |
| `#S218` | `'zont','qwertyui'` | MQTT логин/пароль |
| `#S219` | `'zont'` | MQTT клиент-id |
| `#S221` | `homeassistant` | префикс discovery |
| `#S124` | `1,9600,0,0` | параметры Modbus-шины (slave, baud, …) |
| `#S201` | `52200` | порт облачного сервера |
| `#S203` | `auto` | режим выбора канала связи |
| `#S12` | `*100# 0` | USSD-запрос баланса |
| `#S210` | `2147483647,2147483647,2147483647,2147483647` | лимиты |
| `#S207` | `+780****7291 0` | доверенный номер |
| `#S36`, `#S206`, `#S209`, `#S211`, `#S212`, `#S214`, `#S222`, `#S223`, `#S225`, `#S226` | — | нигде не задокументированы |
### Прошивка — локально её НЕТ
- Все HTTP-пути к прошивке → **404** (список выше).
- Кнопка «Обновить интерфейс» в разделе «Сервис» — это **перезагрузка веб-страницы**, не прошивка.
- Прошивка обновляется **только через облако ZONT** либо **настроечной утилитой с ПК**.
Локальный веб-UI загрузку `.bin` не умеет.
- Версии: модель/прошивка читаются из `#S7` (`H2000_PRO 723 678`), серийник — из `#S54`
(`0FA7C33CC89F`).
### 🔴 Утечка секретов
В `config.txt` **без авторизации** лежат: пароль облака ZONT (`#S202` — серийник +
`ktqs42047wd58t0i`), пароль MQTT (`#S217`/`#S218`), и **сервисный пароль локального UI**
(`#Z8192=4,'admin','+792****5401,…','1316261',0`). Любой, кто дотянется до `192.168.0.50`,
получает их без входа.
> Практический смысл: доступ к GPON-сегменту = доступ ко всем учёткам контроллера.
> Транзит из `192.168.6.0/24` был сломан ([[family/how-to/rasputin-router]]) — это,
> по иронии, единственное, что закрывало эти данные от домашней LAN.
### Инструменты разведки (на Mac, проект не трогают)
| Файл | Назначение |
|---|---|
| `~/rasputin-tmp/zont-auth-probe.js` | проверка пары логин/пароль (`node zont-auth-probe.js <host> <user> <pass>`) |
| `~/rasputin-tmp/zont-recon.js` | перебор HTTP-путей |
| `~/rasputin-tmp/zont-recon2.js` | перебор путей прошивки/конфига (печатает только не-404) |
| `~/rasputin-tmp/zont-ws-probe.js` | WS: auth + `req_ids` + чтение `#S` |
| `~/rasputin-tmp/zont-config-live.txt` | живой дамп `config.txt` (623 строки) |
```bash
cd ~/rasputin-tmp
node zont-auth-probe.js 192.168.0.50 admin 1316261 # → AUTH OK (200)
node zont-ws-probe.js ws://192.168.0.50/ws admin 1316261
```
---
## 7. Питфоллы
| # | Питфолл | Как обойти |
|---|---|---|
| 1 | 🔴 Вся дока — **одна страница**; `/api/docs/<method>`**404** | Качать только `https://zont-online.ru/api/docs/` целиком |
| 2 | 🔴 `send_custom_command` **всегда возвращает `ok: true`**, даже если связи нет или отправка не удалась | Не считать `ok` подтверждением доставки |
| 3 | `load_data` принимает вложенные параметры → **только JSON**, не form-encoded | `Content-Type: application/json` обязателен |
| 4 | `mintime`/`maxtime`**unix time в секундах, UTC** | Не путать с миллисекундами |
| 5 | `custom_controls`**битовая маска**, не массив состояний | Разбирать побитово; биты считаются с нуля от младшего |
| 6 | DTA — вторая и последующие метки **отрицательные** (смещения назад) | Не читать их как абсолютное время |
| 7 | `update_device` при `403` — токен мог быть отозван | Перезапросить `get_authtoken` |
| 8 | Дока **обновляется**, часть функций может отсутствовать | При нехватке метода — писать на `admin@zont.online` |
| 9 | 🔴 Пароль локального UI — **не** пароль от `my.zont.online` | Это «Пароль для управления с другого телефонного номера» из `Настройки → Пользователи` (§6bis) |
| 10 | 🔴 Запись через WS **не применяется** без `{"scmd":"#S15=1"}` | Всегда досылать команду сохранения после записи `#S<n>=…` |
| 11 | 🔴 `GET /config.txt` отдаёт секреты **без авторизации** | Не считать GPON-сегмент доверенной сетью; см. §6bis |
---
## 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. Что это и где лежит
| Параметр | Значение |
|---|---|
| Название | `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` | 3270 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
- [[family/tech/zont-config-object-types]] — таблица типов объектов конфига
- [[family/how-to/home-automation]] — контур автоматизации, ZONT, Modbus (§6)
- [[family/how-to/rasputin-router]] — транзит в GPON-сегмент `192.168.0.0/24` (нужен для доступа к `192.168.0.50`)