- в Gitea Actions шаг "Install uv" падал на Ubuntu 24.04: pip в систему запрещён (PEP 668)
- uv ставится официальным установщиком в ~/.local/bin, каталог добавляется в PATH
- добавлен шаг uv sync: posadmesh-build.sh запускает pio через "uv run --no-sync",
значит окружение с platformio должно существовать заранее
- actions/cache обновлён до v4, добавлен continue-on-error и кэш ~/.cache/uv
- причина, по которой это вылезло только сейчас: runner был зарегистрирован за
репозиторием shade/meshcore, а workflow живёт в shade/MeshCore-Posadmesh
- страница https://meshinfo.ru/flasher/: два набора прошивок отдельными списками
(MeshCore — наш форк, релиз shade/MeshCore v0.1.0; PosadMesh — три трека MQTT)
- запись ESP32 через Web Serial и esptool-js 0.5.4 (лежит локально, без CDN):
-merged.bin пишется по адресу 0x0, обычный .bin — по 0x10000
- галочка полного стирания флеша и отдельная кнопка только стирания;
для nRF52 (.uf2/.zip) — скачивание и инструкция по UF2-диску или DFU
- index.json собирается скриптом posadmesh-tools/build-flasher-index.py из релизов Gitea
(270 файлов, 57 плат), страница не обращается к API из браузера
- файлы прошивок отдаются nginx-проксированием релизов Gitea: один origin, без CORS
- README: запись в журнале изменений; posadmesh-docs/releases.md: раздел про прошивку из браузера
- release-notes.yml: добавлена запись 2026.10.0 для трека repeater-mqtt-bridge
(трек был в реестре, но записей о релизах не имел)
- записи 2026.10.0 содержат исправление сборки ESP-NOW на ESP32-C6
- release-notes.yml: в записи 2026.10.0 добавлен пункт про исправление сборки ESP-NOW
на ESP32-C6 (IDF 5)
- README: отмечены опубликованные релизы repeater-mqtt*, espnow и bridge
- ESPNowBridge::recv_cb адаптирован под ESP-IDF 5: первый параметр — esp_now_recv_info_t,
длина имеет тип int; старый вариант оставлен для IDF 4 через ESP_IDF_VERSION
- это починило сборку трёх целей на ESP32-C6: LilyGo_Tlora_C6_repeater_mqtt_espnow,
M5Stack_Unit_C6L_repeater_mqtt_espnow, WHY2025_badge_repeater_mqtt_espnow
- README: запись в журнале изменений
- экраны Frequency и Bandwidth: единица измерения в конце строки значения
(868.731 MHz, 062.50 kHz), внизу отдельный пункт Save & exit
- после правки цифр пользователь переходит на Save & exit и удерживает кнопку:
значения применяются, экран возвращается в предыдущее меню
- документация: страница posadmesh-docs/device-setup.md дополнена схемой управления
и изображениями всех экранов (12 картинок в posadmesh-docs/_assets/wizard/)
- вики Gitea: страницы Home и Device-Setup с теми же иллюстрациями
- README: ссылка на вики, схема управления и запись в журнале изменений
- радиопресет заменён на четыре отдельных пункта меню: Frequency, Bandwidth, CR, SF
- частота: целые МГц шагом +-1, кГц правятся по разрядам (принцип как у координат)
- полоса: поразрядный ввод значения с точкой (формат 062.50)
- CR и SF: шаг +-1 с ограничением 5-8 и 5-12
- применение любого из четырёх пунктов отправляет set radio <частота>,<полоса>,<sf>,<cr>
целиком, остальные значения сохраняются; внизу меню остаётся Save & exit
- документация device-setup.md обновлена, README: раздел и журнал изменений
- проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
Generic_E22_sx1262_repeater_mqtt (без дисплея)
- добавлен локальный мастер настройки репитера: examples/simple_repeater/UITask.*
(меню на кнопке, редактор координат, применение значений через CommonCLI)
- MyMesh: публичный доступ к CommonCLI для UI (getCLI), main.cpp передаёт его в UITask
- мастер работает на любой цели с дисплеем и кнопкой и исключается препроцессором
там, где их нет; WiFi-код теперь под #if defined(ESP32)
- новая страница документации posadmesh-docs/device-setup.md, ссылки в index.md и mkdocs.yml
- README: раздел «Настройка с дисплея и кнопки» и запись в журнале изменений
- проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
Generic_E22_sx1262_repeater_mqtt (без дисплея), RAK_3112_repeater_mqtt
- добавлен ручной 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
Both Clyde North observers stopped answering over WiFi after days of
uptime while LoRa and MQTT kept working. `memory` showed heap_min ~1KB
and a largest internal block of 19KB: the HTTPS listener was alive but
no mbedTLS handshake (~40KB contiguous) could be allocated.
The trigger was the Aug 9 lru_purge change: with a 2-socket pool, every
browser page-load burst evicted a live session and forced a fresh TLS
handshake, and the repeated 40KB alloc/free cycles fragmented internal
RAM. Before that change the pool simply jammed, so nothing churned.
- Send `Connection: close` and trigger a session close on one-shot
responses (pages, favicon, redirect, login, 401s) so page-load bursts
release their sockets immediately. The authenticated /api/* polling
connection keeps keep-alive so it does not pay a handshake per poll.
- Gate WebPanelServer::start() on internal heap headroom (56KB free /
32KB largest), retrying every 15s instead of every loop tick.
- Self-heal: when the panel is idle and the largest internal block drops
below 24KB, stop and re-create the server to return its pools.
- Count the MQTT teardown path that deliberately abandons a client on a
heap-integrity failure.
- Expose the above as `heals:`/`deferred:` in `get web.status` and
`leaked:` in `get mqtt.status`.
- Fix the stats page Channel/Gateway cells showing `--`: the /api/stats
summary JSON never carried channel, gateway health, or the watchdog
count (only the `get wifi.status` string did).
- Add eastmesh-tools/web-heap-check.sh to read heap/service health over
the API and optionally stress the panel with browser-style bursts.
- Release notes 2026.8.3 for both observer tracks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both Clyde North observers sat WL_CONNECTED on an AP that kept beaconing
after its bridge to the wired LAN died: association up, good RSSI, stale
DHCP lease, but ARP-invisible and both MQTT brokers stuck in backoff.
The firmware equated "associated" with "online", so neither node ever
re-scanned and the outage held until a manual reassociation.
Add a connectivity watchdog to NetworkService: while connected, ARP-probe
the gateway every 30s (posted to the lwIP tcpip thread, safe on both the
IDF4 and IDF5 cores). If the gateway stays silent for 3 minutes, clear
the channel hint and force a full disconnect/rescan so the node can roam
to a healthy AP, backing off exponentially (up to 48min) while the
outage persists. Nodes without a gateway skip the probe.
Add a `wifi reconnect` repeater command that triggers the same forced
reassociation on demand, and report `gw:ok|lost wd:<count>` in
`get wifi.status`. Teach the web panel parser the new fields (also fixes
the IP metric rendering as "x.x.x.x channel:n") and show Gateway and
Channel in the Wi-Fi card.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SPI pins that are set to -1 cause OOB reads on NRF52. The unused Serial2 pin definitions were removed to avoid potential issues with the Uart framework.
Setting SPI pins to values that are OOB of the g_ADigitalPinMap[] array causes OOB reads. This variant.h has pin 0 as 0xFF which passes through as NRFX_SPIM_PIN_NOT_USED.