Document 1.17.1.9 profiles and WiFi upgrade limits

This commit is contained in:
mikecarper committed 2026-10-07 07:37:32 -07:00
1 parent 88c8510800
commit d2b6244ae0
8 files changed
+605 -80

No files matched your search

+7
View File
@@ -39,6 +39,13 @@ names, sizes and checksums before switching the catalogs. Regenerate the
downloadable picker from the same family and update its checksum on every
page. Documentation-only follow-up commits do not move firmware tags.
Include the [1.17.1.9 release notes](docs/releases/1.17.1.9.md) and
[1.17.1.8 WiFi upgrade guide](docs/upgrading_1.17.1.8_to_1.17.1.9.md) in the
publication review. Replace the release notes' final package-validation gate
with the completed inventory only after packaging passes. Keep the firmware
source separate from a later documentation-only commit, and retain the
measured hardware scope and old-updater completion limitation.
For the USA Cascade 1.17.1.5 matrix, use
[the option 3 release instructions](docs/old-releases/1.17.1.5.md).
Package the qualified outputs with `scripts/package_cascade_release.py`.
+52 -9
View File
@@ -159,8 +159,35 @@ reboot
```
The SSID and password values are the rest of the command line. Spaces are
allowed and quotes must not be added. SSIDs may contain at most 31 characters
and passwords at most 63. Leave the password value empty for an open network.
allowed and quotes must not be added. SSIDs may contain at most 31 characters.
ESP32 infrastructure MQTT builds with WebConfig share one canonical WiFi
configuration between this CLI and the browser portal. Passwords accept
0-63 characters or exactly 64 hexadecimal characters for a raw WPA PSK.
Leave the password value empty for an open network. Reboot after changing
credentials to apply them; an already-running MQTT worker keeps its current
connection settings until it stops and restarts.
Older observer-only credentials remain usable until canonical WiFi settings
are saved. The first CLI edit preserves the other legacy credential while
saving the complete pair. Once canonical settings exist, empty, incomplete or
unreadable canonical settings do not revive old observer credentials. Historical
SSID-only canonical settings continue to represent an open network. Builds
without this WebConfig integration retain their legacy 63-character password
limit; this change does not add MQTT support to currently disabled Pico targets.
On these ESP32 MQTT/WebConfig builds, an empty CLI SSID clears the configured
network while retaining saved broker settings:
```text
set wifi.ssid
reboot
```
Use this to return the node to unconfigured provisioning. The WebConfig setup
form still requires a nonempty SSID. After saving a new network, verify
`get wifi.status`, `get mqtt.config.valid` and `get mqtt.running`; credentials
alone do not prove a broker connection. A local `get wifi.pwd` can inspect the
password, while an authenticated remote command returns only set/unset.
Useful checks are:
@@ -192,8 +219,9 @@ set mqtt.enabled off
start webconfig ap
```
After provisioning, use **Save & Reboot**, or stop the temporary portal and
restart the bridge:
After changing WiFi credentials, use **Save & Reboot** or `reboot`. For
broker-only changes that keep the existing network, stop the temporary portal
and restart the bridge:
```text
stop webconfig
@@ -307,6 +335,15 @@ modem sleep can miss ESP-NOW broadcasts; use `min` for coexistence. The primary
mesh transport holds the driver's RF wake reference continuously, so `min`
does not suspend its ESP-NOW receiver.
Espressif long-range WiFi (LR) trades speed for reach: its raw rates are
250 or 500 kbit/s, with up to about 1 km in suitable line-of-sight conditions.
LR traffic needs compatible Espressif hardware at both ends. An LR-enabled
access point sends LR beacons that ordinary phones, routers and Raspberry Pis
cannot receive. A mixed b/g/n+LR station can still join an ordinary router,
using normal WiFi rates for that connection. MeshCore's setup and OTA access
points therefore use ordinary b/g/n. See
[Espressif's LR compatibility guide](https://docs.espressif.com/projects/esp-idf/en/v4.4.7/esp32s3/api-guides/wifi.html#long-range-lr).
ESP-NOW compatibility also depends on the bytes and PHY used above the common
Espressif transport. The historical `*_repeater_bridge_espnow` firmware wraps
each MeshCore packet with a magic value, checksum, and secret-based XOR, while
@@ -423,6 +460,11 @@ direct browser uploader on HTTP port 80. A FULL role without WebConfig but with
browser OTA support can use the `MeshCore-OTA` access point raised by
`start ota`; its seeder address is `192.168.4.1:5001`.
For browser uploads from an existing 1.17.1.8 ESP32 node, see the
[1.17.1.9 WiFi upgrade guide](upgrading_1.17.1.8_to_1.17.1.9.md).
It covers the node AP, old-page completion behavior, and choosing an
application-only image or the exact partition-migration package.
Only one external folder link can be active. A TCP client is rejected while
`ota folder on` is using USB serial, and disconnecting `motatool` automatically
removes the TCP folder. Port 5001 has no login layer, so expose it only on a
@@ -675,11 +717,12 @@ Common causes are:
For a WiFi companion, find its station IP in the router, connect the client to
TCP port 5000, and use the open `MeshCore-Setup-XXXX` AP at
`http://192.168.4.1/` if it cannot join the saved network. Current firmware
normalizes both ESP32 WiFi interfaces to standard b/g/n before advertising the
setup AP. Full Companion targets whose primary mesh radio is ESP-NOW use
b/g/n+LR instead and keep the setup AP, infrastructure station, and mesh on the
persisted `espnow.channel` (channel 1 by default). Their configured 2.4 GHz
router and every other primary ESP-NOW node must use that same channel.
uses standard b/g/n for the setup AP, including ESP-NOW-capable targets.
A running LR mesh conflicts with a conventional access point; current firmware
refuses that AP startup and defers LR startup while an AP is active. A primary
ESP-NOW target keeps its infrastructure station and mesh on the persisted
`espnow.channel` (channel 1 by default). Its configured 2.4 GHz router and every
other primary ESP-NOW node must use that same channel.
MQTT-capable Companions also accept `get mqtt.enabled`, `get mqtt.running`,
and `get mqtt.status` in their USB/TCP and browser terminals. Extended slot
and NTP diagnostics remain infrastructure features.
+6 -6
View File
@@ -25,7 +25,7 @@ The picker reads public release metadata from GitHub. It does not upload device
information. Hardware names, target names, and download links come directly
from the published firmware assets.
<div class="firmware-picker" data-firmware-picker data-release-repo="mikecarper/MeshCore" data-controls-url="../_data/firmware_controls.json?v=1.17.1.8-runtime-1" data-bootloaders-url="../_data/bootloader_manifest.json?v=20261002-1" data-share-url="https://mikecarper.github.io/MeshCore/firmware_picker/">
<div class="firmware-picker" data-firmware-picker data-release-repo="mikecarper/MeshCore" data-controls-url="../_data/firmware_controls.json?v=1.17.1.9-88c85108" data-bootloaders-url="../_data/bootloader_manifest.json?v=20261002-1" data-share-url="https://mikecarper.github.io/MeshCore/firmware_picker/">
<div class="firmware-picker-intro" role="note">
<strong>Current release set</strong>
<p data-role="release-set">Loading release information...</p>
@@ -271,7 +271,7 @@ capacity and sensor-profile choices.
Moving an older ESP32 installation to an expanded Full layout requires a
partition migration.
Use the exact-board merged image over USB, or a supported exact board and role
staged migration ZIP from the [utility release](https://github.com/mikecarper/MeshCore/releases/tag/utility-v1.17.1.8-halo-keymind-cascade-dev-9053038f).
staged migration ZIP from the [utility release](https://github.com/mikecarper/MeshCore/releases/tag/utility-v1.17.1.9-halo-keymind-cascade-dev-88c85108).
Read that ZIP's README before choosing the Wi-Fi or LoRa route. Do not send a
loose app-only Full `.bin` directly to an older layout: the running application
cannot move its own active and inactive partitions. Run
@@ -465,7 +465,7 @@ pin map, and other physical differences without crowding the Hardware dropdown.
that need a different image or wiring, such as serial port or external storage.
The picker skips this step when all available profile choices lead to the
same firmware file.
Future nRF52 repeater, room-server and sensor releases publish two separately
The 1.17.1.9 nRF52 repeater, room-server and sensor releases publish two separately
qualified choices: **Reduced sensors + LoRa OTA** and
**Full supported sensors + LoRa OTA**, with `-reduced-ota` and `-full-ota` artifact suffixes. Each keeps
its exact board/role OTA identity and storage layout; the suffix is not a new
@@ -512,7 +512,7 @@ retains its optional dedicated interface `02`.
Exact filename search finds compatibility images included in the selected
release family. For older releases, open their GitHub release pages.
The 1.17.1.8 public matrix keeps one ESP32 Full image per board and role.
The current public matrix keeps one ESP32 Full image per board and role.
Some richer images, including Station G2 Full, retain an observer-named OTA
identity. Exact older identities needed by a partition migration are packaged
inside that board and role's migration ZIP instead of adding a second ordinary
@@ -520,8 +520,8 @@ Full download. A deliberate target-ID override does not make a different
partition layout or physical board compatible.
Some normal ESP32 roles begin in the legacy 1.25 MiB dual-OTA layout but have
a Full image with larger slots. The 1.17.1.8 utility release contains 94 exact
board and role migration ZIPs. Each package checks its source layout and target
a Full image with larger slots. The utility release lists the exact
board and role migration ZIPs available for that release. Each package checks its source layout and target
identity, contains the bridge and Full application files for its supported
routes, and documents what saved data it preserves. Use the package's own Full
application after the bridge; do not substitute a loose Full image with a
+111 -58
View File
@@ -1,6 +1,9 @@
# MeshCore 1.17.1.9 USA Cascade
This release remains held and unpublished.
Candidate firmware source: `88c85108005a30a730fa7b78b2899b210754f3be`.
<!-- RELEASE_FINAL_PACKAGE_STATUS_INTRO: finalize only after exact88c package validation. -->
Final package validation remains pending. Hardware observations below retain
the exact source and installation route tested.
USA Cascade defaults are 910.525 MHz, 62.5 kHz bandwidth, SF7 and CR5. Saved
radio settings take precedence. Match the exact board, role and storage
@@ -18,17 +21,41 @@ layout before installing an image.
the radio loop. The G2 preserves complete serial packet-log lines under
congestion. This supports unmodified Cisien meshcoretomqtt; congested
diagnostic output can still be dropped.
- The pinned ESP32-S3 framework releases retained TinyUSB PHY ownership when
starting hardware CDC after a software restart. KISS clears incomplete
- ESP32-S3 hardware CDC startup reclaims TinyUSB PHY ownership retained
across a software restart. KISS clears incomplete
host frames on a USB session reset while preserving active radio work.
- Browser OTA uploads allow 30 seconds of body inactivity after admission.
An upload error stays attached to its HTTP request and stops further flash
writes. Error callbacks avoid raw USB printing that could block the shared
network task when a connected host stops reading.
- Browser OTA applies the expected MD5 after opening the update, so checksum
verification survives updater initialization. It commits an application only
after the complete HTTP POST finishes. A rejected second file or an
interrupted multipart request cannot finalize the first file as an update.
The successful response is sent before the deferred restart.
- On ESP32 infrastructure, `start ota` starts WiFi as needed, stops WebConfig
to release its HTTP port, and reports the address and network to use.
`start ota ap` can replace a running LAN uploader with the node's
`MeshCore-OTA` access point. Run the handoff from USB, Bluetooth or LoRa;
WebConfig tells its terminal users that the portal will close.
- Setup and OTA access points use ordinary b/g/n WiFi. Firmware rejects AP
startup while a conflicting long-range ESP-NOW transport is active, and
defers that transport while the AP is running. MQTT and Companion station
recovery leave an active setup/OTA AP available.
- Infrastructure WebConfig retries its saved WiFi when MQTT has no running
worker. Ownership follows the actual worker state while canonical WiFi
credentials and 64-hex password support remain independent of that state.
Companion's manual WiFi startup behavior is preserved.
- ESP32 infrastructure MQTT builds with WebConfig use the same saved WiFi
credentials for browser setup, CLI configuration, startup and reconnects.
A fresh browser-only setup can now start MQTT. Raw 64-hex PSKs are supported
without changing the observer preferences file layout. Failed saves retain
the committed pair or block an incomplete pair; runtime credentials remain
fixed until the bridge restarts. See [WiFi setup](../WiFi.md#mqtt-observer-setup).
- Compact 1.14.1 preference images retain a saved RX boosted gain of on when
a newer board profile defaults it to off. Newer appended gain values remain
authoritative. The old off byte is indistinguishable from padding used by
earlier versions, so those zero-filled legacy images retain board defaults.
- Companion packet streaming supports stock serial MQTT consumers. Text CLI
and Binary Companion handoff and reply deadlines are covered against the
official app's protocol behavior.
@@ -56,6 +83,19 @@ layout before installing an image.
firmware with enough rule slots to recover the complete policy.
- ESP32 filesystem buffer checks cover the pinned Arduino 3 frameworks used
by RC32 and C6 targets and continue rejecting unhonored buffer allocations.
- ESP32 Full LoRa repeater images combine supported ESP-NOW and RS-232
bridge modes behind runtime controls. Separate ESP-NOW images remain where
a combined profile cannot meet the existing memory and flash guards.
Full Heltec V3, WSL3 and RAK3112 MQTT profiles retain independent RS-232
controls alongside MQTT and ESP-NOW; see the [bridge controls](../role_feature_switches.md).
- MeshTower V2 uses its SD-card-capable image as the canonical combined
repeater. With the matching combined OTAFIX bootloader, its runtime storage
policy keeps SD primary and allows internal-flash signed application deltas
when no usable card is available; see [MeshTower storage](../ota_meshtower_v2_sdcard.md).
- Supported T-Beam AXP192/AXP2101 boards can configure and persist the
charger's exact supported voltage targets, with hardware readback. Neither
PMU supports 3.65 V. Heltec Mesh Solar's charger voltage remains a hardware
setting; see [charge voltage](../charge_voltage.md).
- Generic ESP-NOW Full Companion retains all Full transports and 100 contacts
with a 224-frame offline queue to meet the unchanged runtime RAM requirement.
- Wio-E5 Mini Companion uses smaller generated code while preserving its
@@ -64,6 +104,25 @@ layout before installing an image.
- Mesh America preserves download-only installation for hardware cards that
require it, including their Full and reduced sensor profiles.
## Firmware profiles
Choose the exact hardware variant and role in the
[firmware picker](../firmware_picker.md). **Full** includes the transports and
optional sensors supported by that board's qualified recipe; it does not add
peripherals that the hardware cannot support. Runtime controls select USB
logging, power saving and included bridge modes without a separate image.
ESP32 normally has one public Full image per board and role. A migration ZIP
may contain a different required target identity; use its supplied Full image
for that migration. Station G2's ordinary Full image retains an
Observer-named OTA identity, even though it is the combined Full profile.
nRF52 Repeater, Room Server and Sensor provide both **Reduced sensors + LoRa
OTA** and **Full supported sensors + LoRa OTA**. Pick Full when its supported
optional sensors are needed. Both keep the exact board/role/storage identity
and need the matching OTAFIX bootloader. Full Companion remains the combined
Companion choice. See [profile details](../firmware_picker.md#hardware-and-variant-names).
## Installation
An ESP32 merged `.bin` installs bootloader, partitions and application over
@@ -73,6 +132,10 @@ family's utility page, or the matching merged image over USB. Follow the ZIP's
README and use its supplied Full application. `get storage.layout` reports
the live layout on firmware that supports it.
For the measured ESP32 upgrade route and examples, read
[Upgrading from 1.17.1.8 over WiFi](../upgrading_1.17.1.8_to_1.17.1.9.md).
Download the selected image before joining the node's update access point.
Check the image's flood-rule capacity before updating a repeater. Move active
rules into the supported slots and save them before installing a smaller
table. An over-capacity policy is retained on storage but remains inactive
@@ -93,63 +156,53 @@ See the [role controls](../role_feature_switches.md),
## Verification scope
The ESP32 migration passed the native unit suite, SDK and protocol regression
tests, sanitizer fixtures and representative builds across all affected board
families. The G2 passed physical USB command/reconnect tests with its original
identity and settings preserved. A separate RAK4631 recovery admin was verified
by passwordless LoRa login, remote status and a remote version reply.
<!-- RELEASE_FINAL_PACKAGE_STATUS_DETAIL: replace this paragraph from the validated publication plan. -->
Final release packaging is still being checked against firmware source
`88c851080`. Publish only after the complete checksum inventory, capabilities,
memory checks, Full/Reduced nRF52 pairs and exact migration packages pass.
The older completed 463-recipe inventory belongs to `1e421ff4`; it does not
qualify the rebuilt release. The publisher must record the completed new
inventory here before switching the firmware picker and Mesh America catalogs.
Earlier old-firmware handoff attempts did not qualify an OTA migration. After
USB restoration, hardware CDC passed 444 strict-deadline queries and a
150-second closed-port idle/reconnect test. Those results remain separate from
the subsequent physical OTA qualification.
Production-code host regressions cover the official configuration GUI's
five-second command deadline, app protocol and ACL replies, USB lifecycle,
OTA admission/MD5/completion/error handling, shared WiFi credentials, AP and
MQTT ownership, and legacy RX-gain loading. Synthetic peripheral tests cover
boards unavailable for physical testing. They do not establish every board's
physical USB, radio, WiFi or power behavior.
On 2026-10-05, the G2 passed an app-only HTTP OTA upgrade from a real TinyUSB
build to normal hardware CDC, both built from `95913c53`. The test drained the
same TCP socket's outstanding bytes before pausing the upload for 4.510 seconds.
HTTP returned 200 after 22.559 seconds. Firmware restarted itself, the host
observed the USB product change, and the first ordinary website `time` command
was acknowledged in 2.997 seconds against the unchanged 5-second deadline.
Identity, saved runtime settings, and the original and recovery Admin ACLs
were preserved. No cable, power, reset, ROM or rescue action was used during
the measured upgrade; the Pi's original WiFi connection was restored.
The latest-source G2 ordinary Full Observer passed a separate USB application
installation with complete application readback, exact normal runtime and
EndF identity, and unchanged checked boot/partition/NVS/OTA-data/filesystem
regions. Its read-only post-boot check matched the original identity,
passwords, two Admin ACLs, all 22 common settings, seven supported bridge
fields and saved extras. Core error flags were zero. MQTT was running with
valid effective configuration; broker connectivity was not tested. Original
TTY settings, three host services and the Pi network were restored.
This is a controlled current-source TinyUSB baseline, not proof of an upgrade
from released stock 1.17.1. A separate earlier LAN upload reset mid-transfer;
continuous uptime and a later successful AP retry showed no CPU crash, but
the LAN failure's cause remains unproven. The synthetic regressions execute
production upload callbacks, preserve queued errors, and distinguish the old
3-second body timeout from the bounded 30-second allowance. Local uploader,
OTA startup, WiFi lifecycle and station ownership tests passed. The latest
`95913c53` hardware CDC application passed quiet 180-second power-saving trials
with the port open and closed, without keepalives or a CPU restart. First
replies took 18.551 ms and 14.728 ms; original power-saving off and other saved
settings were restored. A plain `start ota` then advertised a working LAN
endpoint, reported the WebConfig handoff, and served its page and exact G2
identity over HTTP. OTA stopped cleanly and the original WebConfig, settings,
Admin ACLs, Pi network and host services were restored. The earlier radio CAD
warning remained unchanged; the earlier LAN upload failure's cause is still
unproven. The GitHub unit workflow passed for source `c88885a3`; this release
remains held and unpublished.
The legacy **stock 1.14.1 G2 WiFi-only migration is not qualified end to end**.
The earlier `1e421ff4` trial completed partition expansion and the supplied
Full application's WiFi upload, but its final network check reached the
client/DHCP deadline without
a verified G2 client or any HTTP request. Final image/layout/identity/settings
verification through HTTP remains unproven. The successful latest-source USB
maintenance above does not qualify that cable-free path. Plan for USB recovery
when starting from this stock image; do not rely on the migration trial as a
verified LoRa or WiFi recovery procedure.
The normal Full Heltec V4 Repeater from `c88885a3` passed two fresh-flash
connections through the unchanged native Chromium setup GUI. With power saving
on, its quiet console checks passed for 600 seconds open and closed with logging
off, and 600 seconds open with USB logging. See the [V4 native console
qualification](../test-results/hardware_validation_heltec_v4_native_console_2026-10-06.md)
for deadlines, host preparation and retained failed attempts. USB remained
attached, so these checks do not measure CPU sleep or button wake. The subsequent
`ebf2f082` V4 button-wake profile correction passed host tests and linked-image
checks, followed by another unchanged native GUI fresh-flash connection and
180-second open/closed console checks with power saving on and USB logging.
Original settings, identity and ACL response were restored. On 2026-10-06 the
user separately confirmed V4 button screen wake, without specifying the
firmware revision or CPU sleep state. The operator USB tests did not include
an actual button press or measure CPU sleep/current draw; the new source's
GitHub unit workflow remains in progress.
A published 1.17.1.8 Full V4 installed newer applications over its node AP and
a controlled LAN on an already-expanded layout. Its old uploader could miss
HTTP completion despite installation and restart; check `ver` before retrying
an apparently stalled page. Current-source physical V4 testing was unavailable.
Earlier V4/G2 AP uploads and quiet USB tests remain evidence for their recorded
revisions. A bridge-setting command also missed its five-second deadline;
later healthy uptime and readback did not turn that timeout into a pass.
Build qualification does not establish physical compatibility on every board.
Hardware CDC has finite buffers, and closing a Linux TTY does not necessarily
produce a hardware session reset. Saturated diagnostic output is not lossless.
See [USB backpressure test results](../test-results/usb_serial_backpressure.md)
for measured scope and the upstream issues reviewed.
The [detailed browser OTA and release-candidate report](../test-results/hardware_validation_esp32_web_console_ota_2026-10-05.md#release-candidate-follow-up-recorded-2026-10-07)
retains the complete source-specific results, failures and recoveries. See
also the [native V4 console report](../test-results/hardware_validation_heltec_v4_native_console_2026-10-06.md),
[Linux Web Serial report](../research/linux_chromium_web_serial_tty.md), and
[USB backpressure results](../test-results/usb_serial_backpressure.md).
These checks do not measure fleet reliability, MCU sleep/current draw,
stack high-water or sustained RF throughput, or qualify every browser,
phone, operating system, bootloader or starting firmware version.
@@ -1,4 +1,4 @@
# Further firmware choice consolidation audit — 6 October 2026
# Further firmware choice consolidation audit - 6 October 2026
Baseline: pulled commit `08bf174ea30e2e075cdd9fc74111580662b461bb`.
The user requested fewer choices after the ESP32 Full-only release change.
@@ -53,7 +53,7 @@ download or install firmware, contact a device, or publish the website.
## nRF52 sensor pairs: policy versus demonstrated need
At this baseline, `is_nrf52_sensor_ota_pair_target()` in
[`build_legacy.sh`](../../build_legacy.sh) includes every nRF52 repeater,
[`build_legacy.sh`](https://github.com/mikecarper/MeshCore/blob/08bf174ea30e2e075cdd9fc74111580662b461bb/build_legacy.sh) includes every nRF52 repeater,
room-server, and sensor recipe, including external-QSPI and SD recipes.
`run_nrf52_sensor_ota_pair()` requires Full to pass, then builds Reduced; a
successful Reduced build cannot replace a failed Full build. Thus the pair is
@@ -145,7 +145,7 @@ qualifying actual duplicate removal. For each candidate:
images and verify staging geometry, reconstruction, and the matched deployed
bootloader. A passing local-install image does not prove a delta fits.
4. Change publication validation and fixtures deliberately before emitting one
artifact. [`validate_nrf52_sensor_pairs()`](../../scripts/package_cascade_release.py)
artifact. [`validate_nrf52_sensor_pairs()`](https://github.com/mikecarper/MeshCore/blob/08bf174ea30e2e075cdd9fc74111580662b461bb/scripts/package_cascade_release.py)
currently requires exactly one qualified Full and one Reduced with matching
target, hardware, version, source, and layout; it does not prove either member
saves space or is needed. Preserve legacy endpoints needed by qualified chains.
@@ -158,18 +158,18 @@ exact-delta evidence. No PlatformIO process was started for this audit.
## Storage and bootloader choices that need real distinctions
[`OtaFlashLayout_nrf52.h`](../../src/helpers/ota/OtaFlashLayout_nrf52.h) derives
[`OtaFlashLayout_nrf52.h`](https://github.com/mikecarper/MeshCore/blob/08bf174ea30e2e075cdd9fc74111580662b461bb/src/helpers/ota/OtaFlashLayout_nrf52.h) derives
internal staging space from the trusted live EndF application extent, rounded
to a 4 KiB page, and the effective bootloader ceiling.
[`OtaStoreFlashNrf52.cpp`](../../src/helpers/ota/OtaStoreFlashNrf52.cpp) adds
[`OtaStoreFlashNrf52.cpp`](https://github.com/mikecarper/MeshCore/blob/08bf174ea30e2e075cdd9fc74111580662b461bb/src/helpers/ota/OtaStoreFlashNrf52.cpp) adds
64 KiB of retained RAM only with the matching `MOTARAMA` capability and at least
one available flash page. Its hybrid application path accepts deltas, not full
application containers. A **Full sensor firmware** can still be the destination
of a delta; the two uses of “Full” must not be confused.
of a delta; the two uses of "Full" must not be confused.
The historical [RAK3401 chain](rak3401_mota_chain.md) proves tight exact-package
geometry under an older bootloader: multiple transitions have zero margin;
steps 1–9 were physically passed, while the replacement final step has offline
steps 1-9 were physically passed, while the replacement final step has offline
reconstruction and exact-bootloader simulation only. It does not compare the
current sensor pair and must not be generalized to all nRF52 boards.
@@ -104,3 +104,258 @@ GUI fresh-flash plus 180-second open/closed console check, as recorded in that
linked report. On 2026-10-06 the user separately confirmed V4 button screen wake;
its firmware revision and CPU sleep state were not specified. The operator
USB tests included no actual button press or sleep/current measurement.
## Release candidate follow-up recorded 2026-10-07
The following source-scoped observations were originally recorded in the
1.17.1.9 candidate release notes. They are retained here as historical test
results, including failed attempts and their separate recoveries. Build and
publication status in this snapshot does not override the final
[release notes](../releases/1.17.1.9.md#verification-scope). Older passing
images do not qualify a later firmware revision or turn an earlier failure
into a pass. Latest-source V4 hardware was unavailable for a repeat; that is
a physical coverage limitation, not a failed latest-source test.
The [earlier c5 GitHub unit workflow](https://github.com/mikecarper/MeshCore/actions/runs/37550980479)
passed all four jobs. Host regressions exercise production OTA callbacks,
the official configuration GUI and app protocol behavior, including MD5
ordering, rejected second files, incomplete POSTs, cleanup and subsequent
valid uploads. Sanitizer fixtures cover these OTA lifecycle cases. These
checks use MeshCore's actual-code fixtures; MeshBench is not integrated.
For `1e421ff4`, the coupled production WebConfig credential interception,
NVS commit, CLI routing and MQTT consumer fixture passed four tests, including
fresh portal-only setup, legacy fallback, reconnects, raw-PSK boundaries,
failed and interrupted writes, and mutations that restore the old credential
lookup. The broader WiFi and MQTT host suites passed 62 and 14 cases,
respectively, with some overlap. The WebConfig host suite passed 53 cases,
including the embedded page in an isolated Chromium headless browser.
Seven infrastructure power-lifecycle cases
and six portal-ownership cases passed. Five V4 setup-page cases include actual
button/session handling under both signed and unsigned `char`. The new tests
are explicitly included in the unit workflow. The [current GitHub unit workflow](https://github.com/mikecarper/MeshCore/actions/runs/37570287426)
at documentation and host-test commit `4c5f58f4` passed all four jobs; its
firmware source remains `1e421ff4`. The completed local release passed the
strict package checks below; V4 OTA and G2/V4 portal-to-MQTT hardware checks
remain pending.
The completed local all-board release has 463 qualified recipes and 926
firmware files. Its complete checksum inventory, capability and memory
checks passed independent read-only revalidation. All 94 exact ESP32
board/role migration ZIPs and their combined archive passed validation.
The 114 nRF52 infrastructure targets each have a qualified Full/Reduced
pair with matching actual DFU identity, firmware and flash layout. These
results qualify local packages from `1e421ff4`; they do not qualify the
pending physical upgrade paths or publish the release. The newer
`bd4cbf281` source protects ordinary setup/OTA APs from the SDK's shared
long-range WiFi flag, defers conflicting ESP-NOW starts and keeps long-range
protocol writes out of saved WiFi settings. It reports an active ESP-NOW
conflict before starting an AP. The subsequent `8c4e09275` source also defers
MQTT station maintenance and Full Companion station recovery while an AP
owns WiFi. Final builds and hardware qualification of this candidate remain
pending. Final public assets and catalogs still require their separate
inventory and digest checks.
The physical G2 and V4 tests used the unchanged embedded browser uploader
and the normal host console, retaining the stock 5-second first-command
deadline. The earlier `c5fe8a0e` applications passed AP uploads with HTTP
200/OK, automatic restart, and preserved identities, ACLs and saved settings.
The G2's initial upload completed in 19.053 seconds; the V4's completed in
16.392 seconds. First ordinary replies took 1.385 and 1.010 seconds,
respectively, without a cable replug or reset rescue.
On the G2, a full valid first file followed by a second file returned HTTP
409 without an observed MCU restart. A full-file request with an incomplete
closing multipart boundary also left uptime continuous. A valid upload then
passed through that same running listener in 18.767 seconds. Full-image
wrong-MD5 requests had already returned HTTP 400 without restart on parent
`70bf4bdf`. The tests do not claim that rejected requests leave the inactive
flash slot untouched. A fresh 385-second sample of unmodified Cisien
meshcoretomqtt had all four brokers connected, zero publish failures and no
service restarts; both the original and recovery Admin ACLs were preserved.
The earlier G2 LAN upload stall is treated as a local slow-WiFi limitation,
not a release blocker. LAN upload was not qualified by these AP tests.
The new `1e421ff4` G2 Full Observer application also passed the unchanged
native AP uploader: HTTP 200/OK in 18.437 seconds, firmware-owned restart,
and first ordinary `ver` reply in 1.304 seconds. Live EndF body identity,
the exact G2 target and source were verified, with the original 15 settings,
both Admin ACLs, services and the Pi's exact SlowFi connection preserved.
This qualifies that AP update, not fresh WebConfig provisioning into the
on-device MQTT consumer; that check and the new-source V4 checks remain pending.
On parent `70bf4bdf`, both G2 and V4 passed four 600-second quiet intervals:
port open and closed with logging off, then open and closed with USB logging,
all with power saving enabled. Uptime remained continuous, with no host
keepalive writes during the intervals. The V4 reported radio-watchdog event
bit 8; this was not an MCU reset or an all-zero-error result. Its USB-logging
open interval received 26 bytes. The V4 also passed the first unchanged
native setup-GUI connection immediately after a fresh flash, with the first
clock reply in 73.3 ms. These quiet and fresh-flash checks were not repeated
on `c5fe8a0e`, whose change was confined to OTA completion behavior. The
newer canonical-WiFi source `1e421ff4` has the narrower G2 results below.
On `1e421ff4`, the G2 passed one 600.022-second open-port quiet interval
with USB logging and power saving enabled, with no host writes and continuous
uptime. The following 600-second closed-port interval ended in a stock-browser
reopen failure at the test helper's 5-second acquisition gate, before `ver`
was sent. The host then had VMIN=1/VTIME=0; the ordinary exclusive serial
client still replied in 21 ms, with continuous uptime and unchanged core error
flags. This is an unresolved browser/native-port acquisition result, not a
qualified closed-port pass or evidence of an MCU crash. A cleanup-overlay bug
in that test helper was also found and fixed for the instrumented repeat;
the earlier failed receipt is retained.
The instrumented G2 repeat on the same `1e421ff4` source passed both
600-second open and closed quiet intervals with USB logging and power saving
enabled, continuous uptime and no host keepalive writes. Original settings and
the host were restored. The maximum stock Enter-to-reply time was 3.584 seconds.
The second native port open took 5.532 seconds; click-to-connected took
8.201 seconds. That acquisition time is separate from the unchanged 5-second
command deadline, and the helper's connected wait started after its click RPC
returned. This repeat does not reclassify the earlier failure or establish its
cause. The separate logging-off run also passed both 600-second open and
closed quiet intervals with power saving enabled, 85 successful queries,
continuous uptime and restored original settings. Together the completed
runs qualify all four quiet intervals on this G2 and source.
The subsequent 100-cycle acceptance attempt stopped after 32 completed cycles.
All 86 stock commands passed, with a maximum Enter-to-reply time of 450 ms
and no observed MCU reset. The failure was an automation timeout while
clicking the stock close-overlay button; this is separate from the stock
command deadline. At the failed-trial snapshot, the UI had marked itself
disconnected while native close had not started. Native close subsequently
fulfilled in 105.5 ms, and the serial port and page closed. The cause of the
earlier disconnect or click delay remains unproven. The failed receipt is
retained; 100-cycle qualification and follow-up diagnosis remain pending.
A separate Linux Chromium 139 comparison isolated an inherited host TTY
setting: VMIN=0/VTIME=0 produced device-lost stream termination, while changing
only VMIN to 1 gave a stock `ver` reply in 154.1 ms without reset or replug.
That finding does not establish the cause of the later reopen failure above.
See the [Linux Web Serial report](../research/linux_chromium_web_serial_tty.md)
for primary browser-source evidence and the bounded host preflight.
The physical RAK3401 Companion on `70bf4bdf` passed 21 malformed-request
cases with 217 request/reply frames. Its Full Repeater passed the official
native setup GUI and 600-second open/closed quiet intervals with power saving
on, continuous uptime and zero core error flags. It was returned to the
then-current `c5fe8a0e` Full Companion; the first stock SDK reply took 25.9 ms
without an initial retry or settling delay. Original identity, contacts,
channels, custom variables, RX power-saving settings and actual packet-stream
mode were restored. The planned reboot needed to restore stream mode was
separate from the stability measurements. An initial SWD programming failure
was recovered and verified; this was not a first-attempt programming pass.
These tests did not qualify RAK3401 BLE DFU, LoRa OTA or bootloader updates.
The actual published `9053038f` 1.17.1.8 Full V4 installed newer applications
over both AP and a controlled shared WiFi LAN, but its old page did not
receive HTTP completion. Check `ver` before retrying a stalled old page.
These trials used already expanded application slots; actual phone-hotspot
uploads remain untested. The requested legacy small-slot G2 trial now has a
verified existing 16 MiB backup and genuinely programmed and verified the
official 1.14.1 stock components and small-slot table while preserving NVS.
Its first stock USB `ver` request reached the five-second host command limit;
a later read-only probe replied without reset. A separately recorded stock
setup restored and verified the original identity, 22 common settings and two
Admin ACLs after normal reboots. Password setters were confirmed and the guest
password persisted; stock has no admin-password getter. The final `start ota`
returned its expected URL, but the test's AP scan timed out. A subsequent
completed native scan found no `MeshCore-OTA` AP at any BSSID. A later
read-only NVS audit identified the test starting-state problem: earlier
preconditioning had saved the WiFi long-range protocol flag, which stock
inherited. Its long-range AP beacons cannot be received by the ordinary
WiFi clients used here. This does not establish a stock AP startup bug.
A separately recorded correction changed only the fresh live NVS protocol
flag and its entry CRC, with exact readback and unchanged stock components
and small-slot table. After stock identity, common settings, ACL and guest/
private-identity checks, a completed fresh scan found the exact G2 OTA AP.
This establishes the genuine stock WiFi-only starting boundary. The earlier
failed receipts remain failed. The first native migration controller then
failed on a missing host `iw` executable before any HTTP or image-upload
step. It may already have associated with the AP; that outcome was not
verified. Its return to SlowFi and owned guard cleanup passed. A separately
reviewed retry retained the firmware/controller inputs, separately pinned
the old runtime log and checked host executables before using fresh guards.
It associated with the exact stock AP and observed one native bridge-image
POST with the exact bytes, SHA256 and MD5, but the old embedded page did not
complete its HTTP response before the uploader deadline. Browser closure,
return to SlowFi and guard cleanup passed; that transaction remains failed.
A later scan found the exact migration AP. A separately recorded stage2
continuation then verified the actual expanded-layout-ready page and uploaded
the exact `1e421ff4` ordinary Full application through the unchanged native
page, with matching MD5 and HTTP 200/OK in 14.526 seconds. That upload phase
also passed its network return and guard cleanup. The subsequent controlled
Pi AP phase failed on a host `FileNotFoundError` before any final HTTP request.
The host's scheduled WiFi refresh also interrupted that AP phase. Its later
guard-file cleanup refused an unproven network state; a separate read-only
qualification and owned-file cleanup then verified the original network,
dead controller and removal of all prior guard profiles and files. A new
proof-only attempt stopped before AP activation because reloading services
moved the host hold timer's relative deadline. Its failed receipt is retained,
and the held host script was restored. The next proof used a fixed absolute
hold deadline, but stopped before AP activation when a host-file permission
check rejected the actual private service file; its failed receipt and host
restoration are preserved. A third proof verified and ran the isolated Pi
AP with the independent return timer armed, then reached the five-minute
client/DHCP discovery deadline without a verified G2 client or any HTTP
request. It returned to SlowFi, removed its owned network resources and
restored the host's scheduled WiFi recovery script. Final
running-image/layout/identity/settings HTTP verification remains unproven;
the successful firmware upload does not establish that final verification.
After that completed failed WiFi check, separate USB maintenance installed
the `8c4e09275` ordinary Full Observer application. Full application
readback and the normal running version matched, while the bootloader,
partition table, NVS, OTA selection and checked filesystem region stayed
unchanged. This maintenance does not qualify the WiFi-only upgrade. The
saved-settings check found RX boosted gain off instead of its original on;
the other 21 common settings, identity, passwords and two Admin ACLs matched.
A separate checked CLI repair restored gain on and verified all 22 settings.
The first extras restoration then missed the five-second CLI deadline while
changing bridge source. A later read-only probe found continuous uptime,
zero core error flags and the requested source value; it does not establish
the missing command acknowledgment or its save duration. After checking that
state, a separate restoration completed with the original WiFi pair, saved
extras, all 22 common settings, identity, passwords and both Admin ACLs
verified. The MQTT worker was running with valid effective configuration;
broker connectivity was not tested. Original TTY settings, all three host
services and SlowFi were restored, and the exact temporary host executable
alias was removed. The earlier timeout and WiFi proof failure remain recorded.
The loader correction is included in `88c851080`. Its G2 ordinary Full Observer
application was independently read back in full after installation, and normal
boot matched the exact new runtime and EndF footer. The checked lower 64 KiB,
OTA selection and first 64 KiB of the filesystem stayed unchanged. A separate
read-only post-boot check verified the original identity, passwords, two Admin
ACLs, all 22 common settings, seven supported bridge fields and saved extras.
Core error flags were zero; the MQTT worker was running with valid configuration,
without a broker-connectivity claim. Original TTY settings, all three host
services and SlowFi were restored. This USB maintenance does not qualify the
failed WiFi-only final verification. The fresh all-board build and V4 hardware
checks remain pending.
These are separate
outcomes; the initial failed transactions remain failed. The earlier c5
AP upload success does not turn those old HTTP-completion failures into
passes. The [upgrade guide](../upgrading_1.17.1.8_to_1.17.1.9.md) keeps the
old and new updater behavior separate.
Original host services, temporary network changes and owned test resources
were restored after the historical completed hardware checks. The current
new-source V4 native AP OTA trial has not yet produced a verified result;
its return to SlowFi and original host-service state also remain unverified.
The legacy G2 check established the stock starting boundary with its original
identity, common settings and ACLs verified, then completed the expansion and
Full application upload over WiFi. It has not yet qualified the final running
image through HTTP. Post-verdict `88c851080` G2 firmware readback, normal boot,
original-settings acceptance and host restoration passed separately over USB.
The all-board build and current V4 hardware qualification remain pending. These
checks keep publication pending. Build qualification does not
establish physical compatibility on every board. Quiet USB trials do not
measure MCU sleep/current draw, stack high-water, sustained log backpressure
or long-term fleet reliability. Linux native-browser tests required host TTY
preparation; they do not qualify every browser or operating system. Hardware
CDC has finite buffers, and closing a Linux TTY does not necessarily produce
a hardware session reset. See the historical [V4 console report](../test-results/hardware_validation_heltec_v4_native_console_2026-10-06.md)
and [USB backpressure results](../test-results/usb_serial_backpressure.md)
for their exact source revisions and measured scope.
+166
View File
@@ -0,0 +1,166 @@
# Upgrading from 1.17.1.8 to 1.17.1.9 over WiFi
For a supported ESP32 node that already has compatible application slots,
use its own `MeshCore-OTA` access point and the matching application-only
image. This measured V4 route avoids dependence on the site's WiFi credentials
and LAN reachability. USA Cascade defaults remain 910.525 MHz, 62.5 kHz, SF7 and CR5; existing saved radio settings take
precedence after an update.
Select the exact board, hardware variant and role in the
[firmware picker](firmware_picker.md). Download the image before connecting
to the node's update network. The release's manifests and SHA-256 inventory
identify the exact files. Preserve identity and settings using the tools
appropriate to the installed role before an upgrade.
## Choose the installation route
| Installed node | File and route |
| --- | --- |
| Exact ESP32 board/role with compatible dual-OTA slots | Matching application-only `.bin` through its working browser updater. |
| Supported legacy dual-OTA layout needing expansion | Exact board/role migration ZIP from the selected release's utility page; follow its README and use its supplied Full application. |
| Layout without a matching migration package, single application slot, or no working supported updater | Matching `-merged.bin` through that board's USB/serial flashing procedure. |
| nRF52 | Matching application UF2/DFU ZIP or a separately documented LoRa OTA route; this ESP32 browser procedure does not apply. |
An application-only update cannot replace a partition table. Where available,
`get storage.layout` reports the live layout; a version label does not establish
it. For older firmware, use the [partition lookup guide](esp32_partition_catalog.md).
The tested V4 already had two 6.25 MiB slots in the expanded 16 MiB layout.
That result does not qualify a migration from legacy 1.25 MiB slots.
Never upload a `-merged.bin` or `target-partitions.bin` to an application-only
browser updater. A merged image includes bootloader and partition-table
offsets for USB/serial installation. A migration package's target table is
a verification artifact, not an application.
## Recommended 1.17.1.8 V4 example: use the node's AP
The actual published Full V4 build tested was `9053038f`. From an authenticated
USB, Bluetooth or LoRa command session, send these commands one at a time,
waiting for each reply:
```text
stop webconfig
stop ota
start ota ap
```
Stopping WebConfig explicitly is needed for this old build's HTTP-port
handoff. Stopping a previously running uploader ensures the old `start ota ap`
starts the AP route. The new 1.17.1.9 startup behavior should not be assumed
on the old receiver.
Join the node's `MeshCore-OTA` WiFi network. Open the exact URL returned by
the command, normally `http://192.168.4.1/update` for an infrastructure node.
Confirm that the page identifies the intended node, select its matching
1.17.1.9 application-only `.bin`, and upload once. Keep the node powered
through the transfer and its automatic restart.
After restart, reconnect with the normal configuration app or console and
run:
```text
ver
get storage.layout
```
Compare `ver` with the selected image and confirm identity, ACL, radio settings
and the other saved settings used by the node. A command unsupported by the
installed image is not proof of an incorrect layout; use the lookup guide
when necessary.
The old 1.17.1.8 page can remain at 100% or miss HTTP completion even after
the new application installs and the node restarts. Check the running version
before repeating an upload. Browser transmission progress alone does not
prove successful installation.
For 1.17.1.9 receivers, `start ota` starts WiFi when needed, stops WebConfig
to free its HTTP port, and reports the IP address and network to use.
`start ota ap` explicitly selects the node AP even if a LAN uploader is
already running. WebConfig's own terminal explains that the handoff closes
the portal; send it through USB, Bluetooth or LoRa instead. On a compatible
two-slot Full Companion, use the returned port-8080 URL; single-slot Full
Companions require USB for self-update. Use `stop ota` if abandoning an update.
## LAN and phone examples
If an old 1.17.1.8 infrastructure node is already reachable on the intended
WiFi LAN, retain that connection. Otherwise configure it through its existing
WebConfig UI, then verify the live address with `get webui`. From a separate
USB, Bluetooth or LoRa session:
```text
stop webconfig
stop ota
start ota
```
Open the exact returned LAN URL, for example `http://192.168.1.40/update`.
The upload computer or phone must be able to reach that address. On
1.17.1.8, confirm the actual connection after changing credentials; a serial
WiFi setter alone does not prove that WebConfig uses the new pair. If the LAN
is weak or blocks client-to-client traffic, use the node AP route above.
A phone near the node can download the correct application while it has
Internet access, join `MeshCore-OTA`, and use its browser at the returned
address. Keep that WiFi connection even if the phone warns it has no Internet.
This is the same intended node-AP route, but an actual phone browser upload
was not physically tested in this run.
A phone hotspot is useful only if the node and uploading device can both
join it and reach one another. Confirm the node's reported LAN URL before
uploading; hotspot client isolation can prevent this. The controlled shared
LAN test used a Pi access point, not a real phone hotspot, so a phone hotspot
is not the qualified default recommendation. For a node with only LoRa
reachability, use the [LoRa OTA guide](lora_ota_automation.md) and exact matching
target/storage package.
## When partition expansion is required
Use the exact migration ZIP selected for this board and role. Its README
defines the supported old updater, live-source checks and preservation set:
1. Upload that package's `wifi-bridge.bin` through the supported old updater.
2. Join the migration network described in its README and wait for
**Expanded layout ready**.
3. Upload the same package's `full-application.bin` through its `/update` page.
4. Verify the new layout, version, identity, ACL and supported saved settings.
Do not substitute a loose release application for the ZIP's supplied Full
application: migration packages can carry a required older target identity.
Do not combine stages from different packages. The bridge writes the
partition-table sector; loss of power during that write can require cable
recovery. See the [complete migration directions](esp32_wifi_partition_migration.md)
for the exact preservation limits and supported WiFi/LoRa routes. Actual
legacy-layout V4 migration was not physically tested in this run.
## Stock G2 migration limitation
The separate stock 1.14.1 G2 trial reached the `1e421ff4` Full application
over WiFi after partition expansion, but its final isolated
network check reached the client/DHCP deadline without a verified G2 client
or any HTTP request. The complete cable-free migration is therefore not
qualified. Plan for USB recovery if starting from that stock image.
The G2 was subsequently updated and verified through separate USB maintenance
on release source `88c851080`, with its original identity, ACLs, 22 common
settings and saved extras preserved. That result does not qualify the failed
WiFi-only final check. A legacy RX-gain loading correction preserves an
unambiguous saved gain of on from compact stock preferences; ambiguous older
zero padding retains the board default.
The [detailed test report](test-results/hardware_validation_esp32_web_console_ota_2026-10-05.md#release-candidate-follow-up-recorded-2026-10-07)
retains the original failures, host/network recovery and exact source revisions.
Latest-source physical V4 testing was unavailable; the measured older upgrade
routes below do not establish every board or starting version.
## Measured upgrade scope
The published 1.17.1.8 Full V4 installed newer applications over node AP and
a controlled shared LAN, with automatic restart and preserved identity and
ACL, despite missing old-page HTTP completion. On the earlier `c5fe8a0e` source,
the unchanged native AP pages returned HTTP 200/OK for G2 and V4 uploads;
the V4 upload completed in 16.392 seconds and its first ordinary clock reply
took 1.010 seconds against the unchanged 5-second console deadline. These
tests used compatible expanded layouts and do not qualify every board,
browser, phone or starting version. See the
[1.17.1.9 verification scope](releases/1.17.1.9.md#verification-scope).
+1
View File
@@ -61,6 +61,7 @@ nav:
- companion_offline_queue.md
- halo_keymind_settings.md
- Firmware updates and partitions:
- upgrading_1.17.1.8_to_1.17.1.9.md
- ota_user_guide.md
- ota_easy.md
- lora_ota_automation.md