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 — облачный API, локальный UI, прошивки reference 2026-09-17c

🌐 ZONT — облачный API, локальный UI и прошивки

Раздел §1–§7 — облачный API my.zont.online (исследован 2026-09-17). Раздел §6bis — локальный интерфейс контроллера (там реально есть конфиг). Раздел §10 — настроечная утилита и прошивки.

Исследовано 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)
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 — страница это только 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 — весь конфиг без авторизации

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 адаптеры.

#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? для проверки). Без неё запись не применяется. В веб-морде этой кнопки нет.

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

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.5. 🎯 Прошивка для НАШЕЙ платы (723 / 678) — найдена

Схема имени файла (выведена из рабочего примера и подтверждена попаданием):

H2000_PRO_<HW>__<FW>_<PROFILE>.zip
     723    678      1

Двойное подчёркивание — перед версией ПО. Только эта схема дала 200 OK:

curl -O https://lk.zont-online.ru/download/firmwares/H2000_PRO_723__678_1.zip   # 1.2 MB
# внутри: h2000_pro_v2_.enc

⚠️ Неверные варианты, все 404: H2000_723__678_1.zip, H2000_723__678.zip, H2000_723__678_290.zip, H2000PRO_723__678_1.zip, H2000_723__330_678.zip, H2000_678__723_290.zip. Листинг /download/firmwares/ тоже 404. Ключ к успеху — префикс H2000_PRO_ и ровно два подчёркивания.

10.6. Сверка с API веб-морды (get_firmware_releases)

JSON снят из DevTools на локальном UI (сохранён как api_get_firmware_releases.json):

{ "ok": true, "local_control_version": "26.02.1",
  "firmwares": [
    {"id":"69e8776449f39a24ed6d8210","version":"678:1","firmware_version":678,
     "profile_version":1,"beta":false,
     "changelog":"- Улучшение стабильности работы пользовательских кнопок\n- Улучшение в работе контура отопления с ПИД"}
  ] }
Источник Значение Сходится?
Конфиг прибора #S7 H2000_PRO 723 678
API морды 678:1 / firmware_version: 678
Имя файла H2000_PRO_723__678_1.zip

Итого: 723 = версия платы (HW), 678 = прошивка, 1 = profile_version.

Все 6 релизов в нашем дереве:

Версия beta id
678:1 ← последняя стабильная 69e8776449f39a24ed6d8210
602:1 69172c55b007f1b8976b4a71
585:1 68cd151d71fc6970ef4764d8
564:1 68676e92134c4eabf9f52ed0
541:1 678f930591b734a50e708d53
407:1 6639f918b3f9a6f88e9b185b

changelogs[] в том же JSON — 151 запись истории (от версии 270). Записи < 407 относятся к другим сериям (Climatic/SMART).

Скачивание по id не работает (нужен токен облака): /download/firmware/<id> → 404, /api/get_firmware?firmware_id=<id> → 403. Прямая ссылка по имени — работает без авторизации.

10.7. 📁 Материалы разведки — в проекте

Всё перенесено из ~/rasputin-tmp в проект:

/Users/admin/Automation/HA-ZONT-Modbus/zont_local_ui_recon/
├── README.md                          ← сводка (этот материал + команды)
├── config_live_192.168.0.50.txt       ← живой конфиг (32 KB)
├── api_get_firmware_releases.json     ← ответ API морды (§10.6)
├── firmware/H2000_PRO_723_678/h2000_pro_v2_.enc    ← НАША прошивка (1.2 MB)
├── firmware/H2000_515_330_290/        ← старая серия: STM_MEGA_400_.enc, main_c.evc
├── utility/h1000_utility_beta.bin + util_beta_2.8.5/ + H2000_default.zip
│            + H-2000-driver-1.zip + extract.py
└── scripts/zont-{auth-probe,recon,recon2,ws-probe}.js

53 файла, 17 MB. Рабочие копии в ~/rasputin-tmp/ остались (не удалялись).


11. Связанные заметки