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 @@ | --- | --- | --- | | ![Экран состояния](_assets/wizard/01-status.png) | ![Меню Setup](_assets/wizard/02-menu-top.png) | ![Низ меню](_assets/wizard/03-menu-bottom.png) | +В верхней строке экрана состояния справа показана графическая иконка батареи с заполнением по проценту и напряжение (`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: []