From 26b724c0f08d722cd9f531e861fde31a8dcce663 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 11 Oct 2026 17:20:05 +0300 Subject: [PATCH] feat: manual Gitea build workflow, release publishing, README and docs update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлен ручной workflow Gitea Actions (.gitea/workflows/build-mqtt-firmwares.yml): сборка MQTT-прошивок на сервере и публикация релиза - добавлен posadmesh-tools/publish-gitea-release.sh для выгрузки собранных файлов в релиз Gitea (идемпотентно, фильтр по треку) - README: происхождение проекта переписано (форк EastMesh, доработка энтузиастов из Сергиева Посада, ориентация на meshcoretel.ru), добавлены раздел «Отличия от upstream MeshCore» и журнал «Изменения в проекте» - убраны упоминания Австралии, ссылки на eastmesh.au и региональные материалы; руководство по прошивке переведено на файлы релизов и esptool.py - posadmesh-build.sh: вывод PlatformIO очищается от \r — на Windows групповые команды сборки не находили ни одной цели; companion-команды удалены, добавлены build-mqtt-firmwares и list-mqtt - release-notes.yml: треки repeater-mqtt*, запись 2026.10.0 дополнена удалением companion и исправлением сборки, companion-wifi помечен как снятый с выпуска - AGENTS.md: правило дописывать изменения в README - .gitignore: .pio-home --- .gitea/workflows/build-mqtt-firmwares.yml | 126 ++++++++++++++ .../feature-support-request.yml | 2 +- .../setup-build-environment/action.yml | 22 ++- .gitignore | 1 + AGENTS.md | 66 ++++---- README.md | 152 ++++++++++------- RELEASE.md | 86 ++++++---- posadmesh-build.sh | 131 ++++++--------- posadmesh-docs/api.md | 4 +- posadmesh-docs/boards.md | 71 ++------ posadmesh-docs/custom-cli.md | 119 ++------------ posadmesh-docs/index.md | 37 ++--- posadmesh-docs/local-builds.md | 154 ++++++------------ posadmesh-docs/migration.md | 2 +- posadmesh-docs/releases.md | 114 +++++-------- posadmesh-docs/web-panel.md | 14 +- posadmesh-tools/publish-gitea-release.sh | 149 +++++++++++++++++ posadmesh-tools/web-heap-check.sh | 2 +- release-notes.yml | 99 ++++++----- 19 files changed, 735 insertions(+), 616 deletions(-) create mode 100644 .gitea/workflows/build-mqtt-firmwares.yml create mode 100644 posadmesh-tools/publish-gitea-release.sh diff --git a/.gitea/workflows/build-mqtt-firmwares.yml b/.gitea/workflows/build-mqtt-firmwares.yml new file mode 100644 index 00000000..34837b1e --- /dev/null +++ b/.gitea/workflows/build-mqtt-firmwares.yml @@ -0,0 +1,126 @@ +# Ручная сборка MQTT-прошивок PosadMesh на сервере (Gitea Actions). +# +# Требования к раннеру (act_runner): +# - Linux, Docker, доступ в интернет; +# - python3 >= 3.11, git, curl; +# - свободного места >= 20 ГБ: PlatformIO скачает тулчейны ESP32 (~1 ГБ) при первой сборке; +# - кэш ~/.platformio между запусками сильно ускоряет сборку (шаг cache ниже). +# +# Запуск: Actions -> "Build MQTT firmwares" -> Run workflow. +# Полная сборка всех 109 MQTT-таргетов идёт долго — удобнее запускать по группам +# (uplink / espnow / bridge) или по одному таргету (group=single). +# +# Публикация в релиз Gitea требует секрета репозитория GITEA_TOKEN +# (personal access token с правом write:repository). + +name: Build MQTT firmwares + +on: + workflow_dispatch: + inputs: + firmware_version: + description: "Версия upstream MeshCore для метаданных (например v1.17.1)" + required: true + default: "v1.17.1" + posadmesh_version: + description: "Версия релиза PosadMesh (например v2026.10.0)" + required: true + default: "v2026.10.0" + group: + description: "Что собирать: all | uplink | espnow | bridge | single" + required: true + default: "all" + target: + description: "Имя окружения PlatformIO для group=single (например heltec_v4_repeater_mqtt)" + required: false + default: "" + publish: + description: "Создать релиз в Gitea и загрузить файлы: true | false" + required: true + default: "false" + tag: + description: "Тег релиза при publish=true (например repeater-mqtt-v2026.10.0)" + required: false + default: "" + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 360 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install uv + run: | + python3 -m pip install --upgrade pip + python3 -m pip install uv + + - name: Cache PlatformIO + uses: actions/cache@v3 + with: + path: ~/.platformio + key: platformio-${{ hashFiles('platformio.ini', 'variants/**/platformio.ini') }} + restore-keys: platformio- + + - name: Build MQTT firmwares + env: + FIRMWARE_VERSION: ${{ github.event.inputs.firmware_version }} + POSADMESH_VERSION: ${{ github.event.inputs.posadmesh_version }} + GROUP: ${{ github.event.inputs.group }} + TARGET: ${{ github.event.inputs.target }} + run: | + set -euo pipefail + echo "FIRMWARE_VERSION=$FIRMWARE_VERSION POSADMESH_VERSION=$POSADMESH_VERSION GROUP=$GROUP TARGET=$TARGET" + case "$GROUP" in + all) bash posadmesh-build.sh build-mqtt-firmwares ;; + uplink) bash posadmesh-build.sh build-repeater-mqtt-firmwares ;; + espnow) bash posadmesh-build.sh build-repeater-mqtt-espnow-firmwares ;; + bridge) bash posadmesh-build.sh build-repeater-mqtt-bridge-firmwares ;; + single) + if [ -z "$TARGET" ]; then + echo "group=single requires the target input" >&2 + exit 1 + fi + bash posadmesh-build.sh build-firmware "$TARGET" + ;; + *) + echo "unknown group: $GROUP (expected all|uplink|espnow|bridge|single)" >&2 + exit 1 + ;; + esac + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: mqtt-firmwares-${{ github.event.inputs.group }} + path: out + if-no-files-found: error + + - name: Publish Gitea release + if: ${{ github.event.inputs.publish == 'true' }} + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_URL: ${{ github.server_url }} + TAG: ${{ github.event.inputs.tag }} + GROUP: ${{ github.event.inputs.group }} + run: | + set -euo pipefail + if [ -z "$TAG" ]; then + echo "publish=true requires the tag input" >&2 + exit 1 + fi + if [ -z "${GITEA_TOKEN:-}" ]; then + echo "secret GITEA_TOKEN is not configured" >&2 + exit 1 + fi + case "$GROUP" in + uplink) export ASSET_GLOB='*_repeater_mqtt-v*' ;; + espnow) export ASSET_GLOB='*_repeater_mqtt_espnow-v*' ;; + bridge) export ASSET_GLOB='*_repeater_mqtt_bridge-v*' ;; + *) unset ASSET_GLOB || true ;; + esac + bash posadmesh-tools/publish-gitea-release.sh "$TAG" out "$TAG" diff --git a/.github/ISSUE_TEMPLATE/feature-support-request.yml b/.github/ISSUE_TEMPLATE/feature-support-request.yml index e0008cc5..70435798 100644 --- a/.github/ISSUE_TEMPLATE/feature-support-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-support-request.yml @@ -32,7 +32,7 @@ body: attributes: label: Firmware Target description: Firmware environment or binary name, if known. - placeholder: e.g. Heltec_v3_repeater_observer + placeholder: e.g. Heltec_v3_repeater_mqtt validations: required: false diff --git a/.github/actions/setup-build-environment/action.yml b/.github/actions/setup-build-environment/action.yml index 0ef576f5..ca5c3d04 100644 --- a/.github/actions/setup-build-environment/action.yml +++ b/.github/actions/setup-build-environment/action.yml @@ -41,19 +41,19 @@ runs: echo "$GITHUB_WORKSPACE/.venv/bin" >> "$GITHUB_PATH" # Active release tag formats: - # companion-wifi-v1.15.0 # repeater-bridge-espnow-v1.15.0 - # observer-posadmesh-bridge-espnow-v2026.5.1 - # observer-posadmesh-bridge-mqtt-v2026.7.0 - # observer-posadmesh-v2026.5.1 + # repeater-mqtt-espnow-v2026.5.1 + # repeater-mqtt-bridge-v2026.7.0 + # repeater-mqtt-v2026.5.1 # with OFFICIAL_MESHCORE_VERSION=v1.15.0 configured as a GitHub variable. # # This exports: - # companion-wifi-v1.15.0 -> FIRMWARE_VERSION=v1.15.0, RELEASE_VERSION=v1.15.0 # repeater-bridge-espnow-v1.15.0 -> FIRMWARE_VERSION=v1.15.0, RELEASE_VERSION=v1.15.0 - # observer-posadmesh-bridge-espnow-v2026.5.1 -> FIRMWARE_VERSION=v1.15.0, POSADMESH_VERSION=v2026.5.1, + # repeater-mqtt-espnow-v2026.5.1 -> FIRMWARE_VERSION=v1.15.0, POSADMESH_VERSION=v2026.5.1, # RELEASE_VERSION=v1.15.0-posadmesh-v2026.5.1 - # observer-posadmesh-v2026.5.1 -> FIRMWARE_VERSION=v1.15.0, POSADMESH_VERSION=v2026.5.1, + # repeater-mqtt-bridge-v2026.7.0 -> FIRMWARE_VERSION=v1.15.0, POSADMESH_VERSION=v2026.7.0, + # RELEASE_VERSION=v1.15.0-posadmesh-v2026.7.0 + # repeater-mqtt-v2026.5.1 -> FIRMWARE_VERSION=v1.15.0, POSADMESH_VERSION=v2026.5.1, # RELEASE_VERSION=v1.15.0-posadmesh-v2026.5.1 - name: Extract Version Info shell: bash @@ -74,26 +74,24 @@ runs: POSADMESH_VERSION="" FIRMWARE_VERSION="$STATIC_OFFICIAL_VERSION" - if [[ "$GIT_TAG_NAME" =~ ^observer-posadmesh-(v[[:alnum:]._-]+)$ ]]; then + if [[ "$GIT_TAG_NAME" =~ ^repeater-mqtt-(v[[:alnum:]._-]+)$ ]]; then if [[ -z "$STATIC_OFFICIAL_VERSION" ]]; then echo "OFFICIAL_MESHCORE_VERSION must be set for PosadMesh release tags" >&2 exit 1 fi POSADMESH_VERSION="${BASH_REMATCH[1]}" - elif [[ "$GIT_TAG_NAME" =~ ^observer-posadmesh-bridge-espnow-(v[[:alnum:]._-]+)$ ]]; then + elif [[ "$GIT_TAG_NAME" =~ ^repeater-mqtt-espnow-(v[[:alnum:]._-]+)$ ]]; then if [[ -z "$STATIC_OFFICIAL_VERSION" ]]; then echo "OFFICIAL_MESHCORE_VERSION must be set for PosadMesh release tags" >&2 exit 1 fi POSADMESH_VERSION="${BASH_REMATCH[1]}" - elif [[ "$GIT_TAG_NAME" =~ ^observer-posadmesh-bridge-mqtt-(v[[:alnum:]._-]+)$ ]]; then + elif [[ "$GIT_TAG_NAME" =~ ^repeater-mqtt-bridge-(v[[:alnum:]._-]+)$ ]]; then if [[ -z "$STATIC_OFFICIAL_VERSION" ]]; then echo "OFFICIAL_MESHCORE_VERSION must be set for PosadMesh release tags" >&2 exit 1 fi POSADMESH_VERSION="${BASH_REMATCH[1]}" - elif [[ "$GIT_TAG_NAME" =~ ^companion-wifi-(v[[:alnum:]._-]+)$ ]]; then - FIRMWARE_VERSION="${BASH_REMATCH[1]}" elif [[ "$GIT_TAG_NAME" =~ ^repeater-bridge-espnow-(v[[:alnum:]._-]+)$ ]]; then FIRMWARE_VERSION="${BASH_REMATCH[1]}" else diff --git a/.gitignore b/.gitignore index d76ee1a0..ff0fd355 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .direnv .pio +.pio-home .vscode/.browse.c_cpp.db* .vscode/c_cpp_properties.json .vscode/launch.json diff --git a/AGENTS.md b/AGENTS.md index 9321d676..801d2b63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,8 +7,7 @@ **По умолчанию:** сохраняем поведение upstream. Изменяем код только для чётко ограниченных возможностей PosadMesh: -- `*_repeater_observer` -- `*_companion_radio_wifi` +- `*_repeater_mqtt` - MQTT-аплинк/брокер - веб-панель репитера - документация, релизы, автоматизация @@ -87,10 +86,10 @@ bash posadmesh-build.sh list Собрать один таргет: ```bash -uv run pio run -e heltec_v4_repeater_observer -uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_observer -uv run pio run -e heltec_v4_companion_radio_wifi -uv run pio run -e T_Beam_S3_Supreme_SX1262_companion_radio_wifi +uv run pio run -e heltec_v4_repeater_mqtt +uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt +uv run pio run -e heltec_v4_repeater_mqtt_espnow +uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt_bridge ``` Сборка с релизными метаданными: @@ -98,15 +97,15 @@ uv run pio run -e T_Beam_S3_Supreme_SX1262_companion_radio_wifi ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer -bash posadmesh-build.sh build-firmware T_Beam_S3_Supreme_SX1262_repeater_observer +bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt +bash posadmesh-build.sh build-firmware T_Beam_S3_Supreme_SX1262_repeater_mqtt ``` Прошить таргет: ```bash -uv run pio run -e heltec_v4_repeater_observer -t upload --upload-port /dev/tty.usbmodemXXXX -uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_observer -t upload --upload-port /dev/tty.usbmodemXXXX +uv run pio run -e heltec_v4_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX +uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX ``` ## Ключевые файлы @@ -123,14 +122,22 @@ uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_observer -t upload --upload- ## Принадлежность workflow -Репозиторий живёт на . Собственные workflow GitHub Actions (`posadmesh-*.yml`) удалены при переезде: релизы собираются локально через `posadmesh-build.sh`, теги и релизы создаются вручную в веб-интерфейсе git.meshinfo.ru. +Репозиторий живёт на . -Workflow upstream MeshCore остаются под исходными именами файлов ради чистоты слияний. Не адаптируйте их под поведение PosadMesh; держите их близко к upstream. Они не используются для релизов PosadMesh. +Собственные workflow: + +- `.gitea/workflows/build-mqtt-firmwares.yml` — ручная сборка MQTT-прошивок на сервере Gitea Actions (`workflow_dispatch`): собирает группу или один таргет, умеет создавать релиз Gitea и загружать в него файлы. Публикация использует секрет репозитория `GITEA_TOKEN`. + +Кроме workflow прошивки собираются локально через `posadmesh-build.sh`, а теги и релизы создаются в веб-интерфейсе git.meshinfo.ru. Выгрузка собранных файлов в релиз — через `posadmesh-tools/publish-gitea-release.sh`. + +Workflow upstream MeshCore в `.github/workflows/` остаются под исходными именами файлов ради чистоты слияний. Не адаптируйте их под поведение PosadMesh; держите их близко к upstream. Они не используются для релизов PosadMesh. ## Требования к синхронизации документации Если вы меняете что-либо из перечисленного, обновляйте документацию в том же PR, когда это возможно: +- Любые изменения в проекте: + - дописать запись о них в раздел «Изменения в проекте» файла `README.md` - Команды веб-панели: - обновить `posadmesh-docs/custom-cli.md` - Пользовательское поведение, разделы, элементы управления или диагностика веб-панели: @@ -142,48 +149,41 @@ Workflow upstream MeshCore остаются под исходными имена - Руководство по прошивке и файлам релиза: - обновить `posadmesh-docs/releases.md` -## Замечания по обсерверам +## Замечания по MQTT-репитерам -Сборки `*_repeater_observer` могут включать локальную HTTPS-веб-панель на поддерживаемых таргетах ESP32. +Сборки `*_repeater_mqtt` могут включать локальную HTTPS-веб-панель на поддерживаемых таргетах ESP32. Эксплуатационные рекомендации уже отражены в документации: - использовать для первичной настройки и диагностики - после этого предпочитать `set web off` для максимального запаса heap -## Замечания по companion WiFi +## Границы продукта -Таргеты `*_companion_radio_wifi` поддерживают сохраняемые команды восстановления Wi-Fi через последовательный `CLI Rescue`. +Проект собирает и поставляет только MQTT-прошивки (`*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge`). Связанные с этим правила: -Не документируйте команды восстановления companion в документации репитера. Не предполагайте, что поведение веб-панели применимо. - -Правило версий companion: - -- теги companion используют только официальную версию релиза upstream MeshCore - текущая официальная версия MeshCore — `v1.15.0` -- companion-релизы выпускаются только когда `meshcore-dev/MeshCore` сделал официальный релиз -- не придумывайте отдельные номера версий PosadMesh для companion +- линия companion-прошивок удалена из проекта: окружения `*_companion_radio_*` и код `examples/companion_radio` остаются в upstream-оверлеях, PosadMesh их не собирает и не документирует +- не придумывайте отдельные номера версий PosadMesh для треков, которых нет в `release-notes.yml` ## Процесс релиза Текущие форматы тегов: ```bash -git tag companion-wifi-v1.15.0 git tag repeater-bridge-espnow-v1.15.0 -git tag observer-posadmesh-bridge-espnow-v2026.5.1 -git tag observer-posadmesh-bridge-mqtt-v2026.7.0 -git tag observer-posadmesh-v2026.5.1 +git tag repeater-mqtt-espnow-v2026.5.1 +git tag repeater-mqtt-bridge-v2026.7.0 +git tag repeater-mqtt-v2026.5.1 ``` Правила: -- теги `companion-wifi` используют версию upstream MeshCore напрямую - теги `repeater-bridge-espnow` используют версию upstream MeshCore напрямую -- теги `observer-posadmesh-bridge-espnow` используют версию релиза PosadMesh в теге -- теги `observer-posadmesh-bridge-mqtt` используют версию релиза PosadMesh в теге -- теги `observer-posadmesh` используют версию релиза PosadMesh в теге -- переменная `FIRMWARE_VERSION` при локальной сборке задаёт базовую версию upstream для релизных сборок треков `observer-posadmesh`, `observer-posadmesh-bridge-espnow` и `observer-posadmesh-bridge-mqtt` +- теги `repeater-mqtt-espnow` используют версию релиза PosadMesh в теге +- теги `repeater-mqtt-bridge` используют версию релиза PosadMesh в теге +- теги `repeater-mqtt` используют версию релиза PosadMesh в теге +- переменная `FIRMWARE_VERSION` при локальной сборке задаёт базовую версию upstream для релизных сборок треков `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge` - переменная `POSADMESH_VERSION` при локальной сборке задаёт версию релиза PosadMesh - если версия релиза upstream MeshCore изменилась, обновите `FIRMWARE_VERSION` при сборке и в документации @@ -191,7 +191,7 @@ git tag observer-posadmesh-v2026.5.1 1. Обновить `release-notes.yml` в ветке `develop`. 2. Смерджить релизный PR из `develop` в `main`. -3. Собрать нужные прошивки локально с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`. +3. Собрать нужные прошивки — локально или ручным workflow в Gitea Actions — с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`. 4. Создать нужный тег или теги релиза на целевом коммите в `main`. 5. Запушить теги в git.meshinfo.ru и создать релиз в его веб-интерфейсе. diff --git a/README.md b/README.md index cbd2f7ad..7d2e411e 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,46 @@ # MeshCore-Posadmesh -MeshCore-Posadmesh основан на upstream-проекте MeshCore: +PosadMesh — форк проекта EastMesh, который, в свою очередь, основан на официальной прошивке MeshCore: - +Прошивку дорабатывают энтузиасты из Сергиева Посада; проект ориентирован на работу с сайтом . + Благодарность Scott Powell / Ripple Radios и участникам MeshCore за оригинальную прошивку и основу проекта. -PosadMesh — это mesh-сеть, развиваемая сообществом на востоке Австралии. Этот репозиторий предоставляет адаптированные сборки MeshCore, включая прошивку WiFi companion с дополнительными инструментами CLI и прошивку обсервера, которая интегрируется с нашей платформой телеметрии CoreScope. +Этот репозиторий предоставляет адаптированные сборки MeshCore: прошивку MQTT-репитера, которая публикует телеметрию в mesh-сеть MeshCoreTel. -CoreScope () обеспечивает видимость сети, включая состояние репитеров, обсерверов и данные картографирования. - -**Сборки обсервера передают телеметрию в PosadMesh Core и предназначены только для репитеров Восточной Австралии**; запуск их в других местах может исказить общие данные сети. +**Сборки MQTT-репитера передают телеметрию на ** — укажите координаты узла и радиопараметры своего региона, чтобы узел появился на карте и в связях. Для Москвы (MOW) это 868,731 МГц, полоса 62,5 кГц, SF7, CR7, хэш пути 2 байта. ## Что добавляет этот репозиторий -- таргеты прошивки `*_repeater_observer` с: +- таргеты прошивки `*_repeater_mqtt` с: - встроенным WiFi - MQTT-аплинком к курируемому брокеру MeshCoreTel и дополнительно опциональным собственным брокером (TCP или WSS) - опциональной локальной панелью конфигурации HTTPS на поддерживаемых таргетах ESP32 -- таргеты прошивки `*_repeater_observer_espnow`, добавляющие локальный мост ESP-NOW mesh +- таргеты прошивки `*_repeater_mqtt_espnow`, добавляющие локальный мост ESP-NOW mesh - таргеты прошивки `*_repeater_bridge_espnow` для обычного ESP-NOW-моста репитера в стиле upstream, без MQTT-аплинка и веб-панели PosadMesh -- таргеты прошивки `*_companion_radio_wifi` для companion-устройств с подключением по WiFi - специфичные для PosadMesh процесс релизов и версионирование поверх релизов upstream MeshCore - документация и руководство по релизам для пользователей PosadMesh вместо полного набора документации upstream MeshCore +## Отличия от upstream MeshCore + +Ядро проекта — mesh-стек, радио, протокол и работа с платами — остаётся upstream-кодом MeshCore. PosadMesh добавляет поверх него транспорт, телеметрию и веб-интерфейс: + +| Область | upstream MeshCore | PosadMesh | +| --- | --- | --- | +| Транспорт | нет MQTT; репитер работает только по радио и через последовательный порт | MQTT-аплинк: курируемый брокер `meshcoretel` и опциональный собственный брокер (TCP или WSS по пути `/mqtt`); публикация статуса, пакетов и raw-данных | +| MQTT-мост | нет | передача raw-пакетов mesh между репитерами через ваш собственный peer-брокер (трек `repeater-mqtt-bridge`) | +| Wi-Fi | нет | Wi-Fi на репитерах: подключение, энергосбережение, watchdog шлюза, автоматическое переподключение, команды `wifi.*` | +| Веб-интерфейс | нет | локальная HTTPS-панель: вход по паролю администратора, выполнение CLI-команд, настройки репитера/радио/MQTT, регионы, чёрные списки, обновление прошивки (OTA), управление сертификатом панели | +| Телеметрия | нет | история метрик в PSRAM и архив на SD: батарея, загрузка ядра, память, пакеты, ошибки, уровень сигнала и шума, датчики, GPS; страница `/stats` с графиками и списком соседей/событий | +| 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 и другие) | +| Релизы | upstream-процесс | свои треки и теги `repeater-mqtt*`, локальная сборка через [`posadmesh-build.sh`](./posadmesh-build.sh), публикация релизов в Gitea | + +Что **не** меняется: поведение mesh-сети, радиоконфигурации, протокол и совместимость с MeshCore; upstream-код сохраняется в репозитории и синхронизируется из `meshcore-dev/MeshCore` (см. [AGENTS.md](./AGENTS.md)). + ## Релизы Готовые прошивки публикуются в разделе Releases на git.meshinfo.ru: @@ -34,9 +51,9 @@ CoreScope () обеспечивает видимост - [posadmesh-docs/releases.md](./posadmesh-docs/releases.md) -Сайт прошивальщика кастомной прошивки: +Веб-прошивальщик MeshCoreTel (в том числе прошивки наблюдателя и настройка радиопараметров): -- +- ## Установка uv @@ -83,8 +100,8 @@ bash posadmesh-build.sh list Сборка одного таргета: ```bash -uv run pio run -e heltec_v4_repeater_observer -uv run pio run -e heltec_v4_companion_radio_wifi +uv run pio run -e heltec_v4_repeater_mqtt +uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt ``` Сборка с релизными метаданными версии: @@ -92,13 +109,13 @@ uv run pio run -e heltec_v4_companion_radio_wifi ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer +bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt ``` Прошивка таргета: ```bash -uv run pio run -e heltec_v4_repeater_observer -t upload --upload-port /dev/tty.usbmodemXXXX +uv run pio run -e heltec_v4_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX ``` Открыть последовательный монитор: @@ -126,15 +143,13 @@ uv run --group docs zensical build - [`platformio.ini`](./platformio.ini) - корневой конфиг PlatformIO и вспомогательные скрипты ESP32 - [`variants/posadmesh_mqtt/platformio.ini`](./variants/posadmesh_mqtt/platformio.ini) - - общие определения окружений обсервера PosadMesh + - общие определения окружений MQTT-репитера PosadMesh - [`examples/simple_repeater/MyMesh.cpp`](./examples/simple_repeater/MyMesh.cpp) - подключение CLI репитера, набор MQTT-команд и интеграция с белым списком веб-панели - [`src/helpers/bridges/MQTTBridge.cpp`](./src/helpers/bridges/MQTTBridge.cpp) - двунаправленный MQTT-мост mesh (peer-брокер TCP, топик `meshcore/bridge/packets`) - [`src/helpers/mqtt/MQTTUplink.cpp`](./src/helpers/mqtt/MQTTUplink.cpp) - реализация MQTT-аплинка, веб-панель HTTPS, поддержка собственного брокера (TCP/WSS) и управление WiFi репитера -- [`examples/companion_radio`](./examples/companion_radio) - - реализация прошивки companion - [`RELEASE.md`](./RELEASE.md) - форматы тегов и порядок выпуска релизов - [`posadmesh-docs/`](./posadmesh-docs) @@ -158,38 +173,38 @@ uv run --group docs zensical build - публичного ключа и email владельца - включения локальной веб-панели -### MQTT-мост mesh (обсервер) +### MQTT-мост mesh (MQTT-репитер) -Трек релиза `observer-posadmesh-bridge-mqtt` (`*_repeater_observer_mqtt_bridge`) выполняет мостовую передачу **raw-пакетов mesh** между репитерами через **peer-брокер MQTT, который запускаете вы сами** (например, Mosquitto на ПК в локальной сети). Это **не** то же самое, что MQTT-аплинк к курируемому брокеру MeshCoreTel: +Трек релиза `repeater-mqtt-bridge` (`*_repeater_mqtt_bridge`) выполняет мостовую передачу **raw-пакетов mesh** между репитерами через **peer-брокер MQTT, который запускаете вы сами** (например, Mosquitto на ПК в локальной сети). Это **не** то же самое, что MQTT-аплинк к курируемому брокеру MeshCoreTel: -| | MQTT-аплинк (обсервер) | MQTT-мост mesh | +| | MQTT-аплинк (MQTT-репитер) | MQTT-мост mesh | | --- | --- | --- | | Назначение | Публикация JSON-телеметрии в курируемые брокеры | Передача зашифрованных пакетов mesh между радиоустройствами | | Брокеры | `meshcoretel`, собственный брокер | Ваш peer-брокер (`host:port`, TCP) | | Топик | `meshcore//...` (по IATA) | `meshcore/bridge/packets` (фиксированный) | | По умолчанию в bridge-сборках | Выключено по умолчанию (включается в веб-панели / CLI) | Включено, когда включён `bridge.enabled` | -**Первый поддерживаемый таргет:** `Xiao_S3_WIO_repeater_observer_mqtt_bridge` +**Первый поддерживаемый таргет:** `Xiao_S3_WIO_repeater_mqtt_bridge` -**Связанный трек:** `observer-posadmesh-bridge-espnow` (`*_repeater_observer_espnow`) использует ESP-NOW вместо MQTT для локальной мостовой передачи. +**Связанный трек:** `repeater-mqtt-espnow` (`*_repeater_mqtt_espnow`) использует ESP-NOW вместо MQTT для локальной мостовой передачи. Пример сборки: ```bash -uv run pio run -e Xiao_S3_WIO_repeater_observer_mqtt_bridge +uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge ``` Прошивка (обновление): ```bash -uv run pio run -e Xiao_S3_WIO_repeater_observer_mqtt_bridge -t upload --upload-port COM10 +uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge -t upload --upload-port COM10 ``` После **полного стирания флеш-памяти** прошивайте объединённый образ по адресу `0x0`, а не только `firmware.bin`: ```bash -uv run pio run -e Xiao_S3_WIO_repeater_observer_mqtt_bridge -t mergebin -uv run pio pkg exec -p tool-esptoolpy -- esptool.py --chip esp32s3 --port COM10 write_flash 0x0 .pio/build/Xiao_S3_WIO_repeater_observer_mqtt_bridge/firmware-merged.bin +uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge -t mergebin +uv run pio pkg exec -p tool-esptoolpy -- esptool.py --chip esp32s3 --port COM10 write_flash 0x0 .pio/build/Xiao_S3_WIO_repeater_mqtt_bridge/firmware-merged.bin ``` #### Peer-брокер Mosquitto (локальная сеть) @@ -275,7 +290,7 @@ get bridge.enabled ### Локальная веб-панель -На поддерживаемых таргетах ESP32 `*_repeater_observer` репитер может предоставлять локальную панель конфигурации HTTPS по WiFi. +На поддерживаемых таргетах ESP32 `*_repeater_mqtt` репитер может предоставлять локальную панель конфигурации HTTPS по WiFi. Возможности: @@ -285,64 +300,85 @@ get bridge.enabled - светлая и тёмная темы - опциональное отключение через `set web off` -Рекомендуется использовать для первичной настройки и периодической диагностики. При развёртывании обсерверов отключайте панель по завершении, если нужен максимальный запас heap для MQTT. - -### Дополнения Companion WiFi - -Таргеты `*_companion_radio_wifi` теперь поддерживают сохраняемые команды восстановления WiFi: - -- откройте последовательный монитор на скорости `115200` бод -- перезагрузите устройство -- удерживайте пользовательскую кнопку в течение первых 8 секунд после загрузки, чтобы войти в `CLI Rescue` -- дождитесь `========= CLI Rescue =========` -- отправьте команды из последовательного монитора - -Эти команды восстановления доступны только после входа в `CLI Rescue`: - -- `get wifi.status` -- `get wifi.ssid` -- `get wifi.powersaving` -- `set wifi.ssid ` -- `set wifi.pwd ` -- `set wifi.powersaving none|min|max` +Рекомендуется использовать для первичной настройки и периодической диагностики. При развёртывании MQTT-репитеров отключайте панель по завершении, если нужен максимальный запас heap для MQTT. ## Сборка и релизы Репозиторий живёт на . -Собственные workflow GitHub Actions (сборка релизов, проверки сборки и публикация доков) удалены при переезде: релизы собираются локально через [`posadmesh-build.sh`](./posadmesh-build.sh), а теги и релизы создаются вручную в веб-интерфейсе git.meshinfo.ru. +Собственные workflow GitHub Actions (сборка релизов, проверки сборки и публикация доков) удалены при переезде. Сейчас прошивки собираются локально через [`posadmesh-build.sh`](./posadmesh-build.sh) или на сервере ручным workflow [`.gitea/workflows/build-mqtt-firmwares.yml`](./.gitea/workflows/build-mqtt-firmwares.yml) (Actions → Build MQTT firmwares → Run workflow); теги и релизы создаются в веб-интерфейсе git.meshinfo.ru, а собранные файлы выгружаются в релиз скриптом [`posadmesh-tools/publish-gitea-release.sh`](./posadmesh-tools/publish-gitea-release.sh). Подробности — в [RELEASE.md](./RELEASE.md). Workflow upstream MeshCore (`.github/workflows/build-*.yml`, `firmware-builder.yml`, `pr-build-check.yml`, `run-unit-tests.yml`, `stale-bot.yml`) сохранены под исходными именами файлов для уменьшения конфликтов слияния. Они не являются частью процесса релизов PosadMesh и не используются. Текущие треки релизов: -- `companion-wifi` - `repeater-bridge-espnow` -- `observer-posadmesh` -- `observer-posadmesh-bridge-espnow` -- `observer-posadmesh-bridge-mqtt` +- `repeater-mqtt` +- `repeater-mqtt-espnow` +- `repeater-mqtt-bridge` ## Теги релизов Текущие теги релизов: ```bash -git tag companion-wifi-v1.14.1 git tag repeater-bridge-espnow-v1.15.0 -git tag observer-posadmesh-v2026.5.1 -git tag observer-posadmesh-bridge-espnow-v2026.5.1 -git tag observer-posadmesh-bridge-mqtt-v2026.7.0 +git tag repeater-mqtt-v2026.5.1 +git tag repeater-mqtt-espnow-v2026.5.1 +git tag repeater-mqtt-bridge-v2026.7.0 ``` -Companion WiFi использует в теге версию upstream MeshCore. +`repeater-bridge-espnow` использует в теге версию upstream MeshCore. -Обсервер использует: +MQTT-репитер использует: - `FIRMWARE_VERSION` — версия upstream MeshCore, задаётся при локальной сборке - `POSADMESH_VERSION` — версия релиза PosadMesh из тега Полный процесс релиза см. в [RELEASE.md](./RELEASE.md). +## Изменения в проекте + +Правило ведения: после любых правок проекта сюда дописывается короткая запись о том, что изменилось. + +### 2026.10.0 (текущая разработка) + +**Ребрендинг в PosadMesh** + +- папки и скрипты: `eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`; +- цели сборки: `*_repeater_observer*` → `*_repeater_mqtt*`; +- треки и теги релизов: `repeater-mqtt`, `repeater-mqtt-espnow`, `repeater-mqtt-bridge` (ранее `observer-eastmesh*`); +- переменная версии релиза `EASTMESH_VERSION` → `POSADMESH_VERSION`, суффикс версии сборки `-posadmesh-`; +- `posadmesh-docs/*`, `README.md`, `RELEASE.md` и `AGENTS.md` переведены на русский язык; команды, их вывод, код, пути и идентификаторы оставлены без перевода. + +**Удалено** + +- брокеры `waev`, `meshmapper`, `letsmesh-eu` и `letsmesh-us` — из прошивки, веб-панели и документации; остались `mqtt.meshcoretel` и `mqtt.custom`. Сохранённые выборы удалённых брокеров сбрасываются один раз при обновлении; +- линия companion-прошивок: трек `companion-wifi`, команды сборки companion и разделы документации. Проект собирает только MQTT-прошивки. + +**Переименование observer → mqtt** + +- цели: `*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge`; +- команды сборки: `build-repeater-mqtt-firmwares`, `build-repeater-mqtt-espnow-firmwares`, `build-repeater-mqtt-bridge-firmwares`; добавлены `build-mqtt-firmwares` (все MQTT-треки) и `list-mqtt`; +- из документации, `release-notes.yml` и шаблонов issue убраны старые имена (историю релизов с реальными git-тегами не переписывали). + +**Исправлено** + +- `set mqtt.meshcoretel on|off` не срабатывал: обработчик сравнивался со строкой `set mqtt.mqtt.meshcoretel `. Алиас `set mqtt.meshcoretel.ru on|off` читает значение по правильному смещению; +- `setEndpointEnabled` маскировал сохранённую маску брокеров значением `0x07` и терял бит собственного брокера при переключении любого другого; +- на странице логина веб-панели незакрытый тег `; собственные workflow GitHub Actions удалены, upstream-оверлеи сохранены под исходными именами; +- добавлен ручной workflow Gitea Actions [`.gitea/workflows/build-mqtt-firmwares.yml`](./.gitea/workflows/build-mqtt-firmwares.yml) — сборка MQTT-прошивок на сервере и публикация релиза; +- добавлен скрипт [`posadmesh-tools/publish-gitea-release.sh`](./posadmesh-tools/publish-gitea-release.sh) для выгрузки собранных файлов в релиз Gitea; +- в README добавлен раздел «Отличия от upstream MeshCore»; +- собран полный набор MQTT-прошивок (109 целей) с версией `v1.17.1-posadmesh-v2026.10.0` для публикации в релизах `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge`; +- проект и документация переориентированы на meshcoretel.ru: в README переписано происхождение проекта и заведён этот журнал изменений; из документации убраны прежние региональные материалы, ссылки на сторонние сервисы, примеры радиопресетов и коды регионов других стран; руководство по прошивке переведено на файлы из раздела релизов и `esptool.py`, вместо раздела региональных материалов добавлен раздел материалов MeshCoreTel. + ## Документация Отдельный сайт документации больше не публикуется: страницы лежат в каталоге [`posadmesh-docs/`](./posadmesh-docs) и читаются прямо в веб-интерфейсе git.meshinfo.ru: diff --git a/RELEASE.md b/RELEASE.md index 6bc0c795..257c62bc 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,6 +1,38 @@ # Выпуск прошивок -Репозиторий живёт на . Автоматической сборки релизов в CI нет: прошивки собираются локально через [`posadmesh-build.sh`](./posadmesh-build.sh), а теги и релизы создаются вручную в веб-интерфейсе git.meshinfo.ru. +Репозиторий живёт на . Прошивки собираются локально через [`posadmesh-build.sh`](./posadmesh-build.sh) или на сервере ручным workflow Gitea Actions; теги и релизы создаются в веб-интерфейсе git.meshinfo.ru. + +## Сборка на сервере (Gitea Actions) + +Ручной workflow [`.gitea/workflows/build-mqtt-firmwares.yml`](./.gitea/workflows/build-mqtt-firmwares.yml) запускается из веб-интерфейса: **Actions → Build MQTT firmwares → Run workflow**. + +Параметры запуска: + +- `firmware_version` — версия upstream MeshCore для метаданных (например `v1.17.1`); +- `posadmesh_version` — версия релиза PosadMesh (например `v2026.10.0`); +- `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`). + +Для публикации в репозитории должен быть задан секрет `GITEA_TOKEN` (personal access token с правом `write:repository`). + +Требования к раннеру: Linux с Docker, интернет, `python3` ≥ 3.11, `git`, `curl` и не меньше 20 ГБ свободного места — PlatformIO скачивает тулчейны ESP32 при первой сборке (шаг кэша `~/.platformio` ускоряет последующие запуски). Полная сборка всех MQTT-таргетов идёт долго, поэтому удобнее запускать по группам. + +## Ручная выгрузка в релиз + +Если прошивки собраны локально (каталог `out/`), файлы можно загрузить в релиз Gitea скриптом: + +```bash +GITEA_TOKEN= posadmesh-tools/publish-gitea-release.sh \ + repeater-mqtt-v2026.10.0 out "Repeater MQTT v2026.10.0" +``` + +Скрипт создаёт релиз, если его ещё нет, и повторный запуск не дублирует уже загруженные файлы. Адрес инстанса и репозиторий можно переопределить переменными `GITEA_URL` и `GITEA_REPO`. + +Тег удобнее создать заранее на нужном коммите (см. порядок выпуска ниже): тогда релиз привяжется к существующему тегу. Если тега нет, Gitea создаст его сам от HEAD ветки по умолчанию — для релизов этого лучше избегать. + +Каждый трек публикуется в свой релиз: соберите группу (`uplink`, `espnow` или `bridge`) и выгрузите её файлы под тегом этого трека. Каталог `out/` очищается в начале каждой сборки, поэтому в релиз попадут файлы только одной группы. ## Версии сборки @@ -12,54 +44,49 @@ ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer +bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt ``` ## Теги релизов PosadMesh Один или несколько тегов следующих форматов помечают релиз соответствующего трека: -- `companion-wifi-v1.15.0` - `repeater-bridge-espnow-v1.15.0` -- `observer-posadmesh-bridge-espnow-v2026.5.1` -- `observer-posadmesh-bridge-mqtt-v2026.7.0` -- `observer-posadmesh-v2026.5.1` +- `repeater-mqtt-espnow-v2026.5.1` +- `repeater-mqtt-bridge-v2026.7.0` +- `repeater-mqtt-v2026.5.1` -В `companion-wifi-v1.15.0` используется версия upstream MeshCore. В `repeater-bridge-espnow-v1.15.0` используется версия upstream MeshCore. -В `observer-posadmesh-bridge-espnow-v2026.5.1` используется версия релиза PosadMesh. -В `observer-posadmesh-bridge-mqtt-v2026.7.0` используется версия релиза PosadMesh. -В `observer-posadmesh-v2026.5.1` используется версия релиза PosadMesh. +В `repeater-mqtt-espnow-v2026.5.1` используется версия релиза PosadMesh. +В `repeater-mqtt-bridge-v2026.7.0` используется версия релиза PosadMesh. +В `repeater-mqtt-v2026.5.1` используется версия релиза PosadMesh. Соответствие тегов и треков: -- `companion-wifi-v*` — прошивка companion WiFi - `repeater-bridge-espnow-v*` — прошивка ESP-NOW-моста репитера -- `observer-posadmesh-bridge-espnow-v*` — прошивка обсервера с ESP-NOW -- `observer-posadmesh-bridge-mqtt-v*` — прошивка обсервера с MQTT-мостом -- `observer-posadmesh-v*` — прошивка обсервера +- `repeater-mqtt-espnow-v*` — прошивка MQTT-репитера с ESP-NOW +- `repeater-mqtt-bridge-v*` — прошивка MQTT-репитера с MQTT-мостом +- `repeater-mqtt-v*` — прошивка MQTT-репитера Сборка выполняется локально для нужного таргета; тегов на одном коммите может быть несколько. ## Итоговая версия прошивки -- `companion-wifi` использует версию из тега как `FIRMWARE_VERSION` - `repeater-bridge-espnow` использует версию из тега как `FIRMWARE_VERSION` -- `observer-posadmesh-bridge-espnow` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` -- `observer-posadmesh-bridge-mqtt` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` -- `observer-posadmesh` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` +- `repeater-mqtt-espnow` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` +- `repeater-mqtt-bridge` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` +- `repeater-mqtt` использует `FIRMWARE_VERSION` upstream MeshCore, а версию PosadMesh из тега — как `POSADMESH_VERSION` Итоговая строка версии зависит от трека: -- `companion-wifi`: `v1.15.0-` - `repeater-bridge-espnow`: `v1.15.0-` -- `observer-posadmesh-bridge-espnow`: `v1.15.0-posadmesh-v2026.5.1-` -- `observer-posadmesh-bridge-mqtt`: `v1.15.0-posadmesh-v2026.7.0-` -- `observer-posadmesh`: `v1.15.0-posadmesh-v2026.5.1-` +- `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-` Пример: -- тег: `observer-posadmesh-v2026.5.1` +- тег: `repeater-mqtt-v2026.5.1` - переменные: `FIRMWARE_VERSION=v1.15.0`, `POSADMESH_VERSION=v2026.5.1` - итоговая версия сборки: `v1.15.0-posadmesh-v2026.5.1-abcdef` @@ -79,16 +106,15 @@ bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-observer-firmwares +bash posadmesh-build.sh build-repeater-mqtt-firmwares -git tag observer-posadmesh-v2026.5.1 -git push origin observer-posadmesh-v2026.5.1 +git tag repeater-mqtt-v2026.5.1 +git push origin repeater-mqtt-v2026.5.1 ``` ## Поддерживаемые теги -- `companion-wifi-v1.15.0` - `repeater-bridge-espnow-v1.15.0` -- `observer-posadmesh-bridge-espnow-v2026.5.1` -- `observer-posadmesh-bridge-mqtt-v2026.7.0` -- `observer-posadmesh-v2026.5.1` +- `repeater-mqtt-espnow-v2026.5.1` +- `repeater-mqtt-bridge-v2026.7.0` +- `repeater-mqtt-v2026.5.1` diff --git a/posadmesh-build.sh b/posadmesh-build.sh index 89aa66b1..9e6e72a0 100755 --- a/posadmesh-build.sh +++ b/posadmesh-build.sh @@ -28,48 +28,36 @@ sh posadmesh-build.sh [target] Commands: help|usage|-h|--help: Shows this message. list|-l: List firmwares available to build. + list-mqtt: List only the PosadMesh MQTT build targets. build-firmware : Build the firmware for the given build target. - build-firmwares: Build all firmwares for all targets. + build-firmwares: Build all PosadMesh MQTT firmwares. + build-mqtt-firmwares: Build all MQTT firmwares (uplink, ESP-NOW bridge and MQTT bridge). build-matching-firmwares : Build all firmwares for build targets containing the string given for . - build-companion-firmwares: Build all companion firmwares for all build targets. - build-companion-wifi-firmwares: Build all companion WiFi firmwares for all build targets. - build-repeater-firmwares: Build all repeater firmwares for all build targets. - build-repeater-bridge-espnow-firmwares: Build all repeater ESP-NOW bridge firmwares for all build targets. - build-observer-firmwares: Build all observer firmwares for all build targets. - build-observer-espnow-firmwares: Build all observer ESP-NOW firmwares for all build targets. - build-observer-mqtt-bridge-firmwares: Build all observer MQTT bridge firmwares for all build targets. - build-room-server-firmwares: Build all chat room server firmwares for all build targets. + build-repeater-mqtt-firmwares: Build the MQTT uplink firmwares. + build-repeater-mqtt-espnow-firmwares: Build the MQTT uplink firmwares that also run a local ESP-NOW bridge. + build-repeater-mqtt-bridge-firmwares: Build the MQTT bridge firmwares. + build-repeater-firmwares: Build all upstream repeater firmwares. + build-repeater-bridge-espnow-firmwares: Build all repeater ESP-NOW bridge firmwares. + build-room-server-firmwares: Build all chat room server firmwares. Examples: -Build firmware for the "RAK_4631_repeater" device target -$ sh posadmesh-build.sh build-firmware RAK_4631_repeater +Build firmware for the "heltec_v4_repeater_mqtt" device target +$ sh posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt -Build all firmwares for device targets containing the string "RAK_4631" -$ sh posadmesh-build.sh build-matching-firmwares +Build all MQTT firmwares +$ sh posadmesh-build.sh build-mqtt-firmwares -Build all companion firmwares -$ sh posadmesh-build.sh build-companion-firmwares +Build the MQTT uplink firmwares +$ sh posadmesh-build.sh build-repeater-mqtt-firmwares -Build all companion WiFi firmwares -$ sh posadmesh-build.sh build-companion-wifi-firmwares +Build the MQTT uplink firmwares with the local ESP-NOW bridge +$ sh posadmesh-build.sh build-repeater-mqtt-espnow-firmwares -Build all repeater firmwares -$ sh posadmesh-build.sh build-repeater-firmwares +Build the MQTT bridge firmwares +$ sh posadmesh-build.sh build-repeater-mqtt-bridge-firmwares -Build all repeater ESP-NOW bridge firmwares -$ sh posadmesh-build.sh build-repeater-bridge-espnow-firmwares - -Build all observer firmwares -$ sh posadmesh-build.sh build-observer-firmwares - -Build all observer ESP-NOW firmwares -$ sh posadmesh-build.sh build-observer-espnow-firmwares - -Build all observer MQTT bridge firmwares -$ sh posadmesh-build.sh build-observer-mqtt-bridge-firmwares - -Build all chat room server firmwares -$ sh posadmesh-build.sh build-room-server-firmwares +Build all firmwares for device targets containing the string "Xiao" +$ sh posadmesh-build.sh build-matching-firmwares Xiao Environment Variables: DISABLE_DEBUG=1: Disables all debug logging flags (MESH_DEBUG, MESH_PACKET_LOGGING, etc.) @@ -96,7 +84,7 @@ import sys for section, _options in json.load(sys.stdin): if section.startswith('env:'): print(section[4:]) -" +" | tr -d '\r' } # Catch cries for help before doing anything else. @@ -111,6 +99,12 @@ case $1 in get_pio_envs exit 0 ;; + list-mqtt) + require_uv + sync_python_tooling + get_pio_envs | grep -E '_(repeater_mqtt|repeater_mqtt_espnow|repeater_mqtt_bridge)$' | sort + exit 0 + ;; esac # cache project config json for use in get_platform_for_env() @@ -157,7 +151,7 @@ for section, options in data: if match: print(match.group(1)) sys.exit(0) -" +" | tr -d '\r' } # disable all debug logging flags if DISABLE_DEBUG=1 is set @@ -171,15 +165,13 @@ get_firmware_build_date() { local env_name="$1" local header="examples/simple_repeater/MyMesh.h" - if [[ "$env_name" == *companion_radio* ]]; then - header="examples/companion_radio/MyMesh.h" - elif [[ "$env_name" == *room_server* ]]; then + if [[ "$env_name" == *room_server* ]]; then header="examples/simple_room_server/MyMesh.h" elif [[ "$env_name" == *sensor* ]]; then header="examples/simple_sensor/SensorMesh.h" fi - sed -n 's/^[[:space:]]*#define[[:space:]][[:space:]]*FIRMWARE_BUILD_DATE[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$header" | head -n 1 + sed -n 's/^[[:space:]]*#define[[:space:]][[:space:]]*FIRMWARE_BUILD_DATE[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$header" | head -n 1 | tr -d '\r' } # build firmware for the provided pio env in $1 @@ -293,47 +285,30 @@ build_repeater_bridge_espnow_firmwares() { } -build_companion_firmwares() { +build_repeater_mqtt_firmwares() { -# # build specific companion firmwares -# build_firmware "Heltec_v2_companion_radio_usb" -# build_firmware "Heltec_v2_companion_radio_ble" -# build_firmware "Heltec_v3_companion_radio_usb" -# build_firmware "Heltec_v3_companion_radio_ble" -# build_firmware "Xiao_S3_WIO_companion_radio_ble" -# build_firmware "LilyGo_T3S3_sx1262_companion_radio_usb" -# build_firmware "LilyGo_T3S3_sx1262_companion_radio_ble" -# build_firmware "RAK_4631_companion_radio_usb" -# build_firmware "RAK_4631_companion_radio_ble" -# build_firmware "t1000e_companion_radio_ble" - - # build all companion firmwares - build_all_firmwares_by_suffix "_companion_radio_usb" - build_all_firmwares_by_suffix "_companion_radio_ble" + build_all_firmwares_by_suffix "_repeater_mqtt" } -build_companion_wifi_firmwares() { +build_repeater_mqtt_espnow_firmwares() { - build_all_firmwares_by_suffix "_companion_radio_wifi" + build_all_firmwares_by_suffix "_repeater_mqtt_espnow" } -build_repeater_observer_firmwares() { +build_repeater_mqtt_bridge_firmwares() { - build_all_firmwares_by_suffix "_repeater_observer" + build_all_firmwares_by_suffix "_repeater_mqtt_bridge" } -build_repeater_observer_espnow_firmwares() { +# every MQTT firmware track: uplink, uplink with ESP-NOW bridge, and MQTT bridge +build_mqtt_firmwares() { - build_all_firmwares_by_suffix "_repeater_observer_espnow" - -} - -build_repeater_observer_mqtt_bridge_firmwares() { - - build_all_firmwares_by_suffix "_repeater_observer_mqtt_bridge" + build_repeater_mqtt_firmwares + build_repeater_mqtt_espnow_firmwares + build_repeater_mqtt_bridge_firmwares } @@ -349,9 +324,7 @@ build_room_server_firmwares() { } build_firmwares() { - build_companion_firmwares - build_repeater_firmwares - build_room_server_firmwares + build_mqtt_firmwares } # clean build dir @@ -378,20 +351,18 @@ elif [[ $1 == "build-matching-firmwares" ]]; then fi elif [[ $1 == "build-firmwares" ]]; then build_firmwares -elif [[ $1 == "build-companion-firmwares" ]]; then - build_companion_firmwares -elif [[ $1 == "build-companion-wifi-firmwares" ]]; then - build_companion_wifi_firmwares +elif [[ $1 == "build-mqtt-firmwares" ]]; then + build_mqtt_firmwares elif [[ $1 == "build-repeater-firmwares" ]]; then build_repeater_firmwares elif [[ $1 == "build-repeater-bridge-espnow-firmwares" ]]; then build_repeater_bridge_espnow_firmwares -elif [[ $1 == "build-observer-firmwares" ]]; then - build_repeater_observer_firmwares -elif [[ $1 == "build-observer-espnow-firmwares" ]]; then - build_repeater_observer_espnow_firmwares -elif [[ $1 == "build-observer-mqtt-bridge-firmwares" ]]; then - build_repeater_observer_mqtt_bridge_firmwares +elif [[ $1 == "build-repeater-mqtt-firmwares" ]]; then + build_repeater_mqtt_firmwares +elif [[ $1 == "build-repeater-mqtt-espnow-firmwares" ]]; then + build_repeater_mqtt_espnow_firmwares +elif [[ $1 == "build-repeater-mqtt-bridge-firmwares" ]]; then + build_repeater_mqtt_bridge_firmwares elif [[ $1 == "build-room-server-firmwares" ]]; then build_room_server_firmwares fi diff --git a/posadmesh-docs/api.md b/posadmesh-docs/api.md index f548c848..4344225a 100644 --- a/posadmesh-docs/api.md +++ b/posadmesh-docs/api.md @@ -1,6 +1,6 @@ # Веб-API репитера -Эта страница описывает локальный HTTPS API, который предоставляют сборки PosadMesh `*_repeater_observer` с поддержкой веб-панели. +Эта страница описывает локальный HTTPS API, который предоставляют сборки PosadMesh `*_repeater_mqtt` с поддержкой веб-панели. Он предназначен для: @@ -34,7 +34,7 @@ curl -sk https:///api/command \ API доступен только когда: -- вы запускаете поддерживаемую сборку прошивки `*_repeater_observer` +- вы запускаете поддерживаемую сборку прошивки `*_repeater_mqtt` - веб-панель репитера включена и работает - репитер доступен из локальной сети - вы прошли аутентификацию с паролем администратора репитера diff --git a/posadmesh-docs/boards.md b/posadmesh-docs/boards.md index 96669ef9..dd48a0a5 100644 --- a/posadmesh-docs/boards.md +++ b/posadmesh-docs/boards.md @@ -4,33 +4,25 @@ ## С чего начать -Если вы новичок в железе MeshCore и просто хотите разумную отправную точку, сначала решите, будет устройство companion-радио или репитером. - -Для companion-радио думайте о Wi-Fi-эндпоинте автоматизации: - -- используйте сборки companion Wi-Fi, когда другой системе — например, Home Assistant, RemoteTerm или вашему собственному инструментарию — нужно подключаться к MeshCore по Wi-Fi -- обычно это не устройства для повседневной ручной работы, поэтому экран здесь скорее опция, чем обязательное требование -- платы без экрана или простые платы часто подходят, когда companion-радио будет стоять рядом с питанием и управляться из другого приложения или системы автоматизации -- смотрите таблицы companion-радио ниже, если вам всё же нужен дисплей, GPS или более полный набор на плате +Если вы новичок в железе MeshCore и просто хотите разумную отправную точку, сначала решите, каким будет устройство: MQTT/веб-репитером или репитером-мостом. Для MQTT/веб-репитеров думайте о Wi-Fi, видимости в брокере и достаточном запасе для локальной веб-панели: - обычные отправные точки — `Heltec_v3` и `heltec_v4` -- `heltec_v4_repeater_observer` — сильный универсальный выбор обсервера с GPS, PSRAM и 16 MB флеш-памяти +- `heltec_v4_repeater_mqtt` — сильный универсальный выбор MQTT-репитера с GPS, PSRAM и 16 MB флеш-памяти - выбирайте платы с большим объёмом флеш-памяти и PSRAM, если вам нужны MQTT вместе с локальной веб-панелью, статистика или больше запаса под будущие функции -- экраны не являются важным требованием, потому что у обсерверов есть локальная веб-панель для настройки и диагностики +- экраны не являются важным требованием, потому что у MQTT-репитеров есть локальная веб-панель для настройки и диагностики - репитеры без экрана часто оказываются самым чистым решением, когда устройство будет жить на крыше, в корпусе или в стационарной установке, а настраивать вы будете его из веб-панели, последовательной консоли или приложения Для репитеров-мостов думайте о локальном радиосвязывании между близко расположенными репитерами: -- используйте прошивку моста, когда двум локальным репитерам нужно обмениваться трафиком между разными радиоконфигурациями MeshCore, например `Australia (Narrow)` и `Australia (Mid)` +- используйте прошивку моста, когда двум локальным репитерам нужно обмениваться трафиком между разными радиоконфигурациями MeshCore — например, с разной полосой пропускания и SF - чистым репитерам-мостам ESP-NOW не нужны ни MQTT, ни веб-панель PosadMesh, ни экран - ставьте на первое место стабильное питание, подходящие антенны и размещение, а не возможности дисплея -- используйте `observer-posadmesh-bridge-espnow` только когда тому же репитеру нужны ещё и MQTT-аплинк, и локальный мост ESP-NOW; иначе `repeater-bridge-espnow` делает роль проще +- используйте `repeater-mqtt-espnow` только когда тому же репитеру нужны ещё и MQTT-аплинк, и локальный мост ESP-NOW; иначе `repeater-bridge-espnow` делает роль проще Другие примечания: -- экраны важнее для companion-радио или стендовых/полевых устройств, чем для стационарных репитеров - если вам действительно нужен встроенный экран, которым люди будут пользоваться, предпочитайте платы с TFT - если нужен экран состояния с низким энергопотреблением, предпочитайте платы с электронной бумагой - если важно определение местоположения или мобильное использование, предпочитайте платы с поддержкой GPS, например семейство T-Beam, `heltec_tracker_v2`, `Heltec_v3`, `heltec_v4` или `ThinkNode_M5` @@ -40,7 +32,7 @@ Таблицы ниже построены на основе метаданных плат PlatformIO из репозитория и флагов сборки вариантов. -- `Target` — краткое имя платы, используемое на этой странице сравнения. Имена файлов релизов и локальные команды сборки по-прежнему используют полные имена env, например `heltec_v4_repeater_observer`. +- `Target` — краткое имя платы, используемое на этой странице сравнения. Имена файлов релизов и локальные команды сборки по-прежнему используют полные имена env, например `heltec_v4_repeater_mqtt`. - `MCU` показывает только семейство чипа. Фактовая рабочая частота может различаться в зависимости от env и конфигурации платы. - `RAM` — встроенная память RAM микроконтроллера. - `PSRAM` — дополнительная память на некоторых платах. Больше PSRAM обычно означает больше запаса для интерфейса, MQTT и будущих функций. @@ -49,11 +41,10 @@ ## Примечания по трекам -- Платы `companion-wifi` предназначены для companion-устройств, подключаемых к приложению. -- Платы `observer-posadmesh` предназначены для Wi-Fi-репитеров, публикующих данные в MQTT. -- Платы `repeater-bridge-espnow` и `observer-posadmesh-bridge-espnow` предназначены для использования в качестве локального моста ESP-NOW между близко расположенными репитерами с разными радиоконфигурациями MeshCore. +- Платы `repeater-mqtt` предназначены для Wi-Fi-репитеров, публикующих данные в MQTT. +- Платы `repeater-bridge-espnow` и `repeater-mqtt-espnow` предназначены для использования в качестве локального моста ESP-NOW между близко расположенными репитерами с разными радиоконфигурациями MeshCore. -Прошивка моста — это не MQTT через WAN и не мост через VPN. Используйте её, когда двум локальным репитерам нужно обмениваться трафиком между радиоконфигурациями, такими как `Australia (Narrow)` и `Australia (Mid)`. +Прошивка моста — это не MQTT через WAN и не мост через VPN. Используйте её, когда двум локальным репитерам нужно обмениваться трафиком между разными радиоконфигурациями, например с разной полосой пропускания и SF. ## Дополнительные признаки @@ -106,9 +97,9 @@ \* Эти таргеты используют PA или RF-фронтенд, поэтому фактическая выходная мощность может быть заметно выше заданной в `LORA_TX_POWER`. -## Платы `repeater_observer` +## Платы `repeater_mqtt` -В таблице перечислены все обсервер-таргеты, определённые сейчас в `variants/posadmesh_mqtt/platformio.ini`. +В таблице перечислены все MQTT-таргеты, определённые сейчас в `variants/posadmesh_mqtt/platformio.ini`. | Target | MCU | RAM | PSRAM | Flash | LoRa | Display | GPS | SD | | ------------------------ | ------- | ------ | ----- | ----- | ------ | --------------- | --- | --- | @@ -155,42 +146,8 @@ - `🧪` — аппаратно плата, скорее всего, поддерживает TF/microSD, но интеграцию для конкретной платы в PosadMesh ещё нужно проверить, прежде чем считать её поддерживаемой. - Для текущего архива статистики карты microSD `4 GB` `FAT32` более чем достаточно. Карты большего объёма тоже поддерживаются. -## Платы `companion_radio_wifi` с дисплеем - -Это Wi-Fi companion-таргеты, у которых настроен дисплей для локального статуса, подсказок при настройке или эпизодического прямого взаимодействия. - -| Target | MCU | RAM | PSRAM | Flash | LoRa | Display | GPS | -| ------------------------ | ------- | ------ | ----- | ----- | ------ | --------------- | --- | -| Heltec_v2 | ESP32 | 520 KB | No | 8 MB | SX1276 | OLED (SSD1306) | | -| Heltec_v3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | OLED (SSD1306) | ✅ | -| heltec_tracker_v2 | ESP32S3 | 512 KB | No | 8MB | SX1262 | TFT (ST7735) | ✅ | -| heltec_v4 | ESP32S3 | 512 KB | 2 MB | 16MB | SX1262 | OLED (SSD1306) | ✅ | -| heltec_v4_tft | ESP32S3 | 512 KB | 2 MB | 16MB | SX1262 | TFT (ST7789) | ✅ | -| LilyGo_TBeam_1W | ESP32S3 | 512 KB | 8 MB | 16MB | SX1262 | OLED (SH1106) | ✅ | -| LilyGo_TLora_V2_1_1_6 | ESP32 | 520 KB | No | 4 MB | SX1276 | OLED (SSD1306) | ✅ | -| nibble_screen_connect | ESP32S3 | 512 KB | No | 4MB | SX1262 | OLED (SSD1306) | | -| Station_G2 | ESP32S3 | 512 KB | 8 MB | 16MB | SX1262 | OLED (SH1106) | ✅ | -| T_Beam_S3_Supreme_SX1262 | ESP32S3 | 512 KB | 8 MB | 8MB | SX1262 | OLED (SH1106) | ✅ | -| ThinkNode_M2 | ESP32S3 | 512 KB | No | 4MB | SX1262 | OLED (SH1106) | | -| ThinkNode_M5 | ESP32S3 | 512 KB | No | 4MB | SX1262 | E-paper (GxEPD) | ✅ | - -## Платы `companion_radio_wifi` без дисплея - -Это Wi-Fi companion-таргеты, где основной интерфейс — приложение companion. Для многих пользователей это лучший повседневный вариант. - -| Target | MCU | RAM | PSRAM | Flash | LoRa | GPS | -| ----------------------- | ------- | ------ | ----- | ----- | ------ | --- | -| Heltec_WSL3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | ✅ | -| RAK_3112 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | ✅ | -| Xiao_S3_LoRa2021F33-2G4 | ESP32S3 | 512 KB | No | 8 MB | LR2021 | | -| Xiao_S3_WIO | ESP32S3 | 512 KB | No | 8 MB | SX1262 | ✅ | - ## Практические рекомендации -- Лучший универсальный обсервер с экраном и хорошим запасом ресурсов: `heltec_v4_repeater_observer`, `heltec_v4_tft_repeater_observer`, `Station_G2_repeater_observer`, `LilyGo_TBeam_1W_repeater_observer`. -- Лучший обсервер для простой установки без дисплея: `RAK_3112_repeater_observer`, `Generic_E22_sx1262_repeater_observer`, `Meshimi_repeater_observer`, `Xiao_C6_repeater_observer`. -- Лучшие малопотребляющие сборки обсервера с дисплеем: `Heltec_E213_repeater_observer`, `Heltec_E290_repeater_observer`, `Heltec_Wireless_Paper_repeater_observer`, `ThinkNode_M5_Repeater_observer`. -- Лучший выбор companion, если нужен самый богатый локальный интерфейс: `heltec_v4_tft_companion_radio_wifi` и `heltec_tracker_v2_companion_radio_wifi`. -- Лучший выбор companion, если нужен максимальный запас памяти: `T_Beam_S3_Supreme_SX1262_companion_radio_wifi`, `Station_G2_companion_radio_wifi`, `LilyGo_TBeam_1W_companion_radio_wifi`. -- Лучший выбор companion, если достаточно приложения и работы почти без дисплея: `RAK_3112_companion_radio_wifi`, `Xiao_S3_WIO_companion_radio_wifi`, `Station_G2_companion_radio_wifi`. -- Лучший выбор companion, если вы предпочитаете OLED вместо TFT: `T_Beam_S3_Supreme_SX1262_companion_radio_wifi`, `heltec_v4_companion_radio_wifi`, `LilyGo_TBeam_1W_companion_radio_wifi`. +- Лучший универсальный MQTT-репитер с экраном и хорошим запасом ресурсов: `heltec_v4_repeater_mqtt`, `heltec_v4_tft_repeater_mqtt`, `Station_G2_repeater_mqtt`, `LilyGo_TBeam_1W_repeater_mqtt`. +- Лучший MQTT-репитер для простой установки без дисплея: `RAK_3112_repeater_mqtt`, `Generic_E22_sx1262_repeater_mqtt`, `Meshimi_repeater_mqtt`, `Xiao_C6_repeater_mqtt`. +- Лучшие малопотребляющие сборки MQTT-репитера с дисплеем: `Heltec_E213_repeater_mqtt`, `Heltec_E290_repeater_mqtt`, `Heltec_Wireless_Paper_repeater_mqtt`, `ThinkNode_M5_repeater_mqtt`. diff --git a/posadmesh-docs/custom-cli.md b/posadmesh-docs/custom-cli.md index 6a117f18..edb153af 100644 --- a/posadmesh-docs/custom-cli.md +++ b/posadmesh-docs/custom-cli.md @@ -16,7 +16,7 @@ set mqtt.iata get mqtt.status ``` -Для обсерверов с локальной веб-панелью также полезны: +Для MQTT-репитеров с локальной веб-панелью также полезны: ```text set web on @@ -24,11 +24,11 @@ get web.status set web off ``` -Используйте `set web on` при настройке или диагностике, а затем `set web off`, когда стационарному обсерверу нужен максимальный запас памяти. +Используйте `set web on` при настройке или диагностике, а затем `set web off`, когда стационарному MQTT-репитеру нужен максимальный запас памяти. -## Команды обсервера +## Команды MQTT-репитера -Эти команды доступны в таргетах прошивки `*_repeater_observer`. +Эти команды доступны в таргетах прошивки `*_repeater_mqtt`. Команды `get` без аргументов нужно вводить точно так, как показано. @@ -80,7 +80,7 @@ set web off Примечания: -- новые установки обсерверов по умолчанию задают для `mqtt.iata` значение `UNSET` +- новые установки MQTT-репитеров по умолчанию задают для `mqtt.iata` значение `UNSET` - одновременно можно включить максимум два MQTT-брокера - если `mqtt.iata` имеет значение `UNSET`, включённые MQTT-брокеры не подключатся - пользовательский MQTT использует настроенные имя пользователя и пароль, а не аутентификацию JWT @@ -94,7 +94,7 @@ set web off - `mqtt.meshcoretel.ru` -### Настройки Wi-Fi для обсерверов +### Настройки Wi-Fi для MQTT-репитеров - `get wifi.status`: показывает SSID, состояние подключения, необработанный код статуса Wi-Fi, IP, канал и уровень сигнала при подключении, а также состояние шлюза (`gw:ok|lost`) и счётчик переподключений сторожевым таймером (`wd:`). - `get wifi.ssid`: показывает настроенный SSID Wi-Fi. @@ -104,9 +104,9 @@ set web off - `set wifi.powersaving none|min|max`: задаёт режим энергосбережения Wi-Fi. - `wifi reconnect`: разрывает текущее соединение и переподключается с полным сканированием каналов. Используйте, когда узел сообщает о подключении, но недоступен по сети. -Обсерверы также используют сторожевой таймер связи: пока Wi-Fi сообщает о подключении, узел каждые 30 секунд проверяет свой шлюз через ARP. Если шлюз молчит 3 минуты (например, точка доступа, которая продолжает рассылать beacon после потери проводного аплинка), узел сам принудительно выполняет полное переподключение, увеличивая интервал между попытками вплоть до 48 минут, пока сбой не прекратится. `wd:` в `get wifi.status` считает такие принудительные переподключения с момента загрузки. +MQTT-репитеры также используют сторожевой таймер связи: пока Wi-Fi сообщает о подключении, узел каждые 30 секунд проверяет свой шлюз через ARP. Если шлюз молчит 3 минуты (например, точка доступа, которая продолжает рассылать beacon после потери проводного аплинка), узел сам принудительно выполняет полное переподключение, увеличивая интервал между попытками вплоть до 48 минут, пока сбой не прекратится. `wd:` в `get wifi.status` считает такие принудительные переподключения с момента загрузки. -### Настройки NTP для обсерверов +### Настройки NTP для MQTT-репитеров - `get ntp.server1`: показывает основной NTP-сервер. - `get ntp.server2`: показывает дополнительный NTP-сервер. @@ -117,20 +117,20 @@ set web off Серверы по умолчанию: `au.pool.ntp.org`, `time.google.com` и `time.cloudflare.com`. -### Настройки моста ESP-NOW для сборок Observer ESP-NOW +### Настройки моста ESP-NOW для сборок MQTT ESP-NOW -Эти команды доступны в таргетах прошивки `*_repeater_observer_espnow`, использующих транспорт моста ESP-NOW. +Эти команды доступны в таргетах прошивки `*_repeater_mqtt_espnow`, использующих транспорт моста ESP-NOW. -Команды моста предназначены для локального использования моста ESP-NOW между близко расположенными репитерами, например для связи репитеров в `Australia (Narrow)` и `Australia (Mid)`. Это не элементы управления MQTT-over-WAN, VPN или интернет-мостом. +Команды моста предназначены для локального использования моста ESP-NOW между близко расположенными репитерами, работающими на разных радиоконфигурациях MeshCore — например, с разной полосой пропускания и SF. Это не элементы управления MQTT-over-WAN, VPN или интернет-мостом. - `get bridge.channel`: показывает настроенный канал моста ESP-NOW. - `set bridge.channel `: задаёт канал моста ESP-NOW и перезапускает мост. Используйте значение от `1` до `14`. - `get bridge.secret`: показывает настроенный секрет моста ESP-NOW. - `set bridge.secret `: задаёт общий секрет моста ESP-NOW и перезапускает мост. -После выполнения `set bridge.channel` ожидайте кратковременного разрыва соединения моста и веб-панели, пока радио перезапускается. В текущих сборках observer ESP-NOW это может выглядеть как перезагрузка платы. +После выполнения `set bridge.channel` ожидайте кратковременного разрыва соединения моста и веб-панели, пока радио перезапускается. В текущих сборках MQTT ESP-NOW это может выглядеть как перезагрузка платы. -В сборках `*_repeater_observer_espnow`, подключённых к Wi-Fi, канал моста ESP-NOW должен совпадать с активным каналом Wi-Fi 2,4 ГГц: +В сборках `*_repeater_mqtt_espnow`, подключённых к Wi-Fi, канал моста ESP-NOW должен совпадать с активным каналом Wi-Fi 2,4 ГГц: 1. Выполните `get wifi.status`. 2. Считайте значение `channel:` из статуса подключённого Wi-Fi. @@ -177,11 +177,11 @@ OK - `get flood.max.advert`: показывает лимит хопов для flood-пакетов advert. - `set flood.max.advert <0-64>`: задаёт лимит хопов для flood-пакетов advert. -В сборках обсерверов `flood.max.unscoped` по умолчанию равен `64`. Меньшие значения могут ограничить, как далеко повторяется неограниченный flood-трафик, тогда как пересылка scoped/region flood остаётся под управлением `flood.max`. +В сборках MQTT-репитеров `flood.max.unscoped` по умолчанию равен `64`. Меньшие значения могут ограничить, как далеко повторяется неограниченный flood-трафик, тогда как пересылка scoped/region flood остаётся под управлением `flood.max`. ### Отчётность о батарее платы -- В сборках обсерверов фоновый опрос батареи, используемый для истории MQTT/статуса, ограничен примерно одним разом в минуту. Явные запросы статуса и телеметрии по-прежнему обновляют показание сразу. +- В сборках MQTT-репитеров фоновый опрос батареи, используемый для истории MQTT/статуса, ограничен примерно одним разом в минуту. Явные запросы статуса и телеметрии по-прежнему обновляют показание сразу. ### Управление вентилятором T-Beam 1W @@ -217,96 +217,11 @@ OK - панель по-прежнему использует для доступа пароль администратора репитера - команды выполняются с той же осторожностью, как если бы вы вводили их напрямую в CLI репитера - это предназначено для локального административного использования в доверенной сети -- `start ota` освобождает локальный слушатель HTTP-редиректа на порту `80`, чтобы слушатель OTA HTTP мог занять его, не останавливая остальные службы репитера, независимо от того, выполнена ли команда из веб-панели, последовательного CLI или удалённого сеанса CLI companion/приложения +- `start ota` освобождает локальный слушатель HTTP-редиректа на порту `80`, чтобы слушатель OTA HTTP мог занять его, не останавливая остальные службы репитера, независимо от того, выполнена ли команда из веб-панели, последовательного CLI или удалённого сеанса CLI - если старый слушатель редиректа не освободил порт `80` полностью, слушатель OTA повторяет попытки примерно до 30 секунд, после чего сдаётся - кнопка `Purge SD` в веб-интерфейсе выполняет `purge sd` после подтверждения в браузере - `start ota` использует существующий Wi-Fi-адрес репитера, если он уже подключён, или запускает точку доступа `MeshCore-OTA`, если Wi-Fi не подключён -- ярлык Regions в `/app` последовательно выполняет существующие команды регионов MeshCore: `region put au`, `region put au-STATE`, `region allowf au`, `region allowf au-STATE`, затем `region save` - -## Команды восстановления Wi-Fi для companion - -Эти команды доступны в последовательном CLI восстановления для сборок `*_companion_radio_wifi`. - -Чтобы войти в `CLI Rescue`: - -- откройте последовательный монитор на скорости `115200` бод -- перезагрузите устройство -- удерживайте кнопку пользователя в течение первых 8 секунд после загрузки -- дождитесь `========= CLI Rescue =========` - -- `get wifi.status`: показывает настроенный SSID, состояние подключения, необработанный код статуса Wi-Fi, IP, канал и уровень сигнала при подключении. -- `get wifi.ssid`: показывает настроенный SSID Wi-Fi. -- `get wifi.powersaving`: показывает текущий режим энергосбережения Wi-Fi. -- `set wifi.ssid `: сохраняет SSID Wi-Fi и сразу повторяет подключение. -- `set wifi.pwd `: сохраняет пароль Wi-Fi и сразу повторяет подключение. -- `set wifi.powersaving none|min|max`: изменяет режим энергосбережения Wi-Fi. - -Сборки Companion Wi-Fi также по-прежнему поддерживают существующие команды восстановления, такие как: - -- `set pin <6-digit-pin>` -- `rebuild` -- `erase` -- `ls ...` -- `cat ...` -- `rm ...` -- `reboot` - -### Точка доступа для восстановления - -Когда у устройства companion Wi-Fi не настроены учётные данные Wi-Fi или оно не может подключиться -к своей настроенной сети в течение 60 секунд, оно поднимает собственную -точку доступа `EastMesh-WiFi`, чтобы его можно было восстановить без последовательного кабеля. - -**Пароль точки доступа — это pin устройства, дополненный нулями до 8 цифр** (WPA2 требует -не менее 8 символов). Pin подчиняется тем же правилам, что и pin сопряжения Bluetooth в -сборках BLE: - -| Устройство | Активный pin | Пароль `EastMesh-WiFi` | -| --------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------- | -| Есть экран, pin не задан | случайный 6-значный pin при каждой загрузке, отображается как `Pin:NNNNNN` на главном экране | `00NNNNNN` — считайте его с экрана | -| Нет экрана, pin не задан | `123456` (по умолчанию) | `00123456` | -| Pin задан через `set pin ` | ваш настроенный pin (любое устройство) | ваш pin, дополненный нулями до 8 цифр, например pin `4242` → `00004242` | - -Примечания по pin: - -- на устройствах с экраном pin случаен только до тех пор, пока pin не сохранён; выполните - `set pin ` для фиксированного пароля (вступает в силу при следующей загрузке) -- устройствам без экрана в общедоступных местах всегда следует задавать собственный pin — `00123456` — - это документированное значение по умолчанию, поэтому относитесь к нему как к паролю роутера по умолчанию - -Шаги восстановления: - -1. подключитесь к сети `EastMesh-WiFi` с паролем из таблицы выше -2. откройте CLI восстановления командой `telnet 192.168.4.1` (или `nc 192.168.4.1 23`) — все - команды восстановления, перечисленные выше, доступны -3. `set wifi.ssid `, затем `set wifi.pwd ` — устройство сразу - повторяет подключение к сети с новыми учётными данными -4. `reboot` (или просто подождите — см. ниже) - -Пока точка доступа поднята, устройство продолжает повторять попытки подключения к настроенной сети примерно раз в -минуту (ожидайте короткий сбой точки доступа при каждой попытке); как только подключение станции -успешно, точка доступа восстановления автоматически отключается (это также разрывает -ваш сеанс восстановления — это признак того, что всё сработало). - -### Использование приложения companion через AP (роуминг) - -Точка доступа восстановления нужна не только для исправления учётных данных — через неё -доступен полный протокол companion, что делает её режимом роумингового доступа, когда устройство -находится вне своей настроенной сети: - -1. подключитесь к `EastMesh-WiFi` с паролем, производным от pin (см. таблицу выше) -2. в приложении companion MeshCore добавьте/подключите Wi-Fi-устройство с хостом - `192.168.4.1` и портом `5000` -3. пользуйтесь приложением как обычно — сообщения, контакты и каналы работают через AP - -Примечания по использованию в роуминге: - -- один раз выполните `set pin `, чтобы пароль точки доступа оставался неизменным между перезагрузками; - иначе устройства с экраном выбирают новый случайный pin при каждой загрузке -- точка доступа появляется примерно через 60 секунд после загрузки (сначала устройство пытается - подключиться к своей настроенной сети) и работает до тех пор, пока эта сеть недоступна -- оказавшись снова в зоне действия своей настроенной сети, устройство подключается к ней и - автоматически отключает точку доступа — вместо этого переподключите приложение по адресу в локальной сети +- ярлык Regions в `/app` последовательно выполняет команды регионов MeshCore: `region put` и `region allowf` для базового региона и вложенного, затем `region save` ## Скрипт проверки состояния heap diff --git a/posadmesh-docs/index.md b/posadmesh-docs/index.md index 676014f0..98536507 100644 --- a/posadmesh-docs/index.md +++ b/posadmesh-docs/index.md @@ -2,14 +2,14 @@ MeshCore-Posadmesh сохраняет upstream-прошивку MeshCore без изменений и публикует четыре трека прошивок в зависимости от того, как устройству нужно подключаться: -- `companion-wifi`: используйте для companion-устройств с подключением по Wi-Fi. Этот трек наиболее близок к upstream MeshCore и добавляет команды аварийного восстановления/настройки Wi-Fi от PosadMesh. - `repeater-bridge-espnow`: используйте, когда нужен обычный репитерный мост ESP-NOW в стиле upstream, без MQTT-аплинка и без веб-панели PosadMesh. -- `observer-posadmesh`: используйте для Wi-Fi репитера, который должен публиковать данные в MQTT-брокер и, на поддерживаемых платах ESP32, предоставлять опциональную локальную веб-панель для настройки и диагностики. -- `observer-posadmesh-bridge-espnow`: используйте, когда одному репитеру нужны одновременно MQTT-аплинк и обязанности моста ESP-NOW, включая управление каналом/секретом моста для синхронизации моста с Wi-Fi. +- `repeater-mqtt`: используйте для Wi-Fi репитера, который должен публиковать данные в MQTT-брокер и, на поддерживаемых платах ESP32, предоставлять опциональную локальную веб-панель для настройки и диагностики. +- `repeater-mqtt-espnow`: используйте, когда одному репитеру нужны одновременно MQTT-аплинк и обязанности моста ESP-NOW, включая управление каналом/секретом моста для синхронизации моста с Wi-Fi. +- `repeater-mqtt-bridge`: используйте, когда репитер должен пересылать raw-пакеты mesh между репитерами через ваш собственный MQTT-брокер (например, Mosquitto в локальной сети), а не публиковать телеметрию в курируемый брокер. !!! note "Треки-мосты — это локальные радиомосты" - Треки-мосты ESP-NOW предназначены для соединения двух расположенных рядом репитеров, работающих на разных радиоконфигурациях MeshCore, например один репитер на `Australia (Narrow)`, а другой на `Australia (Mid)`. + Треки-мосты ESP-NOW предназначены для соединения двух расположенных рядом репитеров, работающих на разных радиоконфигурациях MeshCore — например, с разной полосой пропускания и SF. Треки-мосты — это не релизы MQTT-over-WAN, VPN или интернет-туннелей. @@ -18,15 +18,15 @@ MeshCore-Posadmesh сохраняет upstream-прошивку MeshCore без - [Сравнение плат](./boards.md) - [Скачивание и прошивка релизов](./releases.md) -Если вы уже знаете свою плату и хотите самый быстрый путь, пропустите документацию и откройте прошивальщик: +Если вы уже знаете свою плату и хотите самый быстрый путь, пропустите документацию и откройте раздел релизов: -- [Открыть прошивальщик PosadMesh](https://flasher.eastmesh.au) +- [Скачать прошивку PosadMesh](https://git.meshinfo.ru/shade/MeshCore-Posadmesh/releases) ## Я хочу - выбрать плату: начните с [Сравнение плат](./boards.md) - прошить прошивку с рекомендациями: начните с [Скачивание и прошивка релизов](./releases.md) -- прошить прошивку сейчас: откройте [прошивальщик PosadMesh](https://flasher.eastmesh.au) +- прошить прошивку сейчас: скачайте файл из [раздела релизов](https://git.meshinfo.ru/shade/MeshCore-Posadmesh/releases) - настроить репитер после прошивки: используйте [Скачивание и прошивка релизов](./releases.md) и [Использование веб-панели репитера](./web-panel.md) - разобраться в CLI-командах PosadMesh: используйте [Пользовательские CLI-команды](./custom-cli.md) - автоматизировать работу с репитером или писать скрипты: используйте [Использование веб-API репитера](./api.md) @@ -53,20 +53,15 @@ MeshCore-Posadmesh сохраняет upstream-прошивку MeshCore без - [meshcore-dev/MeshCore](https://github.com/meshcore-dev/MeshCore) -## Региональные материалы по Австралии +## Материалы MeshCoreTel -Эти материалы поддерживаются сообществом, а не являются официальной документацией проекта, но они всё равно полезны для региональных заметок по настройке в Австралии, местных соглашений и материалов по MeshCore для отдельных регионов. +Проект ориентирован на сеть и сайт : -### ACT / NSW / QLD / SA / TAS / VIC +- [Карта сети](https://meshcoretel.ru/ru/MOW/map) +- [Связность](https://meshcoretel.ru/ru/MOW/links) +- [Покрытие](https://meshcoretel.ru/ru/MOW/coverage) +- [Узлы](https://meshcoretel.ru/ru/MOW/adverts) +- [Наблюдатели](https://meshcoretel.ru/ru/MOW/observers) +- [Веб-прошивальщик и консоль](https://meshcoretel.ru/ru/flasher) -- [wiki.eastmesh.au](https://wiki.eastmesh.au/) -- [wiki.meshcoreaus.org](https://wiki.meshcoreaus.org/) - -### Сидней - -- [nswmesh.au](https://nswmesh.au/) -- [github.com/nswmesh](https://github.com/nswmesh/) - -### Брисбен - -- [wiki.mbug.com.au/en/Meshcore/Settings](https://wiki.mbug.com.au/en/Meshcore/Settings) +Радиопараметры региона Москва (MOW), которые использует сеть: 868,731 МГц, полоса 62,5 кГц, SF7, CR7, хэш пути 2 байта. Брокер: `mqtt://mqtt.meshcoretel.ru:1883`, пользователь и пароль `meshcore`. diff --git a/posadmesh-docs/local-builds.md b/posadmesh-docs/local-builds.md index 0a3e65fe..390a525d 100644 --- a/posadmesh-docs/local-builds.md +++ b/posadmesh-docs/local-builds.md @@ -6,6 +6,8 @@ Используйте эту страницу, когда изменяете прошивку, тестируете таргет перед релизом или собираете локальный артефакт, недоступный в разделе Releases. +Если сборка на своей машине не нужна, те же MQTT-прошивки можно собрать на сервере ручным workflow Gitea Actions (**Actions → Build MQTT firmwares → Run workflow**): он принимает версии `FIRMWARE_VERSION` и `POSADMESH_VERSION`, группу сборки (`all`, `uplink`, `espnow`, `bridge` или один таргет) и умеет сразу создать релиз Gitea с собранными файлами. Подробности — в [RELEASE.md](../RELEASE.md). + ## Настройка Из корня репозитория: @@ -25,17 +27,16 @@ bash posadmesh-build.sh list Обычная сборка PlatformIO для одного таргета: ```bash -uv run pio run -e heltec_v4_repeater_observer -uv run pio run -e heltec_v4_companion_radio_wifi +uv run pio run -e heltec_v4_repeater_mqtt uv run pio run -e heltec_v4_repeater_bridge_espnow -uv run pio run -e heltec_v4_repeater_observer_espnow -uv run pio run -e Xiao_S3_WIO_repeater_observer_mqtt_bridge +uv run pio run -e heltec_v4_repeater_mqtt_espnow +uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge ``` Прошивка таргета: ```bash -uv run pio run -e heltec_v4_repeater_observer -t upload --upload-port /dev/tty.usbmodemXXXX +uv run pio run -e heltec_v4_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX ``` Монитор последовательного порта: @@ -48,19 +49,12 @@ uv run pio device monitor --port /dev/tty.usbmodemXXXX --baud 115200 Если вам нужны те же метаданные версии, которые используются при выпуске релиза, сначала экспортируйте переменные версии. -Companion Wi-Fi: - -```bash -export FIRMWARE_VERSION=v1.14.1 -bash posadmesh-build.sh build-firmware heltec_v4_companion_radio_wifi -``` - -Обсервер: +MQTT-репитер: ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer +bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt ``` Мост ESP-NOW репитера: @@ -70,59 +64,59 @@ export FIRMWARE_VERSION=v1.15.0 bash posadmesh-build.sh build-firmware heltec_v4_repeater_bridge_espnow ``` -Обсервер ESP-NOW: +MQTT-репитер ESP-NOW: ```bash export FIRMWARE_VERSION=v1.15.0 export POSADMESH_VERSION=v2026.5.1 -bash posadmesh-build.sh build-firmware heltec_v4_repeater_observer_espnow +bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt_espnow ``` На выходе получаются артефакты с версиями в `out/`. Правило версионирования: -- `companion-wifi` и `repeater-bridge-espnow` используют версию upstream MeshCore как `FIRMWARE_VERSION` -- `observer-posadmesh`, `observer-posadmesh-bridge-espnow` и `observer-posadmesh-bridge-mqtt` используют версию upstream MeshCore как `FIRMWARE_VERSION` плюс версию релиза PosadMesh как `POSADMESH_VERSION` +- `repeater-bridge-espnow` использует версию upstream MeshCore как `FIRMWARE_VERSION` +- `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge` используют версию upstream MeshCore как `FIRMWARE_VERSION` плюс версию релиза PosadMesh как `POSADMESH_VERSION` -## Поддерживаемые платы `repeater_observer` +## Поддерживаемые платы `repeater_mqtt` Это полные имена окружений PlatformIO, используемые для локальных сборок из исходников и для именования артефактов релизов. ```text -Generic_E22_sx1262_repeater_observer -Generic_E22_sx1268_repeater_observer -Heltec_E213_repeater_observer -Heltec_E290_repeater_observer -Heltec_T190_repeater_observer -heltec_tracker_v2_repeater_observer -Heltec_v2_repeater_observer -Heltec_v3_repeater_observer -heltec_v4_repeater_observer -heltec_v4_tft_repeater_observer -Heltec_Wireless_Paper_repeater_observer -Heltec_Wireless_Tracker_repeater_observer -Heltec_WSL3_repeater_observer -LilyGo_T3S3_sx1262_repeater_observer -LilyGo_T3S3_sx1276_repeater_observer -LilyGo_TBeam_1W_repeater_observer -LilyGo_TDeck_repeater_observer -LilyGo_Tlora_C6_repeater_observer -M5Stack_Unit_C6L_repeater_observer -Meshadventurer_sx1262_repeater_observer -Meshadventurer_sx1268_repeater_observer -Meshimi_repeater_observer -nibble_screen_connect_repeater_observer -RAK_3112_repeater_observer -Station_G2_logging_repeater_observer -Station_G2_repeater_observer -T_Beam_S3_Supreme_SX1262_repeater_observer -Tbeam_SX1262_repeater_observer -Tbeam_SX1276_repeater_observer -WHY2025_badge_repeater_observer -Xiao_C6_repeater_observer -Xiao_S3_LoRa2021F33-2G4_repeater_observer -Xiao_S3_WIO_repeater_observer +Generic_E22_sx1262_repeater_mqtt +Generic_E22_sx1268_repeater_mqtt +Heltec_E213_repeater_mqtt +Heltec_E290_repeater_mqtt +Heltec_T190_repeater_mqtt +heltec_tracker_v2_repeater_mqtt +Heltec_v2_repeater_mqtt +Heltec_v3_repeater_mqtt +heltec_v4_repeater_mqtt +heltec_v4_tft_repeater_mqtt +Heltec_Wireless_Paper_repeater_mqtt +Heltec_Wireless_Tracker_repeater_mqtt +Heltec_WSL3_repeater_mqtt +LilyGo_T3S3_sx1262_repeater_mqtt +LilyGo_T3S3_sx1276_repeater_mqtt +LilyGo_TBeam_1W_repeater_mqtt +LilyGo_TDeck_repeater_mqtt +LilyGo_Tlora_C6_repeater_mqtt +M5Stack_Unit_C6L_repeater_mqtt +Meshadventurer_sx1262_repeater_mqtt +Meshadventurer_sx1268_repeater_mqtt +Meshimi_repeater_mqtt +nibble_screen_connect_repeater_mqtt +RAK_3112_repeater_mqtt +Station_G2_logging_repeater_mqtt +Station_G2_repeater_mqtt +T_Beam_S3_Supreme_SX1262_repeater_mqtt +Tbeam_SX1262_repeater_mqtt +Tbeam_SX1276_repeater_mqtt +WHY2025_badge_repeater_mqtt +Xiao_C6_repeater_mqtt +Xiao_S3_LoRa2021F33-2G4_repeater_mqtt +Xiao_S3_WIO_repeater_mqtt ``` ## Поддерживаемые платы мостов @@ -131,70 +125,28 @@ Xiao_S3_WIO_repeater_observer ```bash bash posadmesh-build.sh list | grep '_repeater_bridge_espnow' -bash posadmesh-build.sh list | grep '_repeater_observer_espnow' +bash posadmesh-build.sh list | grep '_repeater_mqtt_espnow' ``` Типичные примеры: ```text heltec_v4_repeater_bridge_espnow -heltec_v4_repeater_observer_espnow +heltec_v4_repeater_mqtt_espnow Station_G2_repeater_bridge_espnow -Station_G2_repeater_observer_espnow +Station_G2_repeater_mqtt_espnow T_Beam_S3_Supreme_SX1262_repeater_bridge_espnow -T_Beam_S3_Supreme_SX1262_repeater_observer_espnow +T_Beam_S3_Supreme_SX1262_repeater_mqtt_espnow ``` -## Поддерживаемые платы `repeater_observer_mqtt_bridge` +## Поддерживаемые платы `repeater_mqtt_bridge` -Для каждой платы обсервера определён вариант сборки `mqtt_bridge`. +Для каждой платы MQTT-репитера определён вариант сборки `mqtt_bridge`. Список доступных таргетов: ```bash -bash posadmesh-build.sh list | grep '_repeater_observer_mqtt_bridge' +bash posadmesh-build.sh list | grep '_repeater_mqtt_bridge' ``` Прошивка моста предназначена для локального использования ESP-NOW-моста между близлежащими репитерами. Это не мост MQTT-over-WAN и не VPN-мост. - -## Поддерживаемые платы `companion_radio_wifi` - -Это полные имена окружений PlatformIO, используемые для локальных сборок из исходников и для именования артефактов релизов. - -```text -heltec_tracker_v2_companion_radio_wifi -Heltec_v2_companion_radio_wifi -Heltec_v3_companion_radio_wifi -heltec_v4_companion_radio_wifi -heltec_v4_tft_companion_radio_wifi -Heltec_WSL3_companion_radio_wifi -LilyGo_TBeam_1W_companion_radio_wifi -LilyGo_TLora_V2_1_1_6_companion_radio_wifi -nibble_screen_connect_companion_radio_wifi -RAK_3112_companion_radio_wifi -Station_G2_companion_radio_wifi -T_Beam_S3_Supreme_SX1262_companion_radio_wifi -ThinkNode_M2_companion_radio_wifi -ThinkNode_M5_companion_radio_wifi -Xiao_S3_LoRa2021F33-2G4_companion_radio_wifi -Xiao_S3_WIO_companion_radio_wifi -``` - -## CLI companion Wi-Fi - -Текущие сборки companion Wi-Fi поддерживают сохраняемые команды восстановления Wi-Fi: - -- откройте монитор последовательного порта на скорости `115200` бод -- перезагрузите устройство -- в течение первых 8 секунд после загрузки зажмите пользовательскую кнопку, чтобы войти в `CLI Rescue` -- дождитесь `========= CLI Rescue =========` -- затем выполните приведённые ниже команды восстановления Wi-Fi из монитора последовательного порта - -```text -get wifi.status -get wifi.ssid -get wifi.powersaving -set wifi.ssid -set wifi.pwd -set wifi.powersaving none|min|max -``` diff --git a/posadmesh-docs/migration.md b/posadmesh-docs/migration.md index 6e73c814..4959ac03 100644 --- a/posadmesh-docs/migration.md +++ b/posadmesh-docs/migration.md @@ -8,7 +8,7 @@ - `https://git.meshinfo.ru/shade/MeshCore-Posadmesh` -Эти шаги предназначены для существующих пользователей репитеров, переходящих на новую прошивку PosadMesh `*_repeater_observer`. +Эти шаги предназначены для существующих пользователей репитеров, переходящих на новую прошивку PosadMesh `*_repeater_mqtt`. Начните с загрузки подходящего релиза PosadMesh для вашей платы: diff --git a/posadmesh-docs/releases.md b/posadmesh-docs/releases.md index f2233874..d869bcc5 100644 --- a/posadmesh-docs/releases.md +++ b/posadmesh-docs/releases.md @@ -8,17 +8,14 @@ Если вы прошиваете прошивку PosadMesh впервые, самый простой путь: -1. Откройте . -2. Выберите прошивку, соответствующую тому, что будет делать устройство. -3. Выберите плату, точно соответствующую вашему железу. -4. Выберите версию. Флешер по умолчанию выбирает последний доступный релиз. -5. Выберите тип образа: - - `Update` для обычного обновления прошивки - - `Full Flash` для чистой прошивки полного образа -6. Нажмите `Flash Firmware`. -7. После прошивки завершите настройку через `Open MeshCore Config Panel` или `Serial Console`. +1. Откройте раздел релизов: . +2. Выберите трек: `repeater-mqtt`, `repeater-mqtt-espnow`, `repeater-mqtt-bridge` или `repeater-bridge-espnow`. +3. Скачайте файл, имя которого начинается с вашей платы. +4. Выберите тип образа: `.bin` для обычного обновления, `-merged.bin` для чистой прошивки. +5. Прошейте файл — см. раздел «Чем прошивать» ниже. +6. После прошивки настройте узел через локальную веб-панель репитера или последовательную консоль. -Если вы не уверены, какой трек вам нужен, начните с `companion-wifi` для companion-устройств, подключаемых к приложению, или с `observer-posadmesh` для стационарного репитера, который должен публиковать данные в MQTT. +Если вы не уверены, какой трек вам нужен, начните с `repeater-mqtt` для стационарного репитера, который должен публиковать данные в MQTT. ## Выбор трека @@ -26,14 +23,14 @@ PosadMesh публикует четыре трека релизов: | Трек | Используйте, когда | Суффикс имени файла прошивки | | --------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------ | -| `companion-wifi` | Нужно companion-устройство, которое подключается по Wi-Fi вместо BLE или USB. | `*_companion_radio_wifi` | -| `observer-posadmesh` | Нужен репитер с Wi-Fi и MQTT-аплинком, обычно для видимости в брокере, например в PosadMesh/CoreScope. | `*_repeater_observer` | +| `repeater-mqtt` | Нужен репитер с Wi-Fi и MQTT-аплинком, обычно для видимости в брокере, например в PosadMesh/CoreScope. | `*_repeater_mqtt` | | `repeater-bridge-espnow` | Нужен локальный ESP-NOW мост между соседними репитерами, без MQTT-аплинка и без веб-панели PosadMesh. | `*_repeater_bridge_espnow` | -| `observer-posadmesh-bridge-espnow` | Нужно, чтобы один репитер выполнял и MQTT-аплинк, и задачи локального ESP-NOW моста. | `*_repeater_observer_espnow` | +| `repeater-mqtt-espnow` | Нужно, чтобы один репитер выполнял и MQTT-аплинк, и задачи локального ESP-NOW моста. | `*_repeater_mqtt_espnow` | +| `repeater-mqtt-bridge` | Нужно, чтобы репитер пересылал raw-пакеты mesh между репитерами через ваш собственный MQTT-брокер. | `*_repeater_mqtt_bridge` | !!! note "Прошивка моста — это не WAN-мост" - Треки ESP-NOW моста предназначены для соединения двух соседних репитеров, работающих с разными конфигурациями радио MeshCore, например `Australia (Narrow)` и `Australia (Mid)`. + Треки ESP-NOW моста предназначены для соединения двух соседних репитеров, работающих с разными конфигурациями радио MeshCore — например, с разной полосой пропускания и SF. Треки моста не используют брокеры MQTT-аплинка для туннелирования mesh-трафика через интернет, WAN-каналы или VPN. @@ -43,27 +40,22 @@ PosadMesh публикует четыре трека релизов: Примеры: -- `heltec_v4_companion_radio_wifi-v1.14.1-abcdef.bin` -- `heltec_v4_repeater_observer-v1.15.0-posadmesh-v2026.5.1-abcdef.bin` -- `heltec_v4_repeater_observer-v1.15.0-posadmesh-v2026.5.1-abcdef-merged.bin` +- `heltec_v4_repeater_mqtt-v1.15.0-posadmesh-v2026.5.1-abcdef.bin` +- `heltec_v4_repeater_mqtt-v1.15.0-posadmesh-v2026.5.1-abcdef-merged.bin` - `heltec_v4_repeater_bridge_espnow-v1.15.0-abcdef.bin` -- `heltec_v4_repeater_observer_espnow-v1.15.0-posadmesh-v2026.5.1-abcdef.bin` +- `heltec_v4_repeater_mqtt_espnow-v1.15.0-posadmesh-v2026.5.1-abcdef.bin` +- `heltec_v4_repeater_mqtt_bridge-v1.15.0-posadmesh-v2026.7.0-abcdef.bin` Важен префикс платы/env: -- `*_companion_radio_wifi` -- `*_repeater_observer` +- `*_repeater_mqtt` - `*_repeater_bridge_espnow` -- `*_repeater_observer_espnow` +- `*_repeater_mqtt_espnow` +- `*_repeater_mqtt_bridge` ## Какой файл прошивать -Если вы используете , выберите тип образа во флешере: - -- `Update` = обычное обновление прошивки -- `Full Flash` = чистая прошивка полного образа - -Если вы скачиваете файлы вручную из раздела Releases на git.meshinfo.ru, вместо этого ориентируйтесь на имя файла: +Файлы берутся из раздела Releases на git.meshinfo.ru. Ориентируйтесь на имя файла: Используйте стандартный файл `.bin`, когда обновляете существующее устройство с тем же таргетом и той же разметкой разделов. @@ -76,37 +68,32 @@ PosadMesh публикует четыре трека релизов: ## Процесс прошивки -1. Выберите прошивку. -2. Выберите плату. -3. Выберите версию. Последняя версия выбирается по умолчанию. -4. Выберите тип образа: `Update` или `Full Flash`. -5. Нажмите `Flash Firmware`. -6. После прошивки используйте `Open MeshCore Config Panel` или `Serial Console` для настройки после прошивки, такой как Wi-Fi, MQTT, мост или параметры радио. +1. Скачайте нужный файл релиза для своей платы. +2. Определите чип платы (ESP32, ESP32-S3, ESP32-C6 или nRF52) — он виден по имени платы в имени файла. +3. Для чистой установки прошейте `-merged.bin` по адресу `0x0`, для обычного обновления — `.bin`. +4. Для nRF52-плат прошейте `.uf2` (копированием на диск в режиме загрузчика) или `.zip` через DFU. +5. После прошивки настройте узел: Wi-Fi, MQTT, мост или параметры радио. -## Рекомендуемый флешер +## Чем прошивать -Рекомендуемый флешер: +Отдельный флешер для этого не нужен: подойдёт любой инструмент, умеющий записать образ ESP32 по адресу `0x0`, например `esptool.py`: -- +```bash +esptool.py --chip esp32s3 write_flash 0x0 <имя-файла>-merged.bin +``` -Он имеет встроенную поддержку распространённых типов прошивок PosadMesh, а также может прошивать пользовательские файлы прошивок: +Практическое правило: -- прошивка `companion_radio_wifi` -- прошивка `repeater_observer` -- пользовательские файлы прошивок +- `.bin` = инкрементальное обновление +- `-merged.bin` = стирание и чистая прошивка -Для релизов моста используйте соответствующий пункт для моста, если флешер его показывает. В противном случае скачайте файл релиза самостоятельно и прошейте его как пользовательский файл прошивки. +Для релизов моста берите файл соответствующего трека (`repeater-mqtt-bridge` или `repeater-bridge-espnow`). -Рекомендуемое использование: +После прошивки есть два полезных пути настройки. -- используйте `Update`, когда обновляете существующее устройство -- используйте `Full Flash`, когда нужна чистая прошивка полного образа +### Панель настройки MeshCore -После прошивки во флешере доступны два полезных пути настройки. - -### Открыть панель конфигурации MeshCore - -Используйте `Open MeshCore Config Panel`, чтобы получить доступ к пошаговым инструментам настройки MeshCore: +Откройте — это пошаговые инструменты настройки MeshCore: - `Repeater Setup` - `Console` @@ -126,7 +113,7 @@ PosadMesh публикует четыре трека релизов: - flood max - некоторые расширенные настройки репитера -Начиная с `v1.2.1`, локальная веб-панель репитера также включает те же общие настройки репитера, поэтому пользователи могут выполнить первоначальную настройку там и возвращаться к ней для периодической диагностики или изменения конфигурации. На обсерверах, которым нужен максимальный запас heap, по-прежнему лучше снова отключить панель, когда вы закончили. +Начиная с `v1.2.1`, локальная веб-панель репитера также включает те же общие настройки репитера, поэтому пользователи могут выполнить первоначальную настройку там и возвращаться к ней для периодической диагностики или изменения конфигурации. На MQTT-репитерах, которым нужен максимальный запас heap, по-прежнему лучше снова отключить панель, когда вы закончили. #### Консоль @@ -139,15 +126,14 @@ PosadMesh публикует четыре трека релизов: Это относится к: -- `companion_radio_wifi` -- `repeater_observer` -- `repeater_observer_espnow` +- `repeater_mqtt` +- `repeater_mqtt_espnow` ### Последовательная консоль -Используйте `Serial Console`, когда хотите подключиться по USB и вводить команды CLI напрямую. +Подключитесь к устройству по USB и вводите команды CLI напрямую, например через `uv run pio device monitor --port --baud 115200`. -Флешер может подключаться к устройству по USB и отключаться от него. Он также включает готовые команды CLI, которые подставляются в поле ввода команд для упрощения настройки: +Полезные команды: - `set wifi.ssid` - `set wifi.pwd` @@ -160,9 +146,9 @@ PosadMesh публикует четыре трека релизов: ## Типовые первые шаги -### Обсервер +### MQTT-репитер -Сборки `repeater_observer` включают дополнения MQTT от PosadMesh. В зависимости от платы они также могут включать локальную веб-панель. +Сборки `repeater_mqtt` включают дополнения MQTT от PosadMesh. В зависимости от платы они также могут включать локальную веб-панель. Типовые первые шаги после прошивки: @@ -173,9 +159,9 @@ PosadMesh публикует четыре трека релизов: - при желании задайте `mqtt.owner` и `mqtt.email` - при желании включите пользовательский брокер как второй аплинк -### Обсервер ESP-NOW +### MQTT-репитер ESP-NOW -Сборки `repeater_observer_espnow` объединяют роль обсервера с поддержкой локального ESP-NOW моста. +Сборки `repeater_mqtt_espnow` объединяют роль MQTT-репитера с поддержкой локального ESP-NOW моста. Типовые первые шаги после прошивки: @@ -197,13 +183,3 @@ PosadMesh публикует четыре трека релизов: - задайте нужный пресет/конфигурацию радио MeshCore - задайте одинаковые канал моста и секрет для локальной пары моста - убедитесь, что оба репитера моста физически находятся достаточно близко для работы ESP-NOW - -### Companion-радио Wi-Fi - -Сборки `companion_radio_wifi` предназначены для companion-устройств, которые предоставляют интерфейс приложения по Wi-Fi вместо BLE или USB. - -Типовые первые шаги после прошивки: - -- задайте учётные данные Wi-Fi -- проверьте `get wifi.status` -- подключите ваше клиентское приложение к companion-устройству по Wi-Fi diff --git a/posadmesh-docs/web-panel.md b/posadmesh-docs/web-panel.md index 5031a61e..1341b667 100644 --- a/posadmesh-docs/web-panel.md +++ b/posadmesh-docs/web-panel.md @@ -1,6 +1,6 @@ # Веб-панель репитера -Эта страница предназначена для конечных пользователей, которые используют сборку PosadMesh `*_repeater_observer` с включённой локальной веб-панелью. +Эта страница предназначена для конечных пользователей, которые используют сборку PosadMesh `*_repeater_mqtt` с включённой локальной веб-панелью. Здесь описано, как открыть панель, что делает каждый раздел и чего ожидать при работе с ней на компьютере или мобильном устройстве. @@ -35,7 +35,7 @@ Рекомендации по эксплуатации: - используйте её для первоначальной настройки, редких изменений конфигурации и диагностики -- по завершении предпочитайте `set web off` на обсерверах, которым нужен максимальный запас +- по завершении предпочитайте `set web off` на MQTT-репитерах, которым нужен максимальный запас - это оставляет больше внутреннего heap для работы MQTT/WSS, особенно в конфигурациях с двумя брокерами ## Типовые задачи @@ -78,7 +78,7 @@ Вам потребуется: -- поддерживаемая сборка прошивки `*_repeater_observer` +- поддерживаемая сборка прошивки `*_repeater_mqtt` - настроенный на репитере Wi-Fi - репитер, подключённый к вашей локальной сети - пароль администратора репитера @@ -212,7 +212,7 @@ ## Настройки радио и регионы -Раздел `Radio Settings` включает селектор community-пресета радио, режим path hash и выпадающий список `Region (Australia)`, построенный из групп штатов, используемых селектором MQTT IATA. Список предустанавливается только тогда, когда у репитера уже есть соответствующий разрешённый регион `au-STATE`. Нажатие кнопки `Save` для региона создаёт и разрешает базовый регион `au` вместе с выбранным регионом штата, а затем сохраняет карту регионов командой `region save`. +Раздел `Radio Settings` включает селектор community-пресета радио, режим path hash и работу с деревом регионов узла. Список регионов строится из уже разрешённых на узле регионов; нажатие `Save` разрешает выбранный регион вместе с его базовым регионом и сохраняет карту регионов командой `region save`. ## Информация @@ -228,7 +228,7 @@ Типичный сценарий использования: -- MQTT-обсервер в помещении или в одном месте с другим устройством, когда соседний репитер уже выполняет работу по RF-ретрансляции +- MQTT-MQTT-репитер в помещении или в одном месте с другим устройством, когда соседний репитер уже выполняет работу по RF-ретрансляции - узел, который вы хотите использовать для передачи данных в MQTT, веб-статуса и диагностики, не добавляя при этом лишний трафик ретрансляции или advert-пакеты Когда режим Ghost Node включён, он: @@ -256,7 +256,7 @@ - Брокеры MQTT: переключатель **MeshCoreTel RU** и переключатель **Custom broker**, каждый включает или отключает свой брокер. Одновременно можно включить не более двух брокеров. - поля custom MQTT `host:port`, транспорт TCP/WSS, имя пользователя и пароль. -`UNSET - To be configured` — значение по умолчанию для новых установок обсервера, пока не появится реальное сохранённое значение. +`UNSET - To be configured` — значение по умолчанию для новых установок MQTT-репитера, пока не появится реальное сохранённое значение. Примечания: @@ -356,7 +356,7 @@ Если репитер уже подключён к Wi-Fi, OTA использует существующий адрес в локальной сети. Если Wi-Fi не подключён, репитер запускает точку доступа `MeshCore-OTA` и возвращает вместо этого адрес OTA. Если старый слушатель перенаправления не полностью освободил порт `80`, слушатель OTA повторяет попытки примерно до 30 секунд, после чего сдаётся. -Если более старая сборка отправляет вас на странное перенаправление после `start ota`, используйте веб-кнопку `Start OTA` для запуска обновления. Эта проблема с перенаправлением исправлена в `observer-eastmesh-v1.3.11`. +Если более старая сборка отправляет вас на странное перенаправление после `start ota`, используйте веб-кнопку `Start OTA` для запуска обновления. В актуальных сборках эта проблема с перенаправлением исправлена. ### Purge SD diff --git a/posadmesh-tools/publish-gitea-release.sh b/posadmesh-tools/publish-gitea-release.sh new file mode 100644 index 00000000..e32c96d0 --- /dev/null +++ b/posadmesh-tools/publish-gitea-release.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +# +# Publish built firmware files to a Gitea release. +# +# Usage: +# posadmesh-tools/publish-gitea-release.sh [release-title] [notes-file] +# +# Example: +# GITEA_TOKEN=... posadmesh-tools/publish-gitea-release.sh \ +# repeater-mqtt-v2026.10.0 out "Repeater MQTT v2026.10.0" RELEASE-NOTES.md +# +# Environment: +# GITEA_TOKEN (required) personal access token with write:repository scope +# GITEA_URL (optional) instance URL, default https://git.meshinfo.ru +# GITEA_REPO (optional) owner/repo, default shade/MeshCore-Posadmesh +# ASSET_GLOB (optional) only upload files matching this glob, e.g. '*_repeater_mqtt-v*' +# (handy when out/ holds several tracks: uplink, espnow, bridge) +# +# The script is idempotent: if the release already exists it reuses it and skips +# assets whose names are already attached. +# +# Requires: curl, awk. A working python (python3, python, or the project .venv) +# is used only to encode the release notes as JSON; without it the release is +# created with an empty body. + +set -euo pipefail + +tag="${1:-}" +dist="${2:-}" +title="${3:-$tag}" +notes_file="${4:-}" + +if [[ -z "$tag" || -z "$dist" ]]; then + echo "usage: $0 [release-title] [notes-file]" >&2 + exit 1 +fi + +if [[ ! -d "$dist" ]]; then + echo "error: distribution directory not found: $dist" >&2 + exit 1 +fi + +if [[ -z "${GITEA_TOKEN:-}" ]]; then + echo "error: GITEA_TOKEN is not set (needs write access to the repository)" >&2 + exit 1 +fi + +command -v curl >/dev/null 2>&1 || { echo "error: curl is required" >&2; exit 1; } + +base="${GITEA_URL:-https://git.meshinfo.ru}" +repo="${GITEA_REPO:-shade/MeshCore-Posadmesh}" +api="$base/api/v1/repos/$repo" +auth="Authorization: token $GITEA_TOKEN" +work="$(mktemp -d)" +trap 'rm -rf "$work"' EXIT + +# pick a python that actually runs (on Windows "python3" may be a Store stub) +PY="" +for candidate in .venv/Scripts/python.exe .venv/bin/python python3 python; do + if command -v "$candidate" >/dev/null 2>&1 || [[ -x "$candidate" ]]; then + if "$candidate" -c 'import json, sys' >/dev/null 2>&1; then + PY="$candidate" + break + fi + fi +done + +echo "repository : $repo" +echo "tag : $tag" +echo "files from : $dist" + +pattern="${ASSET_GLOB:-*}" +if [[ "$pattern" != "*" ]]; then + echo "asset glob : $pattern" +fi + +assets=() +while IFS= read -r -d '' f; do + assets+=("$f") +done < <(find "$dist" -maxdepth 1 -type f -name "$pattern" \( -name '*.bin' -o -name '*.uf2' -o -name '*.zip' -o -name '*.elf' \) -print0 | sort -z) + +if [[ ${#assets[@]} -eq 0 ]]; then + echo "error: no matching .bin/.uf2/.zip/.elf files found in $dist (glob: $pattern)" >&2 + exit 1 +fi +echo "assets : ${#assets[@]}" + +body_json='""' +if [[ -n "$notes_file" && -f "$notes_file" ]]; then + if [[ -n "$PY" ]]; then + body_json="$("$PY" -c 'import json,sys; print(json.dumps(open(sys.argv[1], encoding="utf-8").read()))' "$notes_file")" + else + echo "warning: no usable python found, release notes will be empty" >&2 + fi +fi + +payload_file="$work/release.json" +printf '{"tag_name":"%s","name":"%s","body":%s,"draft":false,"prerelease":false}' \ + "$tag" "$title" "$body_json" > "$payload_file" + +code=$(curl -sS -o "$work/release.json" -w '%{http_code}' \ + -X POST "$api/releases" -H "$auth" -H 'Content-Type: application/json' \ + --data-binary "@$payload_file" || true) + +release_id="" +if [[ "$code" == "201" ]]; then + release_id=$(grep -o '"id":[0-9]*' "$work/release.json" | head -n 1 | cut -d: -f2) + echo "created release id=$release_id" +else + echo "release create returned HTTP $code, looking up the existing release" + release_id=$(curl -sS "$api/releases/tags/$tag" -H "$auth" \ + | grep -o '"id":[0-9]*' | head -n 1 | cut -d: -f2 || true) + if [[ -z "$release_id" ]]; then + echo "error: cannot create or find a release for tag $tag" >&2 + head -c 400 "$work/release.json" >&2 || true + echo >&2 + exit 1 + fi + echo "reusing release id=$release_id" +fi + +existing=$(curl -sS "$api/releases/$release_id/assets" -H "$auth" \ + | grep -o '"name":"[^"]*"' | cut -d'"' -f4 || true) + +uploaded=0 +skipped=0 +for f in "${assets[@]}"; do + name="$(basename "$f")" + if grep -qxF "$name" <<<"$existing"; then + echo "skip $name (already attached)" + skipped=$((skipped + 1)) + continue + fi + code=$(curl -sS -o "$work/asset.json" -w '%{http_code}' \ + -X POST "$api/releases/$release_id/assets?name=$name" \ + -H "$auth" -F "attachment=@$f" || true) + if [[ "$code" == "201" ]]; then + echo "upload $name" + uploaded=$((uploaded + 1)) + else + echo "error: upload of $name failed with HTTP $code" >&2 + head -c 400 "$work/asset.json" >&2 || true + echo >&2 + exit 1 + fi +done + +echo "done: uploaded=$uploaded skipped=$skipped" +echo "release: $base/$repo/releases/tag/$tag" diff --git a/posadmesh-tools/web-heap-check.sh b/posadmesh-tools/web-heap-check.sh index 63456ad6..4e69ce97 100755 --- a/posadmesh-tools/web-heap-check.sh +++ b/posadmesh-tools/web-heap-check.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Web panel heap-health check for *_repeater_observer nodes. +# Web panel heap-health check for *_repeater_mqtt nodes. # # Reads memory / web / mqtt / wifi status over the HTTPS API, then (optionally) # hammers the panel the way a browser page-load does and re-reads memory to see diff --git a/release-notes.yml b/release-notes.yml index 523e2a7a..11150c79 100644 --- a/release-notes.yml +++ b/release-notes.yml @@ -1,9 +1,12 @@ schema_version: 1 tracks: + # снят с выпуска в 2026.10.0: линия companion-прошивок удалена из проекта, + # трек остаётся в реестре для исторических записей релизов - companion-wifi - repeater-bridge-espnow - - observer-posadmesh - - observer-posadmesh-bridge-espnow + - repeater-mqtt + - repeater-mqtt-espnow + - repeater-mqtt-bridge generated_from: "Adjacent git tag comparisons plus non-merge commit subjects." releases: @@ -186,7 +189,7 @@ releases: text: "Included upstream board, radio, display, and platform fixes from MeshCore dev." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.5.1" tag: "observer-eastmesh-v2026.5.1" date: "2026-05-23" @@ -198,14 +201,14 @@ releases: text: "Renamed the EastMesh MQTT release tag format from `repeater-mqtt-eastmesh-v*` to `observer-eastmesh-v*`." - type: changed area: build - text: "Renamed `*_repeater_mqtt` PlatformIO environments and release artifact prefixes to `*_repeater_observer`." + text: "Renamed `*_repeater_mqtt` PlatformIO environments and release artifact prefixes to `*_repeater_mqtt`." - type: docs area: docs text: "Updated EastMesh release, local build, board, web panel, API, and CLI documentation to use Observer naming." breaking_changes: - "The EastMesh MQTT release tag format and PlatformIO target suffix changed to Observer naming." - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.0" tag: "observer-eastmesh-v2026.6.0" date: "2026-06-03" @@ -232,7 +235,7 @@ releases: text: "Merged upstream MeshCore dev updates including sensor handling, RAK4631 BME680/BSEC support, documentation refreshes, and board/platform fixes." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.1" tag: "observer-eastmesh-v2026.6.1" date: "2026-06-07" @@ -250,7 +253,7 @@ releases: text: "Updated EastMesh custom CLI docs for the new `flood.max.advert` command." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.2" tag: "observer-eastmesh-v2026.6.2" date: "2026-06-07" @@ -286,7 +289,7 @@ releases: text: "Hardened OTA startup by binding before reporting success and falling back to alternate ports when port 80 is still being released." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.3" tag: "observer-eastmesh-v2026.6.3" date: "2026-06-09" @@ -310,7 +313,7 @@ releases: text: "Documented custom MQTT TCP/WSS configuration in the web panel and custom CLI guides." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.4" tag: "observer-eastmesh-v2026.6.4" date: "2026-06-23" @@ -339,7 +342,7 @@ releases: - "`get mqtt.status` output changed from per-broker fields to `p:`/`s:` broker slots; anything parsing the previous format must be updated." - "Saved LetsMesh EU/US broker selections are cleared once on upgrade; re-enable a broker such as MeshMapper if a second uplink is required." - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.5" tag: "observer-eastmesh-v2026.6.5" date: "2026-06-26" @@ -363,7 +366,7 @@ releases: text: "Documented the Waev broker in the README and custom CLI guides." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.6.6" tag: "observer-eastmesh-v2026.6.6" date: "2026-06-27" @@ -375,7 +378,7 @@ releases: text: "Added `packets_sent` and `packets_received` counters to the MQTT `status` payload `stats` object, reporting cumulative radio TX/RX packet totals to align with the Waev/MeshMapper status schema." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.7.0" tag: "observer-eastmesh-v2026.7.0" date: "2026-07-19" @@ -397,7 +400,7 @@ releases: breaking_changes: - "The saved settings layout changed; devices upgrading from 2026.6.6 or earlier may need EastMesh-specific settings (such as fan control and bridge peer) and recently added radio settings reconfigured." - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.8.0" tag: "observer-eastmesh-v2026.8.0" date: "2026-08-09" @@ -416,7 +419,7 @@ releases: breaking_changes: - "Saved settings move to the new `prefs.json` format on first boot; downgrading to earlier firmware afterwards reverts the device to the old (pre-migration) settings file." - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.8.1" tag: "observer-eastmesh-v2026.8.1" date: "2026-08-09" @@ -431,7 +434,7 @@ releases: text: "Made a failed or absent SH1106 display boot the node headless instead of crash-looping: display operations are now safe no-ops when the boot-time initialisation did not succeed." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.8.2" tag: "observer-eastmesh-v2026.8.2" date: "2026-08-15" @@ -458,7 +461,7 @@ releases: text: "Adopted upstream's SH1106 display address fallback (0x3C/0x3D) so board revisions with the other SA0 strap setting still get a working display, while keeping the EastMesh T-Beam S3 Supreme bring-up order and headless fallback." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.8.3" tag: "observer-eastmesh-v2026.8.3" date: "2026-08-23" @@ -485,19 +488,25 @@ releases: text: "Added `eastmesh-tools/web-heap-check.sh` to read heap and service health over the HTTPS API and optionally stress the web panel with browser-style bursts." breaking_changes: [] - - track: observer-posadmesh + - track: repeater-mqtt version: "2026.10.0" - tag: "observer-posadmesh-v2026.10.0" + tag: "repeater-mqtt-v2026.10.0" date: "2026-10-07" previous_version: "2026.8.3" - summary: "Полный рефакторинг под PosadMesh: переименованы папки, скрипты, треки и теги, документация переведена на русский, удалены брокеры waev/meshmapper/letsmesh, репозиторий переехал на git.meshinfo.ru с локальной сборкой релизов, база обновлена до upstream MeshCore v1.17.1." + summary: "Полный рефакторинг под PosadMesh: переименованы папки, скрипты, цели сборки и треки (observer → mqtt), документация переведена на русский, удалены брокеры waev/meshmapper/letsmesh и линия companion-прошивок, репозиторий переехал на git.meshinfo.ru с локальной сборкой релизов, база обновлена до upstream MeshCore v1.17.1." changes: - type: changed area: upstream text: "База прошивки обновлена до upstream MeshCore v1.17.1." - type: changed area: release - text: "Проект целиком переименован в PosadMesh: папки и скрипты (`eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`), треки релизов (`observer-eastmesh*` → `observer-posadmesh*`), форматы тегов (`observer-posadmesh-v*`, `observer-posadmesh-bridge-espnow-v*`, `observer-posadmesh-bridge-mqtt-v*`), суффикс версии сборки (`-posadmesh-`) и переменная версии релиза (`EASTMESH_VERSION` → `POSADMESH_VERSION`)." + text: "Проект переименован в PosadMesh и переведён на имена MQTT: папки и скрипты (`eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`), цели сборки (`*_repeater_observer*` → `*_repeater_mqtt*`), треки релизов (`observer-eastmesh*` → `repeater-mqtt*`), форматы тегов (`repeater-mqtt-v*`, `repeater-mqtt-espnow-v*`, `repeater-mqtt-bridge-v*`), суффикс версии сборки (`-posadmesh-`) и переменная версии релиза (`EASTMESH_VERSION` → `POSADMESH_VERSION`)." + - type: changed + area: release + text: "Удалена линия companion-прошивок: трек `companion-wifi` и команды сборки companion убраны из проекта, остаются только MQTT-сборки. Цели и код companion в upstream-оверлеях не изменялись." + - type: fixed + area: build + text: "Сборка по группам снова работает: команды искали окружения по устаревшим суффиксам `_repeater_observer*`, а на Windows имена окружений приходили с символом `\\r`, из-за чего не находилось ни одной цели. Теперь используются реальные суффиксы `_repeater_mqtt*`, вывод PlatformIO очищается от `\r`, добавлены команды `build-mqtt-firmwares` (все MQTT-треки) и `list-mqtt`." - type: docs area: docs text: "Документация переведена на русский язык: `posadmesh-docs/*.md`, `README.md`, `RELEASE.md` и `AGENTS.md`. Команды, их вывод, код, пути и идентификаторы оставлены без перевода." @@ -520,11 +529,13 @@ releases: area: web text: "Исправлен разбор дерева регионов: завершающая буква `F` в имени региона срезалась, из-за чего `region allowf`, `region denyf` и `region remove` не работали для таких имён." breaking_changes: - - "Формат тегов меняется на `observer-posadmesh-*`: прежние теги `observer-eastmesh-*` больше ничего не запускают и остаются только как история." + - "Формат тегов меняется на `repeater-mqtt-*`: прежние теги `observer-eastmesh-*` больше ничего не запускают и остаются только как история." - "`EASTMESH_VERSION` переименована в `POSADMESH_VERSION`: локальные скрипты со старым именем соберут версию без суффикса PosadMesh." - "Команды `mqtt.meshmapper`, `mqtt.waev` и `mqtt.letsmesh-*` удалены; сохранённые выборы этих брокеров сбрасываются при обновлении." - "Документация больше не публикуется отдельным сайтом и читается в веб-интерфейсе git.meshinfo.ru." - - track: observer-posadmesh-bridge-espnow + - "Линия companion-прошивок удалена: трек `companion-wifi` и companion-сборки больше не выпускаются." + + - track: repeater-mqtt-espnow version: "2026.5.1" tag: "observer-eastmesh-bridge-espnow-v2026.5.1" date: "2026-05-23" @@ -536,14 +547,14 @@ releases: text: "Renamed the EastMesh MQTT bridge release tag format from `repeater-mqtt-bridge-eastmesh-v*` to `observer-eastmesh-bridge-espnow-v*`." - type: changed area: build - text: "Renamed `*_repeater_mqtt_bridge` PlatformIO environments and release artifact prefixes to `*_repeater_observer_espnow`." + text: "Renamed `*_repeater_mqtt_bridge` PlatformIO environments and release artifact prefixes to `*_repeater_mqtt_espnow`." - type: docs area: docs text: "Updated EastMesh release, local build, board, and CLI documentation to use Observer ESP-NOW naming." breaking_changes: - "The EastMesh MQTT bridge release tag format and PlatformIO target suffix changed to Observer ESP-NOW naming." - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.0" tag: "observer-eastmesh-bridge-espnow-v2026.6.0" date: "2026-06-03" @@ -570,7 +581,7 @@ releases: text: "Merged upstream MeshCore dev updates including sensor handling, RAK4631 BME680/BSEC support, documentation refreshes, and board/platform fixes." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.1" tag: "observer-eastmesh-bridge-espnow-v2026.6.1" date: "2026-06-07" @@ -588,7 +599,7 @@ releases: text: "Updated EastMesh custom CLI docs for the new `flood.max.advert` command." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.2" tag: "observer-eastmesh-bridge-espnow-v2026.6.2" date: "2026-06-07" @@ -624,7 +635,7 @@ releases: text: "Hardened OTA startup by binding before reporting success and falling back to alternate ports when port 80 is still being released." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.3" tag: "observer-eastmesh-bridge-espnow-v2026.6.3" date: "2026-06-09" @@ -648,7 +659,7 @@ releases: text: "Documented custom MQTT TCP/WSS configuration in the web panel and custom CLI guides." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.4" tag: "observer-eastmesh-bridge-espnow-v2026.6.4" date: "2026-06-23" @@ -677,7 +688,7 @@ releases: - "`get mqtt.status` output changed from per-broker fields to `p:`/`s:` broker slots; anything parsing the previous format must be updated." - "Saved LetsMesh EU/US broker selections are cleared once on upgrade; re-enable a broker such as MeshMapper if a second uplink is required." - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.5" tag: "observer-eastmesh-bridge-espnow-v2026.6.5" date: "2026-06-26" @@ -701,7 +712,7 @@ releases: text: "Documented the Waev broker in the README and custom CLI guides." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.6.6" tag: "observer-eastmesh-bridge-espnow-v2026.6.6" date: "2026-06-27" @@ -713,7 +724,7 @@ releases: text: "Added `packets_sent` and `packets_received` counters to the MQTT `status` payload `stats` object, reporting cumulative radio TX/RX packet totals to align with the Waev/MeshMapper status schema." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.7.0" tag: "observer-eastmesh-bridge-espnow-v2026.7.0" date: "2026-07-19" @@ -735,7 +746,7 @@ releases: breaking_changes: - "The saved settings layout changed; devices upgrading from 2026.6.6 or earlier may need EastMesh-specific settings (such as fan control and bridge peer) and recently added radio settings reconfigured." - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.8.0" tag: "observer-eastmesh-bridge-espnow-v2026.8.0" date: "2026-08-09" @@ -754,7 +765,7 @@ releases: breaking_changes: - "Saved settings move to the new `prefs.json` format on first boot; downgrading to earlier firmware afterwards reverts the device to the old (pre-migration) settings file." - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.8.1" tag: "observer-eastmesh-bridge-espnow-v2026.8.1" date: "2026-08-09" @@ -769,7 +780,7 @@ releases: text: "Made a failed or absent SH1106 display boot the node headless instead of crash-looping: display operations are now safe no-ops when the boot-time initialisation did not succeed." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.8.2" tag: "observer-eastmesh-bridge-espnow-v2026.8.2" date: "2026-08-15" @@ -795,7 +806,7 @@ releases: area: board text: "Adopted upstream's SH1106 display address fallback (0x3C/0x3D) so board revisions with the other SA0 strap setting still get a working display, while keeping the EastMesh T-Beam S3 Supreme bring-up order and headless fallback." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.8.3" tag: "observer-eastmesh-bridge-espnow-v2026.8.3" date: "2026-08-23" @@ -822,19 +833,25 @@ releases: text: "Added `eastmesh-tools/web-heap-check.sh` to read heap and service health over the HTTPS API and optionally stress the web panel with browser-style bursts." breaking_changes: [] - - track: observer-posadmesh-bridge-espnow + - track: repeater-mqtt-espnow version: "2026.10.0" - tag: "observer-posadmesh-bridge-espnow-v2026.10.0" + tag: "repeater-mqtt-espnow-v2026.10.0" date: "2026-10-07" previous_version: "2026.8.3" - summary: "Полный рефакторинг под PosadMesh в сборках обсервера с ESP-NOW мостом: переименованы папки, скрипты, треки и теги, документация переведена на русский, удалены брокеры waev/meshmapper/letsmesh, репозиторий переехал на git.meshinfo.ru с локальной сборкой релизов, база обновлена до upstream MeshCore v1.17.1." + summary: "Полный рефакторинг под PosadMesh в сборках MQTT-репитера с ESP-NOW мостом: переименованы папки, скрипты, цели сборки и треки (observer → mqtt), документация переведена на русский, удалены брокеры waev/meshmapper/letsmesh и линия companion-прошивок, репозиторий переехал на git.meshinfo.ru с локальной сборкой релизов, база обновлена до upstream MeshCore v1.17.1." changes: - type: changed area: upstream text: "База прошивки обновлена до upstream MeshCore v1.17.1." - type: changed area: release - text: "Проект целиком переименован в PosadMesh: папки и скрипты (`eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`), треки релизов (`observer-eastmesh*` → `observer-posadmesh*`), форматы тегов (`observer-posadmesh-v*`, `observer-posadmesh-bridge-espnow-v*`, `observer-posadmesh-bridge-mqtt-v*`), суффикс версии сборки (`-posadmesh-`) и переменная версии релиза (`EASTMESH_VERSION` → `POSADMESH_VERSION`)." + text: "Проект переименован в PosadMesh и переведён на имена MQTT: папки и скрипты (`eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`), цели сборки (`*_repeater_observer*` → `*_repeater_mqtt*`), треки релизов (`observer-eastmesh*` → `repeater-mqtt*`), форматы тегов (`repeater-mqtt-v*`, `repeater-mqtt-espnow-v*`, `repeater-mqtt-bridge-v*`), суффикс версии сборки (`-posadmesh-`) и переменная версии релиза (`EASTMESH_VERSION` → `POSADMESH_VERSION`)." + - type: changed + area: release + text: "Удалена линия companion-прошивок: трек `companion-wifi` и команды сборки companion убраны из проекта, остаются только MQTT-сборки. Цели и код companion в upstream-оверлеях не изменялись." + - type: fixed + area: build + text: "Сборка по группам снова работает: команды искали окружения по устаревшим суффиксам `_repeater_observer*`, а на Windows имена окружений приходили с символом `\\r`, из-за чего не находилось ни одной цели. Теперь используются реальные суффиксы `_repeater_mqtt*`, вывод PlatformIO очищается от `\r`, добавлены команды `build-mqtt-firmwares` (все MQTT-треки) и `list-mqtt`." - type: docs area: docs text: "Документация переведена на русский язык: `posadmesh-docs/*.md`, `README.md`, `RELEASE.md` и `AGENTS.md`. Команды, их вывод, код, пути и идентификаторы оставлены без перевода." @@ -857,8 +874,8 @@ releases: area: web text: "Исправлен разбор дерева регионов: завершающая буква `F` в имени региона срезалась, из-за чего `region allowf`, `region denyf` и `region remove` не работали для таких имён." breaking_changes: - - "Формат тегов меняется на `observer-posadmesh-*`: прежние теги `observer-eastmesh-*` больше ничего не запускают и остаются только как история." + - "Формат тегов меняется на `repeater-mqtt-*`: прежние теги `observer-eastmesh-*` больше ничего не запускают и остаются только как история." - "`EASTMESH_VERSION` переименована в `POSADMESH_VERSION`: локальные скрипты со старым именем соберут версию без суффикса PosadMesh." - "Команды `mqtt.meshmapper`, `mqtt.waev` и `mqtt.letsmesh-*` удалены; сохранённые выборы этих брокеров сбрасываются при обновлении." - "Документация больше не публикуется отдельным сайтом и читается в веб-интерфейсе git.meshinfo.ru." - + - "Линия companion-прошивок удалена: трек `companion-wifi` и companion-сборки больше не выпускаются."