451 lines
41 KiB
Markdown
451 lines
41 KiB
Markdown
# MeshCore-Posadmesh
|
||
|
||
PosadMesh — форк проекта EastMesh, который, в свою очередь, основан на официальной прошивке MeshCore:
|
||
|
||
- <https://github.com/meshcore-dev/MeshCore>
|
||
|
||
Прошивку дорабатывают энтузиасты из Сергиева Посада; проект ориентирован на работу с сайтом <https://meshcoretel.ru>.
|
||
|
||
Благодарность Scott Powell / Ripple Radios и участникам MeshCore за оригинальную прошивку и основу проекта.
|
||
|
||
Этот репозиторий предоставляет адаптированные сборки MeshCore: прошивку MQTT-репитера, которая публикует телеметрию в mesh-сеть MeshCoreTel.
|
||
|
||
**Сборки MQTT-репитера передают телеметрию на <https://meshcoretel.ru>** — укажите координаты узла и радиопараметры своего региона, чтобы узел появился на карте и в связях. Для Москвы (MOW) это 868,731 МГц, полоса 62,5 кГц, SF7, CR7, хэш пути 2 байта.
|
||
|
||
## Что добавляет этот репозиторий
|
||
|
||
- таргеты прошивки `*_repeater_mqtt` с:
|
||
- встроенным WiFi
|
||
- MQTT-аплинком к курируемому брокеру MeshCoreTel и дополнительно опциональным собственным брокером (TCP или WSS)
|
||
- опциональной локальной панелью конфигурации HTTPS на поддерживаемых таргетах ESP32
|
||
- таргеты прошивки `*_repeater_mqtt_espnow`, добавляющие локальный мост ESP-NOW mesh
|
||
- таргеты прошивки `*_repeater_bridge_espnow` для обычного ESP-NOW-моста репитера в стиле upstream, без MQTT-аплинка и веб-панели PosadMesh
|
||
- специфичные для 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:
|
||
|
||
- <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/releases>
|
||
|
||
Руководство по прошивке, в том числе когда использовать `.bin`, а когда `-merged.bin`, см. в:
|
||
|
||
- [posadmesh-docs/releases.md](./posadmesh-docs/releases.md)
|
||
|
||
Веб-прошивальщик MeshCoreTel (в том числе прошивки наблюдателя и настройка радиопараметров):
|
||
|
||
- <https://meshcoretel.ru/ru/flasher>
|
||
|
||
## Установка uv
|
||
|
||
Этот репозиторий использует `uv` для Python-инструментов и запускает PlatformIO через `uv run`.
|
||
|
||
Официальная документация по установке:
|
||
|
||
- <https://docs.astral.sh/uv/getting-started/installation/>
|
||
|
||
Распространённые способы установки:
|
||
|
||
macOS и Linux:
|
||
|
||
```bash
|
||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||
```
|
||
|
||
Homebrew:
|
||
|
||
```bash
|
||
brew install uv
|
||
```
|
||
|
||
Windows PowerShell:
|
||
|
||
```powershell
|
||
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
||
```
|
||
|
||
## Типовое использование репозитория
|
||
|
||
Установка инструментов:
|
||
|
||
```bash
|
||
uv sync
|
||
```
|
||
|
||
Список доступных таргетов сборки:
|
||
|
||
```bash
|
||
bash posadmesh-build.sh list
|
||
```
|
||
|
||
Сборка одного таргета:
|
||
|
||
```bash
|
||
uv run pio run -e heltec_v4_repeater_mqtt
|
||
uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt
|
||
```
|
||
|
||
Сборка с релизными метаданными версии:
|
||
|
||
```bash
|
||
export FIRMWARE_VERSION=v1.15.0
|
||
export POSADMESH_VERSION=v2026.5.1
|
||
bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
|
||
```
|
||
|
||
Прошивка таргета:
|
||
|
||
```bash
|
||
uv run pio run -e heltec_v4_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX
|
||
```
|
||
|
||
Открыть последовательный монитор:
|
||
|
||
```bash
|
||
uv run pio device monitor --port /dev/tty.usbmodemXXXX --baud 115200
|
||
```
|
||
|
||
Локальная сборка документации:
|
||
|
||
```bash
|
||
uv run --group docs zensical serve
|
||
uv run --group docs zensical build
|
||
```
|
||
|
||
## Ключевые файлы
|
||
|
||
- [`posadmesh-build.sh`](./posadmesh-build.sh)
|
||
- обёртка локальной/релизной сборки PosadMesh
|
||
- внедряет `FIRMWARE_VERSION`, `CLIENT_VERSION` и релизные метаданные PosadMesh
|
||
- [`build.sh`](./build.sh)
|
||
- обёртка сборки upstream MeshCore, сохранённая для уменьшения будущих конфликтов слияния
|
||
- [`pyproject.toml`](./pyproject.toml)
|
||
- Python-инструменты и зависимости для документации
|
||
- [`platformio.ini`](./platformio.ini)
|
||
- корневой конфиг PlatformIO и вспомогательные скрипты ESP32
|
||
- [`variants/posadmesh_mqtt/platformio.ini`](./variants/posadmesh_mqtt/platformio.ini)
|
||
- общие определения окружений 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 репитера
|
||
- [`RELEASE.md`](./RELEASE.md)
|
||
- форматы тегов и порядок выпуска релизов
|
||
- [`posadmesh-docs/`](./posadmesh-docs)
|
||
- документация, ориентированная на PosadMesh, для чтения в веб-интерфейсе git.meshinfo.ru
|
||
- [`docs/`](./docs)
|
||
- документация upstream MeshCore, сохранённая для уменьшения будущих конфликтов слияния
|
||
|
||
## Ключевые возможности PosadMesh
|
||
|
||
### Дополнения MQTT для репитера
|
||
|
||
- поддержка курируемого брокера:
|
||
- `meshcoretel`
|
||
- опциональный собственный брокер (TCP или MQTT поверх WSS по пути `/mqtt`) с именем пользователя и паролем
|
||
- элементы управления в CLI для:
|
||
- учётных данных WiFi
|
||
- энергосбережения WiFi
|
||
- отчётов о заряде батареи платы на поддерживаемых таргетах
|
||
- включения MQTT-эндпоинта
|
||
- публикации MQTT-пакетов и raw-данных
|
||
- публичного ключа и email владельца
|
||
- включения локальной веб-панели
|
||
|
||
### MQTT-мост mesh (MQTT-репитер)
|
||
|
||
Трек релиза `repeater-mqtt-bridge` (`*_repeater_mqtt_bridge`) выполняет мостовую передачу **raw-пакетов mesh** между репитерами через **peer-брокер MQTT, который запускаете вы сами** (например, Mosquitto на ПК в локальной сети). Это **не** то же самое, что MQTT-аплинк к курируемому брокеру MeshCoreTel:
|
||
|
||
| | MQTT-аплинк (MQTT-репитер) | MQTT-мост mesh |
|
||
| --- | --- | --- |
|
||
| Назначение | Публикация JSON-телеметрии в курируемые брокеры | Передача зашифрованных пакетов mesh между радиоустройствами |
|
||
| Брокеры | `meshcoretel`, собственный брокер | Ваш peer-брокер (`host:port`, TCP) |
|
||
| Топик | `meshcore/<iata>/...` (по IATA) | `meshcore/bridge/packets` (фиксированный) |
|
||
| По умолчанию в bridge-сборках | Выключено по умолчанию (включается в веб-панели / CLI) | Включено, когда включён `bridge.enabled` |
|
||
|
||
**Первый поддерживаемый таргет:** `Xiao_S3_WIO_repeater_mqtt_bridge`
|
||
|
||
**Связанный трек:** `repeater-mqtt-espnow` (`*_repeater_mqtt_espnow`) использует ESP-NOW вместо MQTT для локальной мостовой передачи.
|
||
|
||
Пример сборки:
|
||
|
||
```bash
|
||
uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge
|
||
```
|
||
|
||
Прошивка (обновление):
|
||
|
||
```bash
|
||
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_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 (локальная сеть)
|
||
|
||
Каждый узел моста подключается к **одному и тому же** peer-брокеру с **одними и теми же** учётными данными и `bridge.secret`.
|
||
|
||
1. Установите [Mosquitto](https://mosquitto.org/download/) на машине, доступной с обоих репитеров (например, `192.168.1.145`).
|
||
2. Отредактируйте `mosquitto.conf` (при установке службой Windows: `C:\Program Files\Mosquitto\mosquitto.conf`) и добавьте:
|
||
|
||
```conf
|
||
listener 1883 0.0.0.0
|
||
allow_anonymous false
|
||
password_file C:\Program Files\Mosquitto\passwd
|
||
```
|
||
|
||
Только для лабораторных/тестовых целей `allow_anonymous true` работает и без файла паролей.
|
||
|
||
3. Создайте пользователя (CMD от имени администратора):
|
||
|
||
```cmd
|
||
cd "C:\Program Files\Mosquitto"
|
||
mosquitto_passwd -c passwd bridgeuser
|
||
```
|
||
|
||
4. Перезапустите **службу** (не запускайте второй `mosquitto -v`, пока служба занимает порт 1883):
|
||
|
||
```powershell
|
||
Restart-Service mosquitto
|
||
```
|
||
|
||
5. Убедитесь, что прослушивание идёт в локальной сети, и откройте брандмауэр:
|
||
|
||
```cmd
|
||
netstat -ano | findstr ":1883"
|
||
```
|
||
|
||
Ожидается `0.0.0.0:1883`, а не только `127.0.0.1:1883`.
|
||
|
||
6. Проверьте с другой машины:
|
||
|
||
```cmd
|
||
mosquitto_pub -h 192.168.1.145 -p 1883 -u bridgeuser -P your-password -t test -m hello
|
||
mosquitto_sub -h 192.168.1.145 -p 1883 -u bridgeuser -P your-password -t meshcore/bridge/packets -v
|
||
```
|
||
|
||
Двоичный мусор в `meshcore/bridge/packets` — это нормально: payload — это XOR-зашифрованные кадры mesh, а не текст.
|
||
|
||
#### Настройка репитера
|
||
|
||
Настройте **оба** узла моста одинаково для доступа к брокеру; используйте один и тот же `bridge.secret` на каждом узле группы моста.
|
||
|
||
CLI через последовательный порт или веб-панель:
|
||
|
||
```text
|
||
set wifi.ssid YourNetwork
|
||
set wifi.pwd YourWiFiPassword
|
||
set bridge.peer.host 192.168.1.145
|
||
set bridge.peer.port 1883
|
||
set bridge.peer.username bridgeuser
|
||
set bridge.peer.password your-password
|
||
set bridge.secret your-shared-bridge-secret
|
||
```
|
||
|
||
Веб-панель: **Настройки MQTT** → **Peer MQTT моста mesh** (`host:port`, имя пользователя, пароль). Этот раздел появляется, когда `get bridge.type` возвращает `mqtt`.
|
||
|
||
Полезные проверки:
|
||
|
||
```text
|
||
get bridge.type
|
||
get bridge.peer.host
|
||
get bridge.enabled
|
||
```
|
||
|
||
Пароль администратора по умолчанию в dev-сборках обычно `password`, если вы его не изменили.
|
||
|
||
Пакеты используют магическое значение `0xC03E`, контрольную сумму Fletcher, XOR-шифрование с `bridge.secret`, затем публикацию/подписку в `meshcore/bridge/packets`. Обнаружение дубликатов ограничивает циклы, когда оба узла видят один и тот же трафик.
|
||
|
||
Подробнее:
|
||
|
||
- [Пользовательский CLI — настройки MQTT-моста](./posadmesh-docs/custom-cli.md)
|
||
- [Веб-панель — настройки MQTT и поля peer моста](./posadmesh-docs/web-panel.md)
|
||
- [Релизы — сравнение треков](./posadmesh-docs/releases.md)
|
||
|
||
### Локальная веб-панель
|
||
|
||
На поддерживаемых таргетах ESP32 `*_repeater_mqtt` репитер может предоставлять локальную панель конфигурации HTTPS по WiFi.
|
||
|
||
Возможности:
|
||
|
||
- доступ с проверкой пароля по существующему паролю администратора репитера
|
||
- выполнение CLI только из белого списка
|
||
- сгруппированные быстрые действия
|
||
- светлая и тёмная темы
|
||
- опциональное отключение через `set web off`
|
||
|
||
Рекомендуется использовать для первичной настройки и периодической диагностики. При развёртывании MQTT-репитеров отключайте панель по завершении, если нужен максимальный запас heap для MQTT.
|
||
|
||
### Настройка с дисплея и кнопки
|
||
|
||
На платах с дисплеем и кнопкой мастер настройки доступен прямо на устройстве — без компьютера и телефона: двойное нажатие кнопки из экрана состояния открывает меню. Настраиваются координаты, частота, полоса, CR и SF по отдельности, мощность передатчика, пересылка пакетов, размер хэша пути, интервалы advert и flood advert, лимит flood. Внизу меню — `Save & exit`. Значения применяются через тот же обработчик, что и последовательный CLI, поэтому проверка и сохранение одинаковы для обоих путей, а ответ устройства показывается на экране.
|
||
|
||
Координаты вводятся в формате `xx.xxxx yy.yyyy`, частота — как `868.731 MHz` (целые МГц шагом 1, кГц по разрядам), полоса — как `062.50 kHz`, поразрядно: длинное нажатие входит в правку цифры или позиции, короткое — `+1`, двойное — `−1`, длинное — применить, короткое после применения — перейти к следующей цифре; внизу экранов частоты и полосы — пункт `Save & exit`, после сохранения возврат в меню.
|
||
|
||
Подробное описание кнопок, меню и ограничений — в [Настройке с дисплея и кнопки](./posadmesh-docs/device-setup.md), там же иллюстрации всех экранов. Та же страница с картинками опубликована в вики проекта: <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/wiki/Device-Setup>.
|
||
|
||

|
||
|
||
## Сборка и релизы
|
||
|
||
Репозиторий живёт на <https://git.meshinfo.ru/shade/MeshCore-Posadmesh>.
|
||
|
||
Собственные 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 и не используются.
|
||
|
||
Текущие треки релизов:
|
||
|
||
- `repeater-bridge-espnow`
|
||
- `repeater-mqtt`
|
||
- `repeater-mqtt-espnow`
|
||
- `repeater-mqtt-bridge`
|
||
|
||
## Теги релизов
|
||
|
||
Текущие теги релизов:
|
||
|
||
```bash
|
||
git tag repeater-bridge-espnow-v1.15.0
|
||
git tag repeater-mqtt-v2026.5.1
|
||
git tag repeater-mqtt-espnow-v2026.5.1
|
||
git tag repeater-mqtt-bridge-v2026.7.0
|
||
```
|
||
|
||
`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-тегами не переписывали).
|
||
|
||
**Локальный мастер настройки**
|
||
|
||
- добавлен мастер настройки репитера ([`examples/simple_repeater/UITask.*`](./examples/simple_repeater/UITask.cpp)): работает на любой цели, у которой есть дисплей и кнопка, и полностью исключается препроцессором там, где их нет;
|
||
- вход в мастер — двойное нажатие кнопки из экрана состояния (на узле без имени мастер открывается сам после заставки); выход — пункт `Save & exit`;
|
||
- ввод координат в формате `xx.xxxx yy.yyyy`: длинное нажатие — правка текущей цифры, короткое — `+1`, двойное — `−1`, длинное — применить, короткое после применения — следующая цифра; после всех 12 цифр — экран сохранения;
|
||
- радиопараметры настраиваются по отдельности: `Frequency` (значение `868.731 MHz`: целые МГц шагом ±1, кГц по разрядам), `Bandwidth` (`062.50 kHz`, поразрядно), `CR` и `SF` (шагом); внизу экранов частоты и полосы — пункт `Save & exit`, после сохранения возврат в меню; любой из четырёх пунктов отправляет `set radio <частота>,<полоса>,<sf>,<cr>`, поэтому остальные значения сохраняются;
|
||
- остальные пункты: мощность TX, пересылка пакетов, размер хэша пути, интервалы advert и flood advert, лимит flood; внизу меню — `Save & exit`;
|
||
- добавлены экран батареи и калибровка ADC: пункт `Battery` показывает напряжение, процент заряда (от платы, иначе линейная оценка по её границам) и полоску, короткое нажатие выводит «сырое» значение АЦП в милливольтах; пункт `ADC` правит множитель ADC поразрядно в формате `x.xx` (как полоса) и показывает измеренное напряжение прямо под цифрами, поэтому калибровать можно на экране; значение применяется командой `set adc.multiplier`, а `0.00` возвращает заводской расчёт платы;
|
||
- значения применяются через тот же `CommonCLI`, что и последовательный порт, а ответ устройства (`OK` или текст ошибки) выводится на экран;
|
||
- документация с иллюстрациями: страница [Настройка с дисплея и кнопки](./posadmesh-docs/device-setup.md) дополнена схемой управления и изображениями всех экранов (состояние, меню, частота и правка разряда, полоса, CR, SF, координаты, подтверждение, ответ устройства, батарея, ADC); та же документация опубликована в вики проекта — <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/wiki/Device-Setup>;
|
||
- сборка проверена на `heltec_v4_repeater_mqtt`, `Meshadventurer_sx1262_repeater_mqtt`, `Generic_E22_sx1262_repeater_mqtt` (без дисплея) и `RAK_3112_repeater_mqtt`.
|
||
|
||
**Обновление до upstream MeshCore v1.18.0**
|
||
|
||
- база проекта поднята с `v1.17.1` до `v1.18.0`: влит релизный тег `repeater-v1.18.0` (266 коммитов upstream, 201 файл, +7185/−1010) через интеграционную ветку `integrate/upstream-1.18.0`; страховочный тег `pre-1.18.0` и `git bundle` лежат в истории репозитория;
|
||
- слияние дало 12 конфликтных файлов. Companion-часть (4 файла) взята из upstream целиком — в этом форке она не собирается. В `simple_repeater` сохранены наши возможности, а интеграция вентилятора T-Beam 1W заменена на upstream-реализацию: у него задача FreeRTOS, чтение NTC, гистерезис, TX-кулдаун, свои настройки в NVS и CLI (`get fan`, `set fan auto|on|off`, `set fan.lo/hi`); наша команда `set fan timeout <Ns>` убрана вместе с ручным опросом из `loop()`;
|
||
- время на ESP32 восстанавливается в два слоя: сначала из NVS (наша надстройка, переживает отключение питания), затем из RTC-памяти upstream, иначе опорная дата; deep sleep по-прежнему не трогаем;
|
||
- в менеджере датчиков взята логика upstream (карта `detected[]`, один драйвер на тип), поверх возвращено определение адреса платой; попутно восстановлен потерянный слиянием helper `scanI2CBus` с нашим таймаутом 20 мс;
|
||
- наша сигнатура `format*StatsReply(char*, size_t)` и наши префы (`FanPrefs`, `WebSensorSnapshot`, `BlacklistEntry`, `ChanNameFilter`, `getCLI()`) сохранены; из upstream добавлены `isHiddenNode()`, `DynamicConfigSerializer custom`, `attachDynamicPrefs`;
|
||
- добавлена плата **Waveshare ESP32-S3 LR1121** из 1.18.0 — три MQTT-окружения (`Waveshare_S3_LR1121_repeater_mqtt`, `_espnow`, `_bridge`); остальные новые платы 1.18.0 (ThinkNode M8 и M4, Wio Tracker L1 1W, Muzi Base) выполнены на nRF52, WiFi у них нет, поэтому MQTT-сборки для них невозможны;
|
||
- MQTT-целей стало 112 (42 uplink, 34 espnow, 36 bridge); после слияния проверены сборкой `heltec_v4_repeater_mqtt`, `LilyGo_TBeam_1W_repeater_mqtt`, `Meshadventurer_sx1262_repeater_mqtt`, `RAK_3112_repeater_mqtt`, `heltec_v4_repeater_mqtt_espnow`, `heltec_v4_repeater_mqtt_bridge`, `LilyGo_Tlora_C6_repeater_mqtt_espnow`, `LilyGo_TBeam_1W_repeater_mqtt_espnow`, `Waveshare_S3_LR1121_repeater_mqtt`, `Waveshare_S3_LR1121_repeater_mqtt_bridge`;
|
||
- в `AGENTS.md` обновлён процесс: работаем в `main` (ветка `develop` — устаревшая, от эпохи EastMesh), upstream тянем релизным тегом, а не веткой `dev`, версия upstream — `v1.18.0`.
|
||
|
||
**Сжатие веб-панели и проверка размера образа**
|
||
|
||
- страницы панели сжимаются gzip во время сборки (rch/esp32/extra_scripts/gzip_web_panel.py): 153 819 байт текста превращаются в 33 054 байта, образ репитера стал легче примерно на 118 КБ, браузер распаковывает страницы сам по Content-Encoding: gzip;
|
||
- добавлена проверка rch/esp32/extra_scripts/check_app_size.py: сборка падает, если образ больше своего app-раздела (PlatformIO считает только секции ELF и не учитывает выравнивание);
|
||
- в репозиторий добавлены модули из форка MeshCoreTel-moe: src/helpers/AdvertJail.h (лимит флуда анонсами по отправителю) и src/helpers/ChannelBudget.h (бюджет эфира на канал); подключение к обработке пакетов — следующий шаг.
|
||
|
||
**Исправлено**
|
||
|
||
- в MQTT-телеметрию уходила только база версии (`v1.18.0`), потому что поле `firmware_version` бралось из `FIRMWARE_VERSION`, куда при сборке передаётся версия upstream. Теперь строка собирается в коде: `MQTT_FIRMWARE_VERSION = FIRMWARE_VERSION "-posadmesh-meshcoretel"`, то есть публикуется `v1.18.0-posadmesh-meshcoretel` — одинаково при локальной сборке и в CI;
|
||
- коррекция ADC стала доступна на всех платах и отсчитывается от заводского значения платы: механизм вынесен в базовый класс `ESP32Board` (`adcMultiplierBase()` + `adcMultiplier()`), платы со своей формулой переведены на него (Heltec E213/E290/T190, tracker_v2, v2, ThinkNode M2/M5), а Station G2/G3 и T-Beam с PMU честно отвечают, что подстройка не поддерживается;
|
||
- в мастере настройки поле `ADC` открывается с действующего множителя платы (Heltec V4 — `5.420`, Meshadventurer — `2.000`) вместо нуля, формат `x.xxx`; на экране батареи заводское значение помечается словом `base`. У Meshadventurer множитель раньше был зашит числом 2 и команда `set adc.multiplier` отвечала `Error: unsupported`;
|
||
- экран загрузки: `meshcore.io`, версия с датой сборки и адрес `posadmesh.ru`; строка `< Repeater >` убрана;
|
||
- ответы устройства в мастере настройки показывались строкой поверх экрана и сливались с содержимым (например `OK - reboot to apply` в верхней части). Теперь это модальное всплывающее окно с рамкой, собственным фоном, переносом текста и кнопкой `OK`; закрывается коротким нажатием, пока открыто — экран под ним не меняется;
|
||
- мастер настройки: при выходе из меню отправлялась команда `set radio` с нулевыми значениями рабочей копии, если в этой сессии не открывали ни один радиопункт (например сразу `Save & exit`) — устройство отвечало `Error, invalid radio params`. Теперь радиопараметры отправляются только когда их действительно правили, значения перед отправкой перечитываются из настроек узла, а при каждом входе в мастер рабочая копия обновляется;
|
||
- `set mqtt.meshcoretel on|off` не срабатывал: обработчик сравнивался со строкой `set mqtt.mqtt.meshcoretel `. Алиас `set mqtt.meshcoretel.ru on|off` читает значение по правильному смещению;
|
||
- `setEndpointEnabled` маскировал сохранённую маску брокеров значением `0x07` и терял бит собственного брокера при переключении любого другого;
|
||
- на странице логина веб-панели незакрытый тег `</div` съедал абзац-подсказку про пароль администратора;
|
||
- разбор дерева регионов срезал завершающую букву `F` в имени региона, из-за чего `region allowf`, `region denyf` и `region remove` не работали для таких имён;
|
||
- сборка ESP-NOW моста на ESP32-C6: в ESP-IDF 5 у колбэка приёма ESP-NOW другой первый параметр (структура `esp_now_recv_info_t`) и тип длины `int` вместо `int32_t` — колбэк `ESPNowBridge::recv_cb` адаптирован под обе версии IDF по `ESP_IDF_VERSION`, цели `*_repeater_mqtt_espnow` на C6 снова собираются;
|
||
- групповые команды сборки не собирали ничего: использовались устаревшие суффиксы `_repeater_observer*`, а на Windows имена окружений приходили с символом `\r`. Теперь используются реальные суффиксы, а вывод PlatformIO очищается от `\r`.
|
||
|
||
**Инфраструктура и релизы**
|
||
|
||
- репозиторий переехал на <https://git.meshinfo.ru/shade/MeshCore-Posadmesh>; собственные 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`;
|
||
- релизы опубликованы в Gitea: `repeater-mqtt-v2026.10.0` (82 файла), `repeater-mqtt-espnow-v2026.10.0` (66) и `repeater-mqtt-bridge-v2026.10.0` (70) — в каждом по паре `.bin` и `-merged.bin` на плату, всего 218 файлов;
|
||
- проект и документация переориентированы на meshcoretel.ru: в README переписано происхождение проекта и заведён этот журнал изменений; из документации убраны прежние региональные материалы, ссылки на сторонние сервисы, примеры радиопресетов и коды регионов других стран; руководство по прошивке переведено на файлы из раздела релизов и `esptool.py`, вместо раздела региональных материалов добавлен раздел материалов MeshCoreTel.
|
||
|
||
**Прошивальщик в браузере**
|
||
|
||
- добавлена страница прошивки <https://meshinfo.ru/flasher/>: два набора прошивок отдельными списками — «MeshCore — наш форк» (релиз [`shade/MeshCore`](https://git.meshinfo.ru/shade/MeshCore) `v0.1.0`, 16 плат, 52 файла) и «PosadMesh — MQTT-репитеры» (треки `repeater-mqtt`, `repeater-mqtt-espnow`, `repeater-mqtt-bridge`, 41 плата, 218 файлов);
|
||
- запись ESP32-прошивок через Web Serial и esptool-js 0.5.4 (лежит локально, без CDN): `-merged.bin` пишется по адресу `0x0`, обычный `.bin` — по `0x10000` с сохранением настроек;
|
||
- галочка «Стереть флеш полностью перед прошивкой» и отдельная кнопка «Только стереть»; определение чипа при подключении, прогресс, журнал операций, кнопка перезагрузки;
|
||
- для nRF52 (`.uf2`, `.zip`) — скачивание и инструкция: копирование на UF2-диск платы или обновление через nRF Connect DFU, поскольку браузер прошить nRF52 не может;
|
||
- список прошивок собирается скриптом [`posadmesh-tools/build-flasher-index.py`](./posadmesh-tools/build-flasher-index.py) из релизов Gitea в статический `index.json` (270 файлов, 57 плат) — страница не обращается к API из браузера;
|
||
- файлы прошивок не копируются на сервер: nginx проксирует их из релизов Gitea (`location /flasher/fw/`), поэтому для браузера всё в одном origin и `fetch` бинарников не упирается в CORS; статика лежит в `/var/www/flasher`, страница отдаётся правилом `location /flasher/` выше правил Wiki.js.
|
||
|
||
## Документация
|
||
|
||
Отдельный сайт документации больше не публикуется: страницы лежат в каталоге [`posadmesh-docs/`](./posadmesh-docs) и читаются прямо в веб-интерфейсе git.meshinfo.ru:
|
||
|
||
- <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/src/branch/main/posadmesh-docs>
|
||
|
||
Текущие страницы документации:
|
||
|
||
- [Главная](./posadmesh-docs/index.md)
|
||
- [Скачивание и прошивка релизов](./posadmesh-docs/releases.md)
|
||
- [Локальная сборка с uv](./posadmesh-docs/local-builds.md)
|
||
- [Пользовательские команды CLI](./posadmesh-docs/custom-cli.md)
|
||
- [Веб-панель](./posadmesh-docs/web-panel.md)
|