494 lines
32 KiB
Markdown
494 lines
32 KiB
Markdown
---
|
||
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` | 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
|
||
- [[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`)
|