Skip to content

v0.0.5

Choose a tag to compare

@github-actions github-actions released this 26 Aug 20:45

RetiMesh Node v0.0.5

The node now keeps its Reticulum state across restarts, respects an hourly
transmit budget, and shares the channel the way an RNode does.

🚀 Features

  • Reticulum storage on the microSD card. When a card is mounted at boot,
    the path table, known destinations, announce cache and packet hashlist live
    on it (/sd/rns) instead of the ~900 KB flash partition shared with the web
    app. The card is then reserved: it cannot be formatted while in use, and
    pulling it is reported rather than ignored. Turn it off with Reticulum store
    on SD
    on the settings page.
  • Node QR codes. GET /api/qr?what=wifi|portal|address returns an SVG
    generated on the device, and the display gains a QR page — point a camera at
    the node to join its Wi-Fi instead of typing the password. The Wi-Fi code
    needs the admin credentials whenever the access point is protected.
  • Hourly duty-cycle limiter. duty_cycle_pct (default 1, 0 = off) caps
    how much of each hour the node may transmit for — 1 % is the ETSI allowance
    for 868.0–868.6 MHz, where the default channel sits. When the budget is
    spent, packets wait in the queue instead of being dropped; the status page
    and display show how much is left and when it frees up.

📻 Radio / protocol

  • RNode-compatible CSMA. Wait for a clear channel, hold it clear for a DIFS
    of two slots, then count down a contention window drawn from one of four
    bands sized by recent channel use, restarting whenever a frame arrives. A slot
    is 12 symbol times clamped to 24–100 ms (25 ms at SF8/BW125). Sharing a
    channel with real RNodes is the point, so the sizing follows theirs.
  • Airtime accounting using the Semtech time-on-air formula, reported through
    /api/status.airtime (short- and long-term channel use, budget used, CSMA
    slot and band).

🐛 Fixes

  • Reticulum state no longer survives only until the next reboot. microStore
    deleted every record whose timestamp was "in the future", and on a device
    whose clock restarts at zero that is everything the previous run wrote — the
    path table, known destinations and hashlist were wiped on every restart.
    Fixed in our fork; the firmware now builds against it.
  • The path list on the status page was always empty. Paths had moved into
    microStore's table; the firmware was still reading the legacy in-memory one.
  • The DevKitC-1 release image put the web app inside the app partition.
    Packaging read the wrong partition table for boards that inherit one from
    their board definition, so esp32s3-qspi images from earlier releases boot
    without a web UI. Offsets now come from the partition table that was built.
  • The SD store could silently fall back to internal flash even with a
    healthy card, because the boot mount retried through a probe that
    re-initialises the card. Retries are plain mounts now, over a longer window.
  • A stack overflow could reboot the node: the SD task idled with under 1 KB
    of its 4 KB stack. It has 8 KB, and the heartbeat reports every task's
    headroom.
  • Stored paths whose interface no longer exists are dropped instead of
    lingering unroutable; the bulletin-board probe no longer logs an error on
    every status poll.

📖 Documentation

  • Duty cycle and channel access explained in docs/configuration.md; the QR
    endpoint, airtime and storage objects in docs/api.md.

⚠️ Upgrading

Nothing to do — settings and the node identity are preserved. If you flashed an
esp32s3-qspi image from v0.0.4 or earlier, reflash: the filesystem went to the
wrong offset.

Commits since v0.0.4

  • Use PSRAM: 128-byte malloc threshold and ring storage in external RAM (10d2141)
  • Wi-Fi station mode: join a LAN alongside the access point (abd463e)
  • Power profiles, battery gauge, HIL harness (790674a)
  • Bench env against the local microReticulum/microStore fix branches (f1ad68c)
  • Document the t3s3-upstream environment (b6b62a4)
  • Build against the forked microReticulum/microStore by default (088f3d9)
  • Give the SD card task an 8 KB stack; report per-task stack headroom (dd57809)
  • Packaging: take partition offsets from the built partition table (805848b)
  • Keep the Reticulum store on the SD card, and make it survive reboots (cad5b09)
  • Node QR codes on the portal and the display (d778e28)
  • Drop stored paths whose interface no longer exists (33a5296)
  • Airtime accounting, an hourly duty-cycle limiter, and RNode's CSMA (de047fd)
  • Fix the SD store falling back to internal flash at boot (5ab00cd)

Install

  • Browser: open the web flasher, pick your board, click Install.
  • Terminal: pipx run --spec "git+https://github.com/dobrevit/RetiMesh_Node#subdirectory=tools/retimesh-flash" retimesh-flash install
  • Manual: flash retimesh-node-0.0.5-<board>-merged.bin at 0x0 with esptool; per-partition files and offsets are in release.json.

SHA-256 checksums for every asset are in sha256sums.txt.