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

32 KiB
Raw Blame History

aliases, created, namespace, related, tags, title, type, updated
aliases created namespace related tags title type updated
ZONT API
zont-online API
ZONT cloud API
ZONT local UI
ZONT WebSocket
ZONT firmware
2026-09-17 family
family/how-to/zont-config-compiler
family/tech/zont-scenario-logic-11109
family/tech/zont-config-object-types
family/how-to/home-automation
family
tech
zont
api
reference
🌐 ZONT Cloud API — что умеет и чего в нём нет reference 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 конвертация
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. Сценариев/реле там нет.

Семантика: для составного параметра можно передать часть внутренних полей — остальные сохранят прежние значения. Ответ содержит только изменённые параметры и их новые значения.

// запрос
{"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 — история (только чтение)

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. «Переделать с не существует 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 — весь конфиг без авторизации

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 страницы, воспроизведён вручную):

 {"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 строки)
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/maxtimeunix 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. Это «Имя пользователя» и «Пароль для управления с другого телефонного номера» из Настройки → Пользователи контроллера (дока). Симптом неверного пароля — бесконечный повтор запроса login/password. Это не баг страницы: UI берёт пару из localStorage браузера, получает {"auth":401} и спрашивает снова.

9.2. Протокол WebSocket

{"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 — весь конфиг БЕЗ авторизации

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.

Значения важных:

#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 23 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. Связанные заметки