docs: обновлена документация под 2026.10.2 (веб-панель, данные, CLI, дисплей)

This commit is contained in:
shade committed 2026-10-22 18:23:58 +03:00
1 parent f6c9089446
commit d3393a88fe
6 files changed
+413 -143

No files matched your search

+41 -6
View File
@@ -33,7 +33,7 @@ PosadMesh — форк проекта EastMesh, который, в свою оч
| MQTT-мост | нет | передача raw-пакетов mesh между репитерами через ваш собственный peer-брокер (трек `repeater-mqtt-bridge`) |
| Wi-Fi | нет | Wi-Fi на репитерах: подключение, энергосбережение, watchdog шлюза, автоматическое переподключение, команды `wifi.*` |
| Веб-интерфейс | нет | локальная HTTPS-панель: вход по паролю администратора, выполнение CLI-команд, настройки репитера/радио/MQTT, регионы, чёрные списки, обновление прошивки (OTA), управление сертификатом панели |
| Телеметрия | нет | история метрик в PSRAM и архив на SD: батарея, загрузка ядра, память, пакеты, ошибки, уровень сигнала и шума, датчики, GPS; страница `/stats` с графиками и списком соседей/событий |
| Телеметрия | нет | история метрик в PSRAM и архив на SD: батарея, загрузка ядра, память, пакеты, ошибки, уровень сигнала и шума, датчики, GPS; экран `/stats` с графиками и событиями и отдельный экран соседей с таблицей и картой OSM |
| CLI | базовый набор MeshCore | дополнительно `mqtt.*`, `wifi.*`, `web.*`, `blacklist path\|chan`, `region`, `stats-*`, `time` и `time.force`, режим Ghost Node, лимит пересылки flood, отчёт о батарее платы, управление вентилятором T-Beam 1W |
| Сборки | companion (USB/BLE), repeater, room server, sensor | только MQTT-таргеты: `*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge` |
| Платы | базовый список MeshCore | добавлены свои варианты (Meshadventurer, самодельные ESP32-S3 + E22, Xiao S3 + LoRa2021F33, RAK3112, Station G2/G3, ThinkNode и другие) |
@@ -295,7 +295,10 @@ get bridge.enabled
Возможности:
- доступ с проверкой пароля по существующему паролю администратора репитера
- выполнение CLI только из белого списка
- выполнение CLI-команд репитера из браузера после входа
- экраны «Общие», «Статистика», «CLI», «Прошивка» и «Соседи»
- экран соседей с таблицей и картой OSM
- индикатор батареи вверху страницы и история статистики с графиками
- сгруппированные быстрые действия
- светлая и тёмная темы
- опциональное отключение через `set web off`
@@ -333,9 +336,9 @@ Workflow upstream MeshCore (`.github/workflows/build-*.yml`, `firmware-builder.y
```bash
git tag repeater-bridge-espnow-v1.15.0
git tag repeater-mqtt-v2026.5.1
git tag repeater-mqtt-espnow-v2026.5.1
git tag repeater-mqtt-bridge-v2026.7.0
git tag repeater-mqtt-v2026.10.2
git tag repeater-mqtt-espnow-v2026.10.2
git tag repeater-mqtt-bridge-v2026.10.2
```
`repeater-bridge-espnow` использует в теге версию upstream MeshCore.
@@ -351,7 +354,39 @@ MQTT-репитер использует:
Правило ведения: после любых правок проекта сюда дописывается короткая запись о том, что изменилось.
### 2026.10.0 (текущая разработка)
### 2026.10.2
**Веб-панель репитера**
- панель разделена на экраны с переключением на клиенте: «Общие» (`/app`), «Статистика» (`/stats`, отдельный маршрут), «CLI», «Прошивка» и «Соседи»; активна ровно одна кнопка, на `/stats` — «Статистика»; группа «Анонс / Обновить / Перезагрузить / тема / Выйти» прижата к правому краю;
- на экранах «CLI», «Прошивка» и «Соседи» скрыты «Анонс» и «Обновить»; на «Соседях» «Обновить» оставлен и перечитывает данные экрана;
- интерфейс переведён на русский: заголовки экранов, разделов и кнопок, `Trends` стал «Графики»; технические сокращения (CLI, MQTT, IATA, RSSI, SNR, IP, SSID, hex, dB, UTC, PEM, TLS, RSA) и названия сервисов MQTT `MeshCoreTel` / `MeshCoreTel RU` не переводятся;
- экран «Соседи»: таблица (Имя, ID, SNR, Широта/Долгота, Слышно, Анонс), кнопки «Найти соседей» (`discover.neighbors`) и «Очистить» (`neighbor.clear`), строка статуса «Команда отправлена: … (ответ смотрите в журнале CLI)»; имя и координаты соседа берутся из его анонса, у кого их нет — прочерк вместо имени и `0.0000 / 0.0000`;
- карта OSM на экране «Соседи»: тайлы `tile.openstreetmap.org` обычными `<img>`, поверх — SVG-слой; центр всегда на координатах нашего узла, линии к соседям с координатами окрашены и утолщены по SNR, подписи «имя · dB»; зум кнопками `+` / `−` / `⌂` и колесом мыши, карта перетаскивается мышью; соседи без координат или с нулями на карту не попадают;
- индикатор батареи вверху страницы: иконка с заполнением, процент и напряжение в милливольтах; обновляется раз в минуту и при загрузке страницы, на экранах «CLI», «Прошивка» и «Соседи» скрыт;
- страницы панели сжимаются gzip при сборке (`arch/esp32/extra_scripts/gzip_web_panel.py`), отдаются с `Content-Encoding: gzip` и распаковываются браузером; пост-проверка `check_app_size.py` роняет сборку, если образ больше своего app-раздела;
- поле ввода CLI-команды получило подсказки (`datalist`) по типовым командам репитера.
**Внешние данные перенесены на meshinfo.ru**
- панель больше не обращается к `api.vbart.ru` и `meshcore.hackru.ru`; пресеты радио и коды IATA (38 записей) — `https://meshinfo.ru/flasher/meshcore-data/conf.json`, дерево регионов — `https://meshinfo.ru/flasher/meshcore-data/regions.json`, чёрные списки по IATA — `https://meshinfo.ru/flasher/meshcore-data/blacklist/<КОД>.json` (реальные данные есть только для `MOW`, для остальных 37 кодов лежат пустые шаблоны);
- для `/flasher/meshcore-data/` на сервере (nginx) настроен CORS `Access-Control-Allow-Origin: *`; исходники данных лежат в репозитории — [`posadmesh-tools/meshcore-data/`](./posadmesh-tools/meshcore-data).
**Защита эфира**
- `set advert.jail on|off` — «тюрьма анонсов» (AdvertJail): слишком частые анонсы от одного отправителя не пересылаются, по умолчанию включена;
- `set channel.budget <0..1000>` — бюджет каналов (ChannelBudget): лимит flood-пакетов групповых каналов на канал за 10 минут, по умолчанию выключен (`0`);
- `neighbor.clear` очищает таблицу соседей, `discover.neighbors` запускает поиск соседей (`neighbor.remove <hex>` остаётся для удаления одного соседа).
**Дисплей репитера**
- в верхней строке главного экрана (`renderStatus`) справа появилась графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`); имя узла обрезается по доступной ширине с `..`, а если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда; отдельный экран `Battery` в меню не изменился.
**Релиз**
- `v2026.10.2` для треков `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge`.
### 2026.10.0
**Ребрендинг в PosadMesh**
+62 -34
View File
@@ -8,12 +8,12 @@
Параметры запуска:
- `firmware_version` — версия upstream MeshCore для метаданных (например `v1.17.1`);
- `posadmesh_version` — версия релиза PosadMesh (например `v2026.10.0`);
- `firmware_version` — версия upstream MeshCore для метаданных (например `v1.18.0`);
- `posadmesh_version` — версия релиза PosadMesh (например `v2026.10.2`);
- `group` — что собирать: `all` (все MQTT-таргеты), `uplink`, `espnow`, `bridge` или `single`;
- `target` — имя окружения PlatformIO, если `group=single` (например `heltec_v4_repeater_mqtt`);
- `publish` — `true`, чтобы создать релиз Gitea и загрузить в него файлы (`false` по умолчанию — только артефакты сборки);
- `tag` — тег релиза при `publish=true` (например `repeater-mqtt-v2026.10.0`).
- `tag` — тег релиза при `publish=true` (например `repeater-mqtt-v2026.10.2`).
Для публикации в репозитории должен быть задан секрет `GITEA_TOKEN` (personal access token с правом `write:repository`).
@@ -25,7 +25,7 @@
```bash
GITEA_TOKEN=<token> posadmesh-tools/publish-gitea-release.sh \
repeater-mqtt-v2026.10.0 out "Repeater MQTT v2026.10.0"
repeater-mqtt-v2026.10.2 out "Repeater MQTT v2026.10.2"
```
Скрипт создаёт релиз, если его ещё нет, и повторный запуск не дублирует уже загруженные файлы. Адрес инстанса и репозиторий можно переопределить переменными `GITEA_URL` и `GITEA_REPO`.
@@ -36,14 +36,14 @@ GITEA_TOKEN=<token> posadmesh-tools/publish-gitea-release.sh \
## Версии сборки
- `FIRMWARE_VERSION` — версия upstream MeshCore, на которой основана сборка (например `v1.15.0`)
- `POSADMESH_VERSION` — версия релиза PosadMesh (например `v2026.5.1`)
- `FIRMWARE_VERSION` — версия upstream MeshCore, на которой основана сборка (например `v1.18.0`)
- `POSADMESH_VERSION` — версия релиза PosadMesh (например `v2026.10.2`)
Обе задаются переменными окружения перед запуском сборки:
```bash
export FIRMWARE_VERSION=v1.15.0
export POSADMESH_VERSION=v2026.5.1
export FIRMWARE_VERSION=v1.18.0
export POSADMESH_VERSION=v2026.10.2
bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
```
@@ -52,14 +52,14 @@ bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
Один или несколько тегов следующих форматов помечают релиз соответствующего трека:
- `repeater-bridge-espnow-v1.15.0`
- `repeater-mqtt-espnow-v2026.5.1`
- `repeater-mqtt-bridge-v2026.7.0`
- `repeater-mqtt-v2026.5.1`
- `repeater-mqtt-espnow-v2026.10.2`
- `repeater-mqtt-bridge-v2026.10.2`
- `repeater-mqtt-v2026.10.2`
В `repeater-bridge-espnow-v1.15.0` используется версия upstream MeshCore.
В `repeater-mqtt-espnow-v2026.5.1` используется версия релиза PosadMesh.
В `repeater-mqtt-bridge-v2026.7.0` используется версия релиза PosadMesh.
В `repeater-mqtt-v2026.5.1` используется версия релиза PosadMesh.
В `repeater-mqtt-espnow-v2026.10.2` используется версия релиза PosadMesh.
В `repeater-mqtt-bridge-v2026.10.2` используется версия релиза PosadMesh.
В `repeater-mqtt-v2026.10.2` используется версия релиза PosadMesh.
Соответствие тегов и треков:
@@ -70,6 +70,33 @@ bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
Сборка выполняется локально для нужного таргета; тегов на одном коммите может быть несколько.
## Выпуск v2026.10.2
Версия `v2026.10.2` выпускается тремя треками:
- `repeater-mqtt` — тег `repeater-mqtt-v2026.10.2`
- `repeater-mqtt-espnow` — тег `repeater-mqtt-espnow-v2026.10.2`
- `repeater-mqtt-bridge` — тег `repeater-mqtt-bridge-v2026.10.2`
База — upstream MeshCore `v1.18.0`: при сборке `FIRMWARE_VERSION=v1.18.0`, `POSADMESH_VERSION=v2026.10.2`.
Состав:
- веб-панель: экраны «Общие», «Статистика», «CLI», «Прошивка», «Соседи» с переключением на клиенте; русский интерфейс; экран «Соседи» с таблицей и картой OSM; индикатор батареи вверху страницы; gzip-страницы и пост-проверка размера образа; подсказки CLI-команд;
- внешние данные (пресеты радио и 38 кодов IATA, дерево регионов, чёрные списки) перенесены на `https://meshinfo.ru/flasher/meshcore-data/`;
- CLI: `set advert.jail on|off`, `set channel.budget <0..1000>`, `neighbor.clear`, `discover.neighbors`;
- дисплей: иконка батареи с заполнением и напряжение в верхней строке экрана состояния; отдельный экран `Battery` не менялся.
Что проверить перед публикацией:
1. Собрать хотя бы по одной цели из каждой группы (`uplink`, `espnow`, `bridge`) и убедиться, что пост-проверка `check_app_size.py` не падает.
2. На ESP32-плате открыть панель и переключить все пять экранов: активна ровно одна кнопка, на `/stats` — «Статистика»; на «CLI», «Прошивке» и «Соседях» нет «Анонса», на «Соседях» работает «Обновить»; индикатор батареи виден на «Общих» и «Статистике» и скрыт на остальных трёх.
3. Экран «Соседи»: таблица заполняется, команды «Найти соседей» и «Очистить» уходят, карта строит тайлы OSM с центром на узле, рисует линии и подписи по SNR, работают зум и перетаскивание; соседи без координат не рисуются.
4. Проверить, что страницы панели отдаются с `Content-Encoding: gzip`.
5. Проверить в CLI: `set advert.jail off` и `on` дают соответствующие ответы; `set channel.budget 100` отвечает `... 100 packets per 10 min`, `set channel.budget 0` — `... OFF`; `neighbor.clear` отвечает `OK`; `discover.neighbors` — `OK - Discover sent`.
6. Загрузить пресеты, регионы и чёрный список по адресам `meshinfo.ru` — без ошибок CORS.
7. На плате с дисплеем убедиться, что в верхней строке есть иконка батареи и напряжение, а длинное имя обрезается с `..`.
## Итоговая версия прошивки
- `repeater-bridge-espnow` использует версию из тега как `FIRMWARE_VERSION`
@@ -80,46 +107,47 @@ bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
Итоговая строка версии зависит от трека:
- `repeater-bridge-espnow`: `v1.15.0-<commit>`
- `repeater-mqtt-espnow`: `v1.15.0-posadmesh-v2026.5.1-<commit>`
- `repeater-mqtt-bridge`: `v1.15.0-posadmesh-v2026.7.0-<commit>`
- `repeater-mqtt`: `v1.15.0-posadmesh-v2026.5.1-<commit>`
- `repeater-mqtt-espnow`: `v1.18.0-posadmesh-v2026.10.2-<commit>`
- `repeater-mqtt-bridge`: `v1.18.0-posadmesh-v2026.10.2-<commit>`
- `repeater-mqtt`: `v1.18.0-posadmesh-v2026.10.2-<commit>`
Пример:
- тег: `repeater-mqtt-v2026.5.1`
- переменные: `FIRMWARE_VERSION=v1.15.0`, `POSADMESH_VERSION=v2026.5.1`
- итоговая версия сборки: `v1.15.0-posadmesh-v2026.5.1-abcdef`
- тег: `repeater-mqtt-v2026.10.2`
- переменные: `FIRMWARE_VERSION=v1.18.0`, `POSADMESH_VERSION=v2026.10.2`
- итоговая версия сборки: `v1.18.0-posadmesh-v2026.10.2-abcdef`
## Типичный порядок выпуска
1. Обновите `release-notes.yml` в ветке `develop` — добавьте записи о релизе, которые должны войти в помечаемый тегом коммит.
2. Откройте и смерджите релизный PR из `develop` в `main`.
3. Соберите нужные прошивки локально с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`.
4. Создайте нужные теги релиза на целевом коммите в `main`.
5. Запушьте теги в git.meshinfo.ru.
6. Создайте релиз в веб-интерфейсе git.meshinfo.ru и приложите собранные файлы из `out/`.
1. Обновите `release-notes.yml` в ветке `main` — добавьте записи о релизе, которые должны войти в помечаемый тегом коммит.
2. Соберите нужные прошивки локально с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`.
3. Создайте нужные теги релиза на целевом коммите в `main`.
4. Запушьте теги в git.meshinfo.ru.
5. Создайте релиз в веб-интерфейсе git.meshinfo.ru и приложите собранные файлы из `out/`.
Если `release-notes.yml` должен отражать помеченный тегом релиз прошивки в репозитории, внесите это изменение до PR в `main`, чтобы помечаемый коммит уже содержал соответствующие примечания к релизу.
Если `release-notes.yml` должен отражать помеченный тегом релиз прошивки в репозитории, внесите это изменение до коммита в `main`, чтобы помечаемый коммит уже содержал соответствующие примечания к релизу.
Пример:
```bash
export FIRMWARE_VERSION=v1.15.0
export POSADMESH_VERSION=v2026.5.1
export FIRMWARE_VERSION=v1.18.0
export POSADMESH_VERSION=v2026.10.2
bash posadmesh-build.sh build-repeater-mqtt-firmwares
git tag repeater-mqtt-v2026.5.1
git push origin repeater-mqtt-v2026.5.1
git tag repeater-mqtt-v2026.10.2
git push origin repeater-mqtt-v2026.10.2
```
## Поддерживаемые теги
- `repeater-bridge-espnow-v1.15.0`
- `repeater-mqtt-espnow-v2026.5.1`
- `repeater-mqtt-bridge-v2026.7.0`
- `repeater-mqtt-v2026.5.1`
- `repeater-mqtt-espnow-v2026.10.2`
- `repeater-mqtt-bridge-v2026.10.2`
- `repeater-mqtt-v2026.10.2`
## Планы на следующий релиз
**Статус на `v2026.10.2`: не выполнено, пункт переносится.** Мёртвые префы вентилятора остаются в коде: класс `FanPrefs` и поля `fan_mode` / `fan_timeout_secs` в `NodePrefs`, чтение старых полей из NVS (смещения 512/513), ограничения при загрузке и значения по умолчанию в `MyMesh`.
- убрать мёртвые префы вентилятора: класс `FanPrefs`, поля `fan_mode` и `fan_timeout_secs`, чтение старых полей из NVS (смещения 512/513), ограничения при загрузке и значения по умолчанию в `MyMesh`, а также `def("fan", fan)` в `NodePrefs`. После слияния с upstream 1.18.0 вентилятором владеет сама плата: `board.attachDynamicPrefs(_prefs.getCustom())`, команды `get fan`, `set fan on|off|auto`, `set fan.lo`, `set fan.hi`, TX-кулдаун 15 секунд. Наши поля больше ни на что не влияют, но продолжают писаться в JSON и NVS. В README и release notes отметить, что сохранённые ранее `fan_mode` и `fan_timeout_secs` перестают учитываться — вентилятор пойдёт по логике платы.
+18 -2
View File
@@ -179,6 +179,22 @@ OK
В сборках MQTT-репитеров `flood.max.unscoped` по умолчанию равен `64`. Меньшие значения могут ограничить, как далеко повторяется неограниченный flood-трафик, тогда как пересылка scoped/region flood остаётся под управлением `flood.max`.
### Соседи и их поиск
- `neighbors`: показывает таблицу соседей. Каждая строка — `id:секунд_назад:snr`, где `id` — первые 4 байта публичного ключа в hex; строки идут от самого свежего приёма к самому старому. Если соседей нет, ответ `-none-`.
- `neighbor.remove <hex>`: удаляет одного соседа по hex-префиксу публичного ключа; при ошибке разбора ключа отвечает `ERR: bad pubkey`.
- `neighbor.clear`: очищает таблицу соседей целиком и отвечает `OK`.
- `discover.neighbors`: отправляет в эфир запрос обнаружения соседей и отвечает `OK - Discover sent`; параметров не принимает (`Err - discover.neighbors has no options`). Результат приходит в таблицу соседей по мере ответов.
### Защита эфира: тюрьма анонсов и бюджет каналов
Обе настройки применяются при обработке flood-пакетов в MQTT-репитере на ESP32.
- `set advert.jail on|off`: «тюрьма анонсов» (AdvertJail). Анонс, пришедший от отправителя чаще, чем раз в интервал advert узла (`advert.interval`, а при `0` — раз в 60 минут), считается нарушением; после 6 нарушений отправитель попадает в «тюрьму», и его досрочные анонсы не пересылаются. Анонс, выдержавший интервал, снимает одно нарушение, а ниже двух нарушений отправитель из «тюрьмы» выходит. По умолчанию включена. Ответ — `OK - advert jail is now ON` или `OK - advert jail is now OFF`.
- `set channel.budget <0..1000>`: бюджет каналов (ChannelBudget) — сколько flood-пакетов группового канала (`GRP_TXT`, `GRP_DATA`) узел готов пропустить за 10 минут на каждый канал. Значение считается по 1-байтовому хэшу канала: канал может отправить до `<N>` пакетов подряд, дальше пакеты идут не чаще одного за `600 / N` секунд. `0` выключает бюджет; значения вне диапазона обрезаются до `0..1000`. По умолчанию выключен (`0`). Ответ — `OK - channel budget is now OFF` или `OK - channel budget is now <N> packets per 10 min`.
Отдельных `get`-команд у этих настроек нет: текущее значение хранится в prefs и задаётся только командами `set`.
### Отчётность о батарее платы
- В сборках MQTT-репитеров фоновый опрос батареи, используемый для истории MQTT/статуса, ограничен примерно одним разом в минуту. Явные запросы статуса и телеметрии по-прежнему обновляют показание сразу.
@@ -219,9 +235,9 @@ OK
- это предназначено для локального административного использования в доверенной сети
- `start ota` освобождает локальный слушатель HTTP-редиректа на порту `80`, чтобы слушатель OTA HTTP мог занять его, не останавливая остальные службы репитера, независимо от того, выполнена ли команда из веб-панели, последовательного CLI или удалённого сеанса CLI
- если старый слушатель редиректа не освободил порт `80` полностью, слушатель OTA повторяет попытки примерно до 30 секунд, после чего сдаётся
- кнопка `Purge SD` в веб-интерфейсе выполняет `purge sd` после подтверждения в браузере
- `purge sd` можно выполнить и из терминала на экране «CLI»; отдельной кнопки в панели нет
- `start ota` использует существующий Wi-Fi-адрес репитера, если он уже подключён, или запускает точку доступа `MeshCore-OTA`, если Wi-Fi не подключён
- ярлык Regions в `/app` последовательно выполняет команды регионов MeshCore: `region put` и `region allowf` для базового региона и вложенного, затем `region save`
- ярлык «Регионы» на экране «Общие» последовательно выполняет команды регионов MeshCore: `region put` и `region allowf` для базового региона и вложенного, затем `region save`
## Скрипт проверки состояния heap
+2
View File
@@ -20,6 +20,8 @@
| --- | --- | --- |
| ![Экран состояния](_assets/wizard/01-status.png) | ![Меню Setup](_assets/wizard/02-menu-top.png) | ![Низ меню](_assets/wizard/03-menu-bottom.png) |
В верхней строке экрана состояния справа показана графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла выводится слева и обрезается по доступной ширине с `..`; если имя вместе с напряжением не помещается, напряжение скрывается, а иконка батареи остаётся всегда. Отдельный пункт меню `Battery` по-прежнему показывает напряжение, процент, полоску и множитель ADC. На снимке экрана состояния выше иконки батареи ещё нет — он сделан в более ранней сборке.
## Что настраивается
Мастер меняет только то, что нужно для быстрого ввода узла в сеть:
+137 -101
View File
@@ -24,13 +24,14 @@
Она предоставляет:
- локальную страницу администратора за паролем по адресу `/app`
- отдельную страницу статистики и трендов по адресу `/stats`
- быстрые команды `get` для типовых проверок репитера и MQTT
- панель CLI в стиле терминала для полного доступа к CLI репитера
- редактируемые настройки репитера
- редактируемые настройки MQTT
- просмотр исторической статистики с трендами, соседями и последними событиями
- экран «Общие» (`/app`) с настройками репитера и MQTT за паролем администратора
- отдельный экран «Статистика» (маршрут `/stats`) с историей и графиками
- экран «CLI» с быстрыми командами `get` и терминалом для полного доступа к CLI репитера
- экран «Прошивка» с обновлением прошивки (OTA) и сертификатом панели
- экран «Соседи» с таблицей соседей, их поиском на карте OSM
- индикатор батареи вверху страницы
Интерфейс панели переведён на русский: заголовки экранов, разделов и кнопок, названия полей и подсказки. Технические сокращения остаются латиницей — CLI, MQTT, IATA, RSSI, SNR, IP, SSID, hex, dB, UTC, PEM, TLS, RSA. Названия сервисов MQTT `MeshCoreTel` и `MeshCoreTel RU` не переводятся.
Рекомендации по эксплуатации:
@@ -43,26 +44,27 @@
### Проверить Wi-Fi и MQTT
1. Откройте панель.
2. Нажмите `wifi.status` в Quick `get` Commands.
3. Нажмите `mqtt.status` в Quick `get` Commands.
4. Откройте `/stats` из верхней навигации для просмотра исторической статистики.
2. Перейдите на экран «CLI».
3. Нажмите `wifi.status` в «Быстрых get-командах».
4. Нажмите `mqtt.status` там же.
5. Откройте «Статистику» (`/stats`) для просмотра исторической статистики.
### Изменить имя устройства
1. Отредактируйте `Device Name`.
2. Нажмите `Save`.
1. На экране «Общие» отредактируйте поле «Имя устройства».
2. Нажмите «Сохранить».
3. Подтвердите сгенерированную команду и ответ в поле терминала CLI.
### Обновить владельца или email MQTT
1. Перейдите в `MQTT Settings`.
2. Введите новое значение.
3. Нажмите `Save`.
1. Перейдите к разделу «Настройки MQTT» на экране «Общие».
2. Введите новое значение в поле «Владелец (MQTT)» или «Почта (MQTT)».
3. Нажмите «Сохранить».
4. Используйте кнопку обновления, если хотите перечитать сохранённое значение из репитера.
## Обзор скриншотов
Скриншоты ниже показывают текущее разделение между более лёгкой страницей администратора `/app` и отдельной страницей статуса `/stats`.
Скриншоты ниже сделаны в более ранней сборке: на них ещё английские подписи, навигация `App`/`Stats` и кнопка `Start OTA`. В текущих сборках интерфейс русский, экранов пять, а обновление прошивки выполняется на экране «Прошивка»; снимки оставлены только как общий обзор компоновки карточек.
### Скриншот `/app`
@@ -108,7 +110,7 @@
- соединение идёт по HTTPS, но сертификат самоподписанный
- браузеры будут предупреждать при первом подключении
- после входа панель открывает доступ к CLI репитера
- браузер сохраняет токен сессии при переключении между `/app` и `/stats`; страница переключает представления на месте до выхода, блокировки по бездействию или перезапуска устройства
- браузер сохраняет токен сессии при переключении между экранами; панель переключает экраны на месте до выхода, блокировки по бездействию или перезапуска устройства
- кратковременные пропадания Wi-Fi могут прервать загрузку страницы, но не должны требовать нового входа при перезапуске веб-панели
- после перезапуска или перепрошивки устройства приложение проверяет сохранённый токен перед загрузкой настроек и возвращается к экрану входа, если сессия устарела
@@ -118,6 +120,8 @@
Панель спроектирована так, чтобы загружаться мягче, чем более ранние версии. При входе она теперь запрашивает разделы последовательно, а не запрашивает сразу один большой bootstrap payload.
Страницы панели сжимаются gzip во время сборки (`arch/esp32/extra_scripts/gzip_web_panel.py`): в прошивке лежат уже сжатые HTML, а сервер отдаёт их с заголовком `Content-Encoding: gzip`, поэтому браузер распаковывает страницы сам. Отдельная пост-проверка сборки (`arch/esp32/extra_scripts/check_app_size.py`) роняет сборку, если образ не влезает в свой app-раздел.
Даже с этим изменением панель по-прежнему использует HTTPS и внутренний heap. На платах с одним или двумя брокерами WSS MQTT открытие панели уменьшает запас MQTT на время активной сессии.
Рекомендуемая практика для развёртываний репитера:
@@ -126,49 +130,73 @@
- используйте её снова для редких проверок или диагностики
- отключайте её командой `set web off` по завершении, чтобы у MQTT было максимально возможное свободное место
## Навигация и действия
## Экраны и навигация
У веб-консоли теперь две основные страницы:
Панель — это одна страница, которая переключает экраны на клиенте; `/app` и `/stats` — её маршруты, а остальные экраны открываются кнопками без смены адреса:
- `/app`: более лёгкое представление для управления и настройки
- `/stats`: текущий статус, тренды, соседи и последние события
| Экран | Как открывается | Что показывает |
| --- | --- | --- |
| «Общие» | кнопка «Общие», маршрут `/app` | информация, настройки репитера и радио, настройки MQTT, чёрный список, регионы |
| «Статистика» | кнопка «Статистика», маршрут `/stats` | сводка состояния, «Графики», «События» |
| «CLI» | кнопка «CLI» | «Быстрые get-команды» и терминал CLI |
| «Прошивка» | кнопка «Прошивка» | обновление прошивки по файлу `.bin` и TLS-сертификат панели |
| «Соседи» | кнопка «Соседи» | таблица соседей и карта OSM |
Обе страницы используют одну и ту же верхнюю навигацию и служебные действия.
Кнопки экранов находятся в верхней панели действий, активна ровно одна — текущий экран. На маршруте `/stats` активна «Статистика», на остальных экранах — соответствующая кнопка.
### `/app`
Справа в той же панели — «Анонс», «Обновить» с кнопкой автообновления `↻`, «Перезагрузить», переключатель темы и «Выйти»; эта группа прижата к правому краю. На экранах «CLI» и «Прошивка» кнопки «Анонс» и «Обновить» скрыты. На экране «Соседи» скрыт только «Анонс», а «Обновить» остаётся и заново читает таблицу и карту.
Страница `/app` — это основная область администрирования и настройки.
Вверху страницы — индикатор батареи: иконка с заполнением по проценту, процент и напряжение в милливольтах. Он обновляется раз в минуту и при загрузке страницы, а на экранах «CLI», «Прошивка» и «Соседи» скрыт.
Она включает:
### «Общие» (`/app`)
- переход к `App` и `Stats`
- `Advert`
- `Start OTA`
- `Reboot`
- переключатель темы
- `Logout`
Основная область администрирования и настройки. На этом экране видны карточки «Информация», «Настройки репитера», «Настройки MQTT», «Чёрный список» и «Регионы»; карточки CLI и обновления прошивки живут на своих экранах и здесь скрыты.
Используйте `Start OTA` только тогда, когда собираетесь обновить прошивку.
### «Статистика» (`/stats`)
Если браузер может получить манифест прошивки PosadMesh flasher, страница приложения сверяет версию релиза PosadMesh из `mqtt.client_version` с опубликованными релизами MeshCore-Posadmesh. Когда доступен более новый тег релиза PosadMesh, в верхней части страницы появляется уведомление об обновлении прошивки.
Отдельный маршрут для текущего статуса и исторического обзора: сводка состояния, «Графики» (бывший раздел `Trends`) и «События». Страница открывается отдельной загрузкой, поэтому основная страница администратора остаётся легче.
Для сборок, включающих `CLIENT_ENV`, уведомление может показывать `Update now`. Это скачивает соответствующий не объединённый `.bin` с зеркала прошивок PosadMesh flasher, показывает прогресс в баннере, загружает прошивку через веб-панель HTTPS и позволяет устройству перезагрузиться. Для этого требуются заголовки CORS на путях `/firmwares/` flasher.
### «CLI»
### `/stats`
Здесь собраны «Быстрые get-команды» и терминал «Выполнить CLI-команду». Кнопки сохранения на других экранах выводят сгенерированную команду и ответ именно в этот терминал.
Страница `/stats` — это основное место для текущего статуса и исторического обзора.
### «Прошивка»
Она включает:
Карточка «Обновление прошивки» принимает файл `.bin`: после подтверждения панель загружает его через `/api/ota`, показывает прогресс, а после успешной прошивки устройство перезагружается и панель возвращает на экран входа.
- переход к `App` и `Stats`
- `Refresh`
- `Reboot`
- переключатель темы
- `Logout`
Во второй карточке загружается TLS-сертификат самой панели — файл PEM с цепочкой сертификатов и закрытым ключом RSA размером до 12 КБ. Кнопка «Встроенный» возвращает самоподписанный сертификат, после чего браузер снова предупредит о нём.
## Быстрые команды "get"
## Экран «Соседи»
Этот раздел выполняет типовые команды только для чтения для:
### Таблица соседей
Таблица показывает:
| Колонка | Значение |
| --- | --- |
| Имя | имя из анонса соседа, у кого имени нет — прочерк |
| ID | короткий ID соседа |
| SNR | последний SNR в dB |
| Широта / Долгота | координаты из анонса в формате `0.0000`; если сосед их не передал — `0.0000 / 0.0000` |
| Слышно | сколько времени прошло с последнего приёма |
| Анонс | сколько времени прошло с последнего анонса |
Над таблицей — кнопки «Найти соседей» (отправляет `discover.neighbors`) и «Очистить» (отправляет `neighbor.clear`). Строка статуса подтверждает отправку: «Команда отправлена: … (ответ смотрите в журнале CLI)» — сам ответ устройства появляется в терминале на экране «CLI».
### Карта соседей
Карта показывает наше положение и соседей, у которых есть координаты:
- подложка — тайлы `tile.openstreetmap.org`, которые загружаются обычными `<img>`; поверх них рисуется SVG-слой с линиями и подписями;
- центр карты всегда на координатах нашего узла; если у узла координаты не заданы, карта скрыта и подсказывает задать их через `set lat` / `set lon`;
- линии идут от нашего узла к соседям с координатами: цвет по SNR (зелёный от `8 dB`, жёлтый от `0 dB`, красный ниже), толщина растёт с SNR, для соседа без SNR — серая линия;
- рядом с точкой соседа подпись «имя · dB»;
- зум — кнопками `+`, `−` и `⌂` (сброс) или колесом мыши, карта перетаскивается мышью;
- соседи без координат или с нулевыми координатами на карту не попадают; сколько их попало и сколько загружено тайлов, написано под картой.
## Быстрые get-команды
На экране «CLI» этот раздел выполняет типовые команды только для чтения для:
- Wi-Fi
- MQTT
@@ -177,13 +205,14 @@
## Выполнить команду CLI
Это небольшой терминал для CLI репитера.
Это небольшой терминал для CLI репитера на экране «CLI».
- нажмите `Enter`, чтобы выполнить команду
- история команд отображается в поле терминала ниже
- кнопки сохранения в других частях страницы также показывают здесь сгенерированную команду и ответ
- `clock` доступна здесь, если вы хотите проверить текущее время платы репитера
- аутентифицированные сессии могут выполнять те же команды CLI, которые принимает репитер
- в поле ввода работают подсказки: браузер предлагает типовые команды репитера из встроенного списка (`datalist`), в том числе `get`/`set` для радио, анонсов, соседей, веб-панели и MQTT
Это позволяет легко увидеть, что именно панель отправила репитеру.
@@ -191,40 +220,52 @@
В этот раздел входят:
- Device Name
- Clock UTC
- Latitude
- Longitude
- Guest Password
- Private Key
- Advert Interval
- Flood Interval
- Scoped Flood Max
- Unscoped Flood Max
- Owner Info
- Имя устройства
- Часы (UTC)
- Широта
- Долгота
- Приватный ключ
- Информация о владельце
- Пароль администратора и пароль гостя (подраздел «Доступ»)
- Интервал анонсов (минуты)
- Интервал флуда (часы)
- Лимит флуда
- Режим хэша пути
Примечания:
- `Latitude` и `Longitude` по умолчанию равны `0.0` как заполнители
- «Широта» и «Долгота» по умолчанию равны `0.0` как заполнители
- изменение приватного ключа требует перезагрузки для применения
- кнопки обновления загружают текущее значение из репитера
- кнопки сохранения немедленно отправляют соответствующую команду CLI
## Настройки радио и регионы
## Настройки радио, регионы и чёрный список
Раздел `Radio Settings` включает селектор community-пресета радио, режим path hash и работу с деревом регионов узла. Список регионов строится из уже разрешённых на узле регионов; нажатие `Save` разрешает выбранный регион вместе с его базовым регионом и сохраняет карту регионов командой `region save`.
Группа «Настройки радио» в карточке «Настройки репитера» включает селектор пресета радио и режим хэша пути; кнопка «Сохранить» рядом с пресетом отправляет `set radio` с параметрами выбранного пресета, а режим хэша пути сохраняется командой `set path.hash.mode`.
Карточка «Регионы» показывает текущее дерево регионов узла. «Применить (добавить)» разрешает выбранный регион вместе с его базовым регионом и сохраняет карту командой `region save`, а «Заменить все» переписывает карту выбранным набором. Удаление региона из списка выполняется тут же, в разделе текущих регионов.
Пресеты радио и коды IATA, дерево регионов и чёрные списки панель берёт с нашего сервера, а не со сторонних API:
- `https://meshinfo.ru/flasher/meshcore-data/conf.json` — пресеты радио и коды IATA (38 записей);
- `https://meshinfo.ru/flasher/meshcore-data/regions.json` — дерево регионов;
- `https://meshinfo.ru/flasher/meshcore-data/blacklist/<КОД>.json` — чёрный список по коду IATA.
Поле URL в разделах «Загрузить из сети» можно заменить своим адресом. Реальные данные чёрного списка сейчас заполнены только для `MOW`, для остальных 37 кодов в репозитории лежат пустые шаблоны. Исходники этих файлов — [`posadmesh-tools/meshcore-data/`](https://git.meshinfo.ru/shade/MeshCore-Posadmesh/src/branch/main/posadmesh-tools/meshcore-data); для каталога `/flasher/meshcore-data/` на сервере включён CORS (`Access-Control-Allow-Origin: *`), поэтому браузер может загрузить их напрямую.
Чёрный список на экране «Общие» состоит из двух частей — «Чёрный список путей» (hex-префиксы хэша узла) и «Чёрный список каналов» (hex-префикс или `#ИмяКанала`); обе загружаются кнопкой «Загрузить из сети» по указанному URL.
## Информация
Этот раздел показывает:
Карточка «Информация» показывает:
- `Version`: версия прошивки с датой сборки
- `Client Version`: строка версии MQTT-клиента
- `Public Key`
- «Оборудование»: имя платы
- «Прошивка»: версия прошивки с датой сборки
- «Публичный ключ»
## Режим Ghost Node
Режим Ghost Node — это удобное управление на странице `/app` для репитера, который должен оставаться в Wi-Fi и MQTT, но не должен активно вести себя как ещё один репитер поблизости.
Режим Ghost Node (в панели подписан как «Режим призрак») — это удобное управление на экране «Общие» для репитера, который должен оставаться в Wi-Fi и MQTT, но не должен активно вести себя как ещё один репитер поблизости.
Типичный сценарий использования:
@@ -250,45 +291,46 @@
В этот раздел входят:
- `mqtt.iata`: выбирается из подготовленного списка восточного побережья/юго-востока.
- `mqtt.owner`: публичный ключ владельца.
- `mqtt.email`: контактный email владельца.
- Брокеры MQTT: переключатель **MeshCoreTel RU** и переключатель **Custom broker**, каждый включает или отключает свой брокер. Одновременно можно включить не более двух брокеров.
- поля custom MQTT `host:port`, транспорт TCP/WSS, имя пользователя и пароль.
- «MQTT IATA»: код выбирается из подготовленного списка (38 записей).
- «Владелец (MQTT)»: публичный ключ владельца.
- «Почта (MQTT)»: контактный email владельца.
- «MQTT-серверы»: переключатель **MeshCoreTel RU** и переключатель **Свой брокер**, каждый включает или отключает свой брокер. Одновременно можно включить не более двух брокеров.
- поля своего брокера: «Хост:порт», «Транспорт» (tcp или wss), «Логин» и «Пароль».
`UNSET - To be configured` — значение по умолчанию для новых установок MQTT-репитера, пока не появится реальное сохранённое значение.
Примечания:
- когда `mqtt.iata` имеет значение `UNSET`, панель показывает в верхней части баннер с напоминанием задать его в MQTT Settings
- когда `mqtt.iata` имеет значение `UNSET`, панель показывает в верхней части баннер с напоминанием задать его в настройках MQTT
- пока `mqtt.iata` имеет значение `UNSET`, включённые брокеры MQTT не пытаются подключиться
- текущие состояния серверов MQTT загружаются при открытии страницы
- вы можете включать или отключать каждый сервер MQTT из этой панели
- custom MQTT использует настроенные имя пользователя и пароль, а не аутентификацию JWT
- custom MQTT по умолчанию использует TCP; выберите WSS для MQTT через защищённые WebSockets с фиксированным websocket-путём `/mqtt` и корневым CA-бандлом x509 из ESP-IDF
- свой брокер использует настроенные имя пользователя и пароль, а не аутентификацию JWT
- свой брокер по умолчанию использует TCP; выберите WSS для MQTT через защищённые WebSockets с фиксированным websocket-путём `/mqtt` и корневым CA-бандлом x509 из ESP-IDF
- отключение подключённого сервера MQTT публикует retained-статус offline до отключения клиента
- изменение `mqtt.iata` с настроенного значения публикует retained-статус offline в старый топик статуса, перезапускает подключённых клиентов брокера и переподключается по новому пути топика
- одновременно можно включить не более двух брокеров MQTT
## Обзор `/stats`
Страница статистики загружается отдельно от `/app` и предназначена для того, чтобы основная страница администратора оставалась легче.
Экран статистики загружается отдельно от «Общих» и предназначен для того, чтобы основная страница администратора оставалась легче.
Страница `/stats` сейчас показывает:
Экран `/stats` сейчас показывает:
- `Services`: MQTT, web, архив, число соседей и, когда смонтирована, ёмкость карты и архива
- необязательная сводная карточка `Environment` на всю ширину на платах, которые передают телеметрию GPS или параметров окружающей среды
- `Trends`: батарея, свободный heap, активность пакетов, сигнал, уровень шума и, когда GPS активен, спутники
- `Neighbours`: текущая таблица соседей с ID, SNR, давностью последнего приёма и давностью advert
- `Events`: текущие события загрузки/сессии
- «Сервисы»: MQTT, web, архив, число соседей и, когда смонтирована, ёмкость карты и архива
- необязательная сводная карточка «Окружение» на всю ширину на платах, которые передают телеметрию GPS или параметров окружающей среды
- «Графики» (бывшие `Trends`): батарея, свободный heap, активность пакетов, сигнал, уровень шума и, когда GPS активен, спутники
- «События»: текущие события загрузки/сессии
Таблица соседей и карта вынесены на отдельный экран «Соседи».
Запланированные ротации MQTT JWT показываются как события `mqtt_token_refreshed` вместо короткой пары `mqtt_disconnected` / `mqtt_connected`.
Для плат, которые предоставляют дополнительную телеметрию, необязательная сводная карточка `Environment` может показывать текущие значения, такие как состояние активности/fix GPS, широта, долгота, высота по GPS, напряжение, температура датчика, влажность, барометр, высота по давлению и температура MCU.
Для плат, которые предоставляют дополнительную телеметрию, необязательная сводная карточка «Окружение» может показывать текущие значения, такие как состояние активности/fix GPS, широта, долгота, высота по GPS, напряжение, температура датчика, влажность, барометр, высота по давлению и температура MCU.
Метрики без текущего значения скрываются, а не отображаются строками-заполнителями, поэтому карточки различаются в зависимости от платы и текущего состояния датчиков.
Индикатор батареи `Core` предпочитает процент батареи, сообщаемый платой, когда таргет его предоставляет. На таких платах детализация индикатора показывает только текущее значение напряжения батареи в милливольтах. В противном случае он масштабирует отображаемый процент из настроенного для платы диапазона напряжения батареи и показывает этот диапазон в тексте детализации, а не предполагает фиксированную однобаночную сборку `3000-4200 mV`.
Индикатор батареи в карточке «Ядро» предпочитает процент батареи, сообщаемый платой, когда таргет его предоставляет. На таких платах детализация индикатора показывает только текущее значение напряжения батареи в милливольтах. В противном случае он масштабирует отображаемый процент из настроенного для платы диапазона напряжения батареи и показывает этот диапазон в тексте детализации, а не предполагает фиксированную однобаночную сборку `3000-4200 mV`.
Графики трендов загружаются последовательно, а не одним большим payload:
@@ -341,36 +383,30 @@
- кнопки быстрых команд сворачиваются в двухколоночную раскладку
- верхняя навигация и группы действий остаются компактными и удобными для касания
- строки ввода остаются пригодными для взаимодействия касанием
- карточки трендов при необходимости перестраиваются в одноколоночные секции
- карточки графиков при необходимости перестраиваются в одноколоночные секции
## Дополнительные задачи
### Start OTA
### Обновление прошивки на экране «Прошивка»
1. Нажмите `Start OTA`.
2. Подтвердите действие.
3. Панель запускает OTA, ждёт, пока HTTP-слушатель OTA займёт порт `80`, а затем открывает возвращённый URL `http://.../update`.
4. Локальный HTTP-слушатель перенаправления на порту `80` освобождается, чтобы OTA мог занять этот порт.
5. Продолжите по обычному сценарию OTA.
1. Откройте экран «Прошивка».
2. Выберите файл прошивки `.bin`.
3. Нажмите «Загрузить» и подтвердите: панель предупредит, что после прошивки устройство перезагрузится.
4. Дождитесь прогресса загрузки; после успешной прошивки панель перезагружает страницу и возвращает на экран входа.
Если репитер уже подключён к Wi-Fi, OTA использует существующий адрес в локальной сети. Если Wi-Fi не подключён, репитер запускает точку доступа `MeshCore-OTA` и возвращает вместо этого адрес OTA.
Если старый слушатель перенаправления не полностью освободил порт `80`, слушатель OTA повторяет попытки примерно до 30 секунд, после чего сдаётся.
Если загрузка не удалась, панель покажет текст ошибки и снова разрешит выбрать файл.
Если более старая сборка отправляет вас на странное перенаправление после `start ota`, используйте веб-кнопку `Start OTA` для запуска обновления. В актуальных сборках эта проблема с перенаправлением исправлена.
### Сертификат панели
### Purge SD
`Purge SD` отображается красным встроенным текстом рядом с `Archive Used` в карточке Services на `/stats`. Запрашивает подтверждение, а затем выполняет аутентифицированную команду `purge sd`.
Это удаляет файлы и каталоги из архива на смонтированной SD-карте, после чего заново создаёт пустой каталог архива `/stats` для продолжения записи во время работы. Это не стирает внутреннюю файловую систему репитера, идентичность, prefs, регионы, настройки радио или настройки MQTT.
В той же карточке «Обновление прошивки» загружается TLS-сертификат панели: файл PEM с цепочкой сертификатов и закрытым ключом RSA, не больше 12 КБ. После установки панель перезапускается с новым сертификатом. Кнопка «Встроенный» возвращает встроенный самоподписанный сертификат, и браузер снова предупредит о нём.
### Использовать историческую статистику
1. При необходимости включите статистику командой `set web.stats on`.
2. Откройте `/stats` из верхней навигации.
3. Просмотрите `Services` для состояния архива и работы.
4. Просмотрите `Trends` для недавней истории графиков.
5. Используйте `Refresh`, чтобы перезагрузить страницу статистики.
2. Откройте экран «Статистика» кнопкой в верхней панели (маршрут `/stats`).
3. Просмотрите карточку «Сервисы» для состояния архива и работы.
4. Просмотрите «Графики» для недавней истории.
5. Используйте «Обновить», чтобы перезагрузить страницу статистики.
## Диагностика
@@ -412,7 +448,7 @@
Попробуйте:
- обновить вкладку браузера
- использовать `Refresh` на `/stats`
- использовать «Обновить» на экране статистики или соседей
- выйти и войти снова
- проверить стабильность Wi-Fi с помощью `get wifi.status`
+153
View File
@@ -1021,3 +1021,156 @@ releases:
area: release
text: "Прошивальщик в браузере (<https://meshinfo.ru/flasher/>) получил прошивки этого релиза: файлы разбиты по версиям, свежая версия показывается выше предыдущей."
breaking_changes: []
- track: repeater-mqtt-bridge
version: "2026.10.2"
tag: "repeater-mqtt-bridge-v2026.10.2"
date: "2026-10-22"
previous_version: "2026.10.1"
summary: "Веб-панель репитера разделена на экраны «Общие», «Статистика», «CLI», «Прошивка» и «Соседи» и переведена на русский. На экране «Соседи» появились таблица с поиском и карта OSM, вверху страницы — индикатор батареи. Внешние данные (пресеты радио, регионы, чёрные списки) перенесены на meshinfo.ru, страницы панели сжимаются gzip. Добавлены «тюрьма анонсов», бюджет каналов и команды соседей, на экране состояния дисплея — иконка батареи."
changes:
- type: added
area: web
text: "Панель разделена на экраны с переключением на клиенте: «Общие» (`/app`), «Статистика» (`/stats`, отдельный маршрут), «CLI», «Прошивка» и «Соседи». Активна ровно одна кнопка, на `/stats` — «Статистика»; группа «Анонс / Обновить / Перезагрузить / тема / Выйти» прижата к правому краю."
- type: changed
area: web
text: "На экранах «CLI», «Прошивка» и «Соседи» скрыты кнопки «Анонс» и «Обновить»; на «Соседях» «Обновить» оставлен и перечитывает таблицу и карту."
- type: changed
area: web
text: "Интерфейс панели переведён на русский: заголовки экранов, разделов и кнопок, `Trends` стал «Графики». Технические сокращения (CLI, MQTT, IATA, RSSI, SNR, IP, SSID, hex, dB, UTC, PEM, TLS, RSA) и названия сервисов `MeshCoreTel` / `MeshCoreTel RU` не переводятся."
- type: added
area: web
text: "Экран «Соседи»: таблица (Имя, ID, SNR, Широта/Долгота, Слышно, Анонс), кнопки «Найти соседей» (`discover.neighbors`) и «Очистить» (`neighbor.clear`), строка статуса «Команда отправлена: … (ответ смотрите в журнале CLI)». Имя и координаты соседа берутся из его анонса; у соседа без них — прочерк вместо имени и `0.0000 / 0.0000`."
- type: added
area: web
text: "Карта OSM на экране «Соседи»: тайлы `tile.openstreetmap.org` обычными `<img>` и SVG-слой поверх. Центр всегда на координатах нашего узла, линии к соседям с координатами окрашены и утолщены по SNR, подписи «имя · dB», зум кнопками `+` / `−` / `⌂` и колесом, перетаскивание мышью. Соседи без координат или с нулями на карту не попадают."
- type: added
area: web
text: "Индикатор батареи вверху страницы: иконка с заполнением по проценту, процент и напряжение в милливольтах. Обновляется раз в минуту и при загрузке страницы, на экранах «CLI», «Прошивка» и «Соседи» скрыт."
- type: changed
area: web
text: "Страницы панели сжимаются gzip при сборке (`arch/esp32/extra_scripts/gzip_web_panel.py`) и отдаются с `Content-Encoding: gzip`; пост-проверка `check_app_size.py` роняет сборку, если образ больше своего app-раздела."
- type: added
area: web
text: "Поле ввода CLI-команды получило подсказки (`datalist`) по типовым командам репитера."
- type: changed
area: web
text: "Внешние данные больше не берутся с `api.vbart.ru` и `meshcore.hackru.ru`: пресеты радио и коды IATA (38 записей) — `https://meshinfo.ru/flasher/meshcore-data/conf.json`, дерево регионов — `https://meshinfo.ru/flasher/meshcore-data/regions.json`, чёрные списки по IATA — `https://meshinfo.ru/flasher/meshcore-data/blacklist/<КОД>.json`. Реальные данные есть только для `MOW`, остальные 37 кодов — пустые шаблоны. Для каталога настроен CORS `Access-Control-Allow-Origin: *`."
- type: added
area: cli
text: "`set advert.jail on|off` — «тюрьма анонсов» (AdvertJail): слишком частые анонсы от одного отправителя не пересылаются. По умолчанию включена."
- type: added
area: cli
text: "`set channel.budget <0..1000>` — бюджет каналов (ChannelBudget): лимит flood-пакетов группового канала за 10 минут на каждый канал. По умолчанию выключен (`0`)."
- type: added
area: cli
text: "`neighbor.clear` очищает таблицу соседей, `discover.neighbors` запускает поиск соседей; `neighbor.remove <hex>` остаётся для удаления одного соседа."
- type: added
area: ui
text: "Экран состояния дисплея: справа в верхней строке — графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла обрезается по доступной ширине с `..`; если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда. Отдельный экран `Battery` в меню не изменился."
- type: docs
area: docs
text: "Обновлены `README.md`, страницы «Веб-панель» и «Пользовательские команды CLI», а также `RELEASE.md` под новую версию."
breaking_changes: []
- track: repeater-mqtt-espnow
version: "2026.10.2"
tag: "repeater-mqtt-espnow-v2026.10.2"
date: "2026-10-22"
previous_version: "2026.10.1"
summary: "Веб-панель репитера разделена на экраны «Общие», «Статистика», «CLI», «Прошивка» и «Соседи» и переведена на русский. На экране «Соседи» появились таблица с поиском и карта OSM, вверху страницы — индикатор батареи. Внешние данные (пресеты радио, регионы, чёрные списки) перенесены на meshinfo.ru, страницы панели сжимаются gzip. Добавлены «тюрьма анонсов», бюджет каналов и команды соседей, на экране состояния дисплея — иконка батареи."
changes:
- type: added
area: web
text: "Панель разделена на экраны с переключением на клиенте: «Общие» (`/app`), «Статистика» (`/stats`, отдельный маршрут), «CLI», «Прошивка» и «Соседи». Активна ровно одна кнопка, на `/stats` — «Статистика»; группа «Анонс / Обновить / Перезагрузить / тема / Выйти» прижата к правому краю."
- type: changed
area: web
text: "На экранах «CLI», «Прошивка» и «Соседи» скрыты кнопки «Анонс» и «Обновить»; на «Соседях» «Обновить» оставлен и перечитывает таблицу и карту."
- type: changed
area: web
text: "Интерфейс панели переведён на русский: заголовки экранов, разделов и кнопок, `Trends` стал «Графики». Технические сокращения (CLI, MQTT, IATA, RSSI, SNR, IP, SSID, hex, dB, UTC, PEM, TLS, RSA) и названия сервисов `MeshCoreTel` / `MeshCoreTel RU` не переводятся."
- type: added
area: web
text: "Экран «Соседи»: таблица (Имя, ID, SNR, Широта/Долгота, Слышно, Анонс), кнопки «Найти соседей» (`discover.neighbors`) и «Очистить» (`neighbor.clear`), строка статуса «Команда отправлена: … (ответ смотрите в журнале CLI)». Имя и координаты соседа берутся из его анонса; у соседа без них — прочерк вместо имени и `0.0000 / 0.0000`."
- type: added
area: web
text: "Карта OSM на экране «Соседи»: тайлы `tile.openstreetmap.org` обычными `<img>` и SVG-слой поверх. Центр всегда на координатах нашего узла, линии к соседям с координатами окрашены и утолщены по SNR, подписи «имя · dB», зум кнопками `+` / `−` / `⌂` и колесом, перетаскивание мышью. Соседи без координат или с нулями на карту не попадают."
- type: added
area: web
text: "Индикатор батареи вверху страницы: иконка с заполнением по проценту, процент и напряжение в милливольтах. Обновляется раз в минуту и при загрузке страницы, на экранах «CLI», «Прошивка» и «Соседи» скрыт."
- type: changed
area: web
text: "Страницы панели сжимаются gzip при сборке (`arch/esp32/extra_scripts/gzip_web_panel.py`) и отдаются с `Content-Encoding: gzip`; пост-проверка `check_app_size.py` роняет сборку, если образ больше своего app-раздела."
- type: added
area: web
text: "Поле ввода CLI-команды получило подсказки (`datalist`) по типовым командам репитера."
- type: changed
area: web
text: "Внешние данные больше не берутся с `api.vbart.ru` и `meshcore.hackru.ru`: пресеты радио и коды IATA (38 записей) — `https://meshinfo.ru/flasher/meshcore-data/conf.json`, дерево регионов — `https://meshinfo.ru/flasher/meshcore-data/regions.json`, чёрные списки по IATA — `https://meshinfo.ru/flasher/meshcore-data/blacklist/<КОД>.json`. Реальные данные есть только для `MOW`, остальные 37 кодов — пустые шаблоны. Для каталога настроен CORS `Access-Control-Allow-Origin: *`."
- type: added
area: cli
text: "`set advert.jail on|off` — «тюрьма анонсов» (AdvertJail): слишком частые анонсы от одного отправителя не пересылаются. По умолчанию включена."
- type: added
area: cli
text: "`set channel.budget <0..1000>` — бюджет каналов (ChannelBudget): лимит flood-пакетов группового канала за 10 минут на каждый канал. По умолчанию выключен (`0`)."
- type: added
area: cli
text: "`neighbor.clear` очищает таблицу соседей, `discover.neighbors` запускает поиск соседей; `neighbor.remove <hex>` остаётся для удаления одного соседа."
- type: added
area: ui
text: "Экран состояния дисплея: справа в верхней строке — графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла обрезается по доступной ширине с `..`; если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда. Отдельный экран `Battery` в меню не изменился."
- type: docs
area: docs
text: "Обновлены `README.md`, страницы «Веб-панель» и «Пользовательские команды CLI», а также `RELEASE.md` под новую версию."
breaking_changes: []
- track: repeater-mqtt
version: "2026.10.2"
tag: "repeater-mqtt-v2026.10.2"
date: "2026-10-22"
previous_version: "2026.10.1"
summary: "Веб-панель репитера разделена на экраны «Общие», «Статистика», «CLI», «Прошивка» и «Соседи» и переведена на русский. На экране «Соседи» появились таблица с поиском и карта OSM, вверху страницы — индикатор батареи. Внешние данные (пресеты радио, регионы, чёрные списки) перенесены на meshinfo.ru, страницы панели сжимаются gzip. Добавлены «тюрьма анонсов», бюджет каналов и команды соседей, на экране состояния дисплея — иконка батареи."
changes:
- type: added
area: web
text: "Панель разделена на экраны с переключением на клиенте: «Общие» (`/app`), «Статистика» (`/stats`, отдельный маршрут), «CLI», «Прошивка» и «Соседи». Активна ровно одна кнопка, на `/stats` — «Статистика»; группа «Анонс / Обновить / Перезагрузить / тема / Выйти» прижата к правому краю."
- type: changed
area: web
text: "На экранах «CLI», «Прошивка» и «Соседи» скрыты кнопки «Анонс» и «Обновить»; на «Соседях» «Обновить» оставлен и перечитывает таблицу и карту."
- type: changed
area: web
text: "Интерфейс панели переведён на русский: заголовки экранов, разделов и кнопок, `Trends` стал «Графики». Технические сокращения (CLI, MQTT, IATA, RSSI, SNR, IP, SSID, hex, dB, UTC, PEM, TLS, RSA) и названия сервисов `MeshCoreTel` / `MeshCoreTel RU` не переводятся."
- type: added
area: web
text: "Экран «Соседи»: таблица (Имя, ID, SNR, Широта/Долгота, Слышно, Анонс), кнопки «Найти соседей» (`discover.neighbors`) и «Очистить» (`neighbor.clear`), строка статуса «Команда отправлена: … (ответ смотрите в журнале CLI)». Имя и координаты соседа берутся из его анонса; у соседа без них — прочерк вместо имени и `0.0000 / 0.0000`."
- type: added
area: web
text: "Карта OSM на экране «Соседи»: тайлы `tile.openstreetmap.org` обычными `<img>` и SVG-слой поверх. Центр всегда на координатах нашего узла, линии к соседям с координатами окрашены и утолщены по SNR, подписи «имя · dB», зум кнопками `+` / `−` / `⌂` и колесом, перетаскивание мышью. Соседи без координат или с нулями на карту не попадают."
- type: added
area: web
text: "Индикатор батареи вверху страницы: иконка с заполнением по проценту, процент и напряжение в милливольтах. Обновляется раз в минуту и при загрузке страницы, на экранах «CLI», «Прошивка» и «Соседи» скрыт."
- type: changed
area: web
text: "Страницы панели сжимаются gzip при сборке (`arch/esp32/extra_scripts/gzip_web_panel.py`) и отдаются с `Content-Encoding: gzip`; пост-проверка `check_app_size.py` роняет сборку, если образ больше своего app-раздела."
- type: added
area: web
text: "Поле ввода CLI-команды получило подсказки (`datalist`) по типовым командам репитера."
- type: changed
area: web
text: "Внешние данные больше не берутся с `api.vbart.ru` и `meshcore.hackru.ru`: пресеты радио и коды IATA (38 записей) — `https://meshinfo.ru/flasher/meshcore-data/conf.json`, дерево регионов — `https://meshinfo.ru/flasher/meshcore-data/regions.json`, чёрные списки по IATA — `https://meshinfo.ru/flasher/meshcore-data/blacklist/<КОД>.json`. Реальные данные есть только для `MOW`, остальные 37 кодов — пустые шаблоны. Для каталога настроен CORS `Access-Control-Allow-Origin: *`."
- type: added
area: cli
text: "`set advert.jail on|off` — «тюрьма анонсов» (AdvertJail): слишком частые анонсы от одного отправителя не пересылаются. По умолчанию включена."
- type: added
area: cli
text: "`set channel.budget <0..1000>` — бюджет каналов (ChannelBudget): лимит flood-пакетов группового канала за 10 минут на каждый канал. По умолчанию выключен (`0`)."
- type: added
area: cli
text: "`neighbor.clear` очищает таблицу соседей, `discover.neighbors` запускает поиск соседей; `neighbor.remove <hex>` остаётся для удаления одного соседа."
- type: added
area: ui
text: "Экран состояния дисплея: справа в верхней строке — графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла обрезается по доступной ширине с `..`; если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда. Отдельный экран `Battery` в меню не изменился."
- type: docs
area: docs
text: "Обновлены `README.md`, страницы «Веб-панель» и «Пользовательские команды CLI», а также `RELEASE.md` под новую версию."
breaking_changes: []