v0.0.5
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|addressreturns 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, soesp32s3-qspiimages 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,airtimeandstorageobjects indocs/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.binat0x0with esptool; per-partition files and offsets are inrelease.json.
SHA-256 checksums for every asset are in sha256sums.txt.