[2026-09-17] eagle: family/how-to/rasputin-router.md family/how-to/zont-config-compiler.md family/tech/zont-api.md
This commit is contained in:
+136
-1
@@ -31,6 +31,10 @@ updated: '2026-09-17'
|
||||
> **Итог одной строкой:** облачный API ZONT **не работает с конфигом** (сценарии, реле, шаги,
|
||||
> условия). Конвертер `.txt ⇄ .yml` — по-прежнему **единственный** путь к правке сценариев.
|
||||
> API годится только для **мониторинга** и узкого набора настроек (отопление).
|
||||
>
|
||||
> ⚠️ **Уточнено 2026-09-17 (см. §6bis):** это верно для *облачного* API. **Локальный**
|
||||
> интерфейс контроллера конфиг отдаёт — причём `GET /config.txt` **вообще без авторизации**,
|
||||
> в формате нашего парсера. Прошивка локально не обновляется.
|
||||
|
||||
---
|
||||
|
||||
@@ -188,7 +192,8 @@ POST https://my.zont.online/api/load_data
|
||||
|---|---|---|
|
||||
| **1. Конвертер `.txt ⇄ .yml`** (текущий) | правка сценариев, реле, датчиков, Modbus | загрузка в контроллер **руками** |
|
||||
| **2. API-обвязка (дополнение)** | онлайн-состояния (`devices?load_io=true`), история (`load_data`), отопление (`update_device`), сирена/охрана (`set_io_port`) | сценарии **недоступны** |
|
||||
| **3. «Переделать с 0»** | ❌ не существует API, на который переписать |
|
||||
| **3. Локальный интерфейс (§6bis)** | 🔴 `GET /config.txt` — **весь конфиг без авторизации**, в формате парсера | только чтение; запись — WS `#S<n>=` + `#S15=1` |
|
||||
| **4. «Переделать с 0»** | ❌ не существует API, на который переписать | |
|
||||
|
||||
### Рекомендация (доложена Alex, решения пока нет)
|
||||
|
||||
@@ -201,6 +206,132 @@ POST https://my.zont.online/api/load_data
|
||||
|
||||
---
|
||||
|
||||
## 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. Питфоллы
|
||||
|
||||
| # | Питфолл | Как обойти |
|
||||
@@ -213,6 +344,9 @@ POST https://my.zont.online/api/load_data
|
||||
| 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 |
|
||||
|
||||
---
|
||||
|
||||
@@ -222,3 +356,4 @@ POST https://my.zont.online/api/load_data
|
||||
- [[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`)
|
||||
|
||||
Reference in New Issue
Block a user