diff --git a/family/how-to/zont-config-compiler.md b/family/how-to/zont-config-compiler.md index 2ab6f654..a1e29281 100644 --- a/family/how-to/zont-config-compiler.md +++ b/family/how-to/zont-config-compiler.md @@ -310,7 +310,7 @@ diff A.txt B.txt # пусто = round-trip чистый | 5 | Неизвестный тип объекта → exit 2, файл не создаётся | Смотреть stderr — там причина | | 6 | `validate_config()` → exit 4 | Печатает `❌ VALIDATION ERRORS` + список причин; файл намеренно **не выдан** (вывод пустой) | | 7 | Регистр без своего устройства / аналоговый выход с битой ссылкой | WARNING в stderr, конвертация продолжается — проверить ссылки вручную | -| 8 | Загрузка конфига в контроллер — **руками**, скрипты только конвертируют | Конвертер не имеет доступа к ZONT. ⚠️ **Снятие конфига — уже не ручное:** `http://192.168.0.50/config.txt` отдаёт весь конфиг без авторизации (§5g) | +| 8 | Загрузка конфига в контроллер — **руками**, скрипты только конвертируют | Конвертер не имеет доступа к ZONT. ⚠️ **Снятие конфига — уже не ручное:** `http://192.168.0.50/config.txt` отдаёт весь конфиг без авторизации (§5g). Заливка — утилита по USB / облако / WS **только для `#S`** (§5g-2) | | 9 | `INFRASTRUCTURE.md`, `docker-compose.yml`, `docker run.txt` в проекте — **исторический TrueNAS-стек** | Актуальный контур — [[family/how-to/home-automation]]. Не искать `modbus-bridge`/`mbusd` на NAS | | 10 | Дополнительных зависимостей нет | Только `pyyaml` — `jsonschema`/`ruamel` не нужны | | 11 | ✅ **ИСПРАВЛЕНО 2026-09-17** — Сценарий с >1 шагом падал (exit 2) | `config-to-yml.py` теперь цикл по всем шагам; `yml-to-config.py` пишет все `step_ids` | @@ -520,6 +520,61 @@ curl -s http://192.168.0.50/config.txt -o zont_config/config_$(date +%Y-%m-%d_%H --- +## 5g-2. 🔼 ЗАЛИВКА конфига обратно — чем и как (добыто 2026-09-17) + +Снятие конфига автоматизировано (§5g), но **заливка остаётся ручной** — идёт **не** через +`config.txt` (этот путь только на чтение). Доступные каналы: + +| Канал | Что умеет | Ограничение | +|---|---|---| +| **Настроечная утилита по USB** | заливка конфига + **прошивки** | Windows-only, нужен USB-кабель и драйвер | +| Облако ZONT (`my.zont.online`) | правка сценариев/реле через веб-UI | руками, по одному объекту | +| Локальный WebSocket `ws://192.168.0.50/ws` | запись `#S`-настроек (`{"scmd":"#S="}` + `#S15=1`) | **`#Z`-объекты не пишутся** — только `#S` | + +> 🔴 Локальный WS даёт запись **только системных `#S`-настроек** (Wi-Fi, MQTT, номер). Сценарии, +> реле, шаги (`#Z11/14/46/49`) через него **не заливаются** — для них по-прежнему утилита или облако. + +### Утилита `H1000 Programmator` 2.8.5 — добыта + +```bash +# официальный источник, скачивается без авторизации +curl -sL -o h1000_utility_beta.bin https://lk.zont-online.ru/download/simple/h1000_utility_beta +``` + +| Параметр | Значение | +|---|---| +| Версия | **2.8.5** (`prgm.2.8.5.exe`, 2.9 MB, Delphi/Borland) | +| Интерфейс | USB serial-over-USB (`usbser.sys` + `Hxxxx.inf`) | +| Архив на Mac | `~/rasputin-tmp/zont-util/h1000_utility_beta.bin` (4.5 MB) | +| Распаковано | `~/rasputin-tmp/zont-util/util_beta/H1000 Programmator/` | +| Хелпы внутри | `выходы.rtf`, `Отопление.rtf`, `пользователи.rtf`, `смс управление.rtf`, `DTMF управление.rtf` | + +> 🔴 **Питфолл распаковки.** macOS `unzip` падает на кириллических именах в архиве +> (`write error (disk full?)` — на самом деле **не** disk full). Имена в CP866. +> Решение — Python `zipfile` с перекодировкой `cp437 → cp866`: `~/rasputin-tmp/zont-util/extract.py`. + +> ⚠️ Пятно на репутации формата: файлы `Configs/*.set` внутри архива — **НЕ конфиги устройства**. +> Это UTF-8 JSON-словари подписей интерфейса (`{"Value":0,"Edit":"Пользователь 1"}`). +> Не пытаться парсить их нашим конвертером. + +### Прошивка — формат `.enc` (зашифрован) + +```bash +curl -sL -o H2000_fw.zip https://lk.zont-online.ru/download/firmwares/H2000_515__330_290.zip +``` + +| Файл | Размер | Энтропия | Вывод | +|---|---|---|---| +| `STM_MEGA_400_.enc` | 145 177 B | **7.9986** / 8.0 | зашифрован, не сжат | +| `main_c.evc` | 49 610 B | 5.6487 | частично структурный (`Mega-CX`) | + +Прошивка тоже отдаётся **без авторизации**. Утилита грузит именно `*.enc` +(строки `firmware_.enc`, `.enc|*.enc` найдены в exe). Расшифровка — отдельное исследование. + +➡️ Полный разбор утилиты и прошивки — **[[family/tech/zont-api]] §10** + +--- + ## 5h. 🌐 Облачный API ZONT — конфига не даёт Исследовано 2026-09-17. Доки скачаны в проект: `zont_api_docs/`. @@ -550,6 +605,8 @@ curl -s http://192.168.0.50/config.txt -o zont_config/config_$(date +%Y-%m-%d_%H | `zont_config/archive/` | **не в git** (`untracked`) — лежит в `.gitignore`-нейтральном состоянии | | `zont_config/H2000_PRO_config_actual-{2,3,4}.txt` / `.yml` | ✅ **перемещены в `archive/` и закоммичены** (`7ae0e32`) | | `zont_api_docs/` | ✅ **новая папка** — локальная копия доки облачного API ZONT (`zont_api_docs.html` 250 KB, `zont_api_docs.txt` 99 KB, `convert.py`). **не в git**. Исследование — [[family/tech/zont-api]] | +| `~/rasputin-tmp/zont-util/` | ✅ **новая папка на Mac** (вне репо) — настроечная утилита `H1000 Programmator` 2.8.5, драйвер USB, прошивка `.enc`, скрипт распаковки `extract.py`. Разбор — §5g-2, [[family/tech/zont-api]] §10 | +| `~/rasputin-tmp/zont-{auth-probe,recon,recon2,ws-probe}.js` | ✅ скрипты разведки локального WS-интерфейса. **не в git** | Не запушено: `origin/main..HEAD` = 3 коммита (`199f2b1`, `7ae0e32`, `12ba22b`). diff --git a/family/tech/zont-api.md b/family/tech/zont-api.md index 50522de8..4e1adfbf 100644 --- a/family/tech/zont-api.md +++ b/family/tech/zont-api.md @@ -224,17 +224,24 @@ POST https://my.zont.online/api/load_data | Параметр | Значение | |---|---| | Хост | `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` | +| 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` — весь конфиг без авторизации @@ -273,6 +280,9 @@ curl -s http://192.168.0.50/config.txt -o zont-config-live.txt # 623 стро датчики, `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?` для проверки). Без неё запись > не применяется. В веб-морде этой кнопки нет. @@ -352,81 +362,6 @@ node zont-ws-probe.js ws://192.168.0.50/ws admin 1316261 --- -## 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":,"req_state":0} → {"s":…,"t":…,"id":…,"type":…,"stype":…,"name":…} -{"scmd":"#S217?"} → {"scmdres":"#S217:…"} чтение системной настройки -{"scmd":"#S217="} → запись системной настройки -{"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. Что это и где лежит