diff --git a/README.md b/README.md
index 72688981..c47d9f7e 100644
--- a/README.md
+++ b/README.md
@@ -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` обычными `
`, поверх — 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 ` остаётся для удаления одного соседа).
+
+**Дисплей репитера**
+
+- в верхней строке главного экрана (`renderStatus`) справа появилась графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`); имя узла обрезается по доступной ширине с `..`, а если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда; отдельный экран `Battery` в меню не изменился.
+
+**Релиз**
+
+- `v2026.10.2` для треков `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge`.
+
+### 2026.10.0
**Ребрендинг в PosadMesh**
diff --git a/RELEASE.md b/RELEASE.md
index 8fbb99bc..9d789a4a 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -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= 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= 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-`
-- `repeater-mqtt-espnow`: `v1.15.0-posadmesh-v2026.5.1-`
-- `repeater-mqtt-bridge`: `v1.15.0-posadmesh-v2026.7.0-`
-- `repeater-mqtt`: `v1.15.0-posadmesh-v2026.5.1-`
+- `repeater-mqtt-espnow`: `v1.18.0-posadmesh-v2026.10.2-`
+- `repeater-mqtt-bridge`: `v1.18.0-posadmesh-v2026.10.2-`
+- `repeater-mqtt`: `v1.18.0-posadmesh-v2026.10.2-`
Пример:
-- тег: `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` перестают учитываться — вентилятор пойдёт по логике платы.
diff --git a/posadmesh-docs/custom-cli.md b/posadmesh-docs/custom-cli.md
index edb153af..79710d21 100644
--- a/posadmesh-docs/custom-cli.md
+++ b/posadmesh-docs/custom-cli.md
@@ -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-префиксу публичного ключа; при ошибке разбора ключа отвечает `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-байтовому хэшу канала: канал может отправить до `` пакетов подряд, дальше пакеты идут не чаще одного за `600 / N` секунд. `0` выключает бюджет; значения вне диапазона обрезаются до `0..1000`. По умолчанию выключен (`0`). Ответ — `OK - channel budget is now OFF` или `OK - channel budget is now 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
diff --git a/posadmesh-docs/device-setup.md b/posadmesh-docs/device-setup.md
index 9bfc3807..bba8907d 100644
--- a/posadmesh-docs/device-setup.md
+++ b/posadmesh-docs/device-setup.md
@@ -20,6 +20,8 @@
| --- | --- | --- |
|  |  |  |
+В верхней строке экрана состояния справа показана графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла выводится слева и обрезается по доступной ширине с `..`; если имя вместе с напряжением не помещается, напряжение скрывается, а иконка батареи остаётся всегда. Отдельный пункт меню `Battery` по-прежнему показывает напряжение, процент, полоску и множитель ADC. На снимке экрана состояния выше иконки батареи ещё нет — он сделан в более ранней сборке.
+
## Что настраивается
Мастер меняет только то, что нужно для быстрого ввода узла в сеть:
diff --git a/posadmesh-docs/web-panel.md b/posadmesh-docs/web-panel.md
index 1341b667..73256d9e 100644
--- a/posadmesh-docs/web-panel.md
+++ b/posadmesh-docs/web-panel.md
@@ -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`, которые загружаются обычными `
`; поверх них рисуется 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`
diff --git a/release-notes.yml b/release-notes.yml
index 2460315e..78fce489 100644
--- a/release-notes.yml
+++ b/release-notes.yml
@@ -1021,3 +1021,156 @@ releases:
area: release
text: "Прошивальщик в браузере () получил прошивки этого релиза: файлы разбиты по версиям, свежая версия показывается выше предыдущей."
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` обычными `
` и 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 ` остаётся для удаления одного соседа."
+ - 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` обычными `
` и 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 ` остаётся для удаления одного соседа."
+ - 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` обычными `
` и 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 ` остаётся для удаления одного соседа."
+ - type: added
+ area: ui
+ text: "Экран состояния дисплея: справа в верхней строке — графическая иконка батареи с заполнением по проценту и напряжение (`4.01V`). Имя узла обрезается по доступной ширине с `..`; если вместе с вольтажом не помещается — вольтаж скрывается, иконка остаётся всегда. Отдельный экран `Battery` в меню не изменился."
+ - type: docs
+ area: docs
+ text: "Обновлены `README.md`, страницы «Веб-панель» и «Пользовательские команды CLI», а также `RELEASE.md` под новую версию."
+ breaking_changes: []