Skip to content

Offband offband-v1.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Jun 04:41

The headline is Epic F: the companion-API config command — a WiFi observer can now be
configured entirely from the app (WiFi, the full MQTT broker pool, display) over BLE —
plus the observer config/NVS-layer hardening that came out of bench-validating it. Still
on the MeshCore 1.16.0 base.

Added

  • Companion-API config command (Epic F, #159) — configure a WiFi observer from the
    MeshCore/Offband app over BLE: WiFi credentials, the full MQTT broker pool (per-slot
    url / port / transport / auth / JWT claims / CA-cert / topic-prefix / IATA),
    enable / disable / clear a slot, and display settings. Wholly observer-gated and surfaced
    behind a new WIFI_OBSERVER_SUPPORT capability bit + FIRMWARE_VER_CODE 14, so stock
    companions are unaffected. (#160#169)
  • Per-broker live state in the broker read (#172) — each slot now reports its live
    connection state (connecting / up / backoff / held …) + last-error class, so the
    app shows whether a broker actually connected, not just that it's enabled.
  • Resolved-default hints (#173, #186) — when jwt_owner / iata_override are unset,
    the read shows the value the device will actually use at connect (its own pubkey / the
    global IATA) as a placeholder instead of a confusing blank — in both the pool dump and
    the per-field read.

Changed

  • Honest observer config writes (SAFELANE §6, #181) — the config / NVS write path used
    to silently swallow failures (a broker disable could ACK success while nothing changed).
    Every writer, the live-reload path, and the crash logger itself now surface + log
    failures with context. This is what root-caused #179.
  • Compact broker config storage + seamless migration (#182) — broker config is stored
    as small per-key entries (no blank fields) rather than one ~1 KB blob, so writes fit a
    near-full NVS; a one-time invisible boot migration reclaims space on upgrade, so the
    operator never sees a transient write error.
  • CoreScope (okimesh) default brokermqtt://mqtt1.okimesh.org:1883 (#170).
  • Offband tell in MQTT (#174) — observer nodes append a 📡 to their display name in
    MQTT payloads, so feeds / maps can flag Offband observers.

Fixed

  • #179 — a broker disable ACK'd success while the dump still reported enabled=1.
    Root-caused as a near-full-NVS write failure the old code lied about; fixed by #181
    (honest write) + #182 (storage that fits). Verified on hardware.
  • Observer capped at 1 concurrent TLS broker (#171) — a heap guard stops the OOM reboot
    when a 2nd TLS/wss broker's ~60 KB mbedTLS context exhausts the Heltec V3 heap. Measured
    on hardware (1 wss ≈ 63 KB free, 2 wss ≈ crash).
  • BLE connect survives the client's reconnect-thrash (#178) — a deeper ESP32 BLE frame
    queue (4 → 12) + stream terminators on reconnect, so a mid-stream reconnect can't leave
    the app's contact / settings sync hung. Affects companion and observer. (The root —
    the client's uncapped reconnect retry — is paced client-side in meshcore-client.)
  • Crash log reliable for the whole boot (#183) — the 1 Hz heartbeat was flooding the
    4 KB RTC crash-ring (wrapped in ~50 s) and evicting real crash diagnostics; the heartbeat
    now writes the ring every 30 s / on a sharp heap drop, so a post-reboot dump keeps the
    evidence that explains a crash past boot+50 s.

CI / build

  • Heltec T114 (nRF52) companion added to the CI matrix (#185) — first nRF52-companion
    build coverage (complements the existing RAK4631 repeater).

Which file do I download?

File What it is When to use it
*-merged.bin (ESP32 — Heltec V3/V4, XIAO) Full image — bootloader + partition table + app in one, flashed at 0x0 after a chip erase. Self-contained, works on a blank chip. First install / clean setup. In a web flasher this is the "Full Firmware" option.
*.bin (ESP32) App only — flashed at the app offset (0x10000); the bootloader must already be on the chip. Updating an existing node — OTA / "Update Only." Keeps the device identity + WiFi/MQTT config.
*.uf2 (nRF52 — RAK, T-Echo, XIAO nRF52) Complete self-contained image. First install and updates — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.)

⚠️ ESP32: the app-only *.bin will not boot if flashed at 0x0 — use *-merged.bin for a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, never a routine update.

What's Changed

  • fix(#151): harden backup-device-key.py (key-leak + capture robustness) by @Strycher in #155
  • feat(#153): Offband-first OLED boot splash + dev-only heap readout by @Strycher in #156
  • feat(#154): surface Offband version in companion API + rebrand default BLE name by @Strycher in #157
  • feat(#152): sync device clock from GPS (provider-agnostic) + gps time/sync readout by @Strycher in #158
  • docs: release approval gate by @Strycher in #140
  • Epic F: Offband companion-API config command (+ observer config-layer hardening) by @Strycher in #184

Full Changelog: offband-v1.0.0...offband-v1.1.0