ScotMesh microReticulum: Difference between revisions
More actions
Imported from the BookStack wiki (backup 2026-09-11) |
Drop the 433 MHz profile: it has been scrapped, ScotMesh is 868 MHz only |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 7: | Line 7: | ||
* a position on [https://rmap.world rmap.world]. | * a position on [https://rmap.world rmap.world]. | ||
Source: [https://github.com/ | Source: [https://github.com/ScotMesh/microReticulum_Firmware github.com/ScotMesh/microReticulum_Firmware]. Firmware: [https://rnode.scotmesh.net rnode.scotmesh.net] (choose ''Standalone node''). | ||
== Boards == | == Boards == | ||
| Line 38: | Line 38: | ||
# Open [https://rnode.scotmesh.net rnode.scotmesh.net] in Chrome or Edge on a computer. Choose '''Standalone node''', pick your board, and flash. | # Open [https://rnode.scotmesh.net rnode.scotmesh.net] in Chrome or Edge on a computer. Choose '''Standalone node''', pick your board, and flash. | ||
# On the configure step: | # On the configure step: | ||
#* pick '''ScotMesh 868''' | #* pick '''ScotMesh 868'''; | ||
#* give the node a name; | #* give the node a name; | ||
#* choose its role (normally ''Fixed relay''); | #* choose its role (normally ''Fixed relay''); | ||
| Line 46: | Line 46: | ||
== Using the node's page == | == Using the node's page == | ||
Open the node's NomadNet address in | Open the node's NomadNet address in Nomad Network or MeshChatX. You'll find the address: | ||
* at the end of the flasher; | * at the end of the flasher; | ||
| Line 82: | Line 82: | ||
=== Becoming an admin === | === Becoming an admin === | ||
You are an admin if your identity is on the node's remote-management list (the same list <code>rnstatus -R</code> checks). In your browser, choose '''Identify''' for the node (NomadNet: the ''Identify'' option on the page; MeshChatX | You are an admin if your identity is on the node's remote-management list (the same list <code>rnstatus -R</code> checks). In your browser, choose '''Identify''' for the node (NomadNet: the ''Identify'' option on the page; MeshChatX: ''identify to this node'') and reload. The page then shows 🛡️ ''Verified identity'' and an '''Admin''' link. There is no password to log in with: being identified is being logged in. | ||
[[File:home-admin.png|frameless|upright=2.2|Home page seen by an admin]] | [[File:home-admin.png|frameless|upright=2.2|Home page seen by an admin]] | ||
| Line 137: | Line 137: | ||
[[File:radio.png|frameless|upright=2.2|Radio page]] | [[File:radio.png|frameless|upright=2.2|Radio page]] | ||
'''Radio changes are a trial.''' Enter new settings (or pick ''ScotMesh 868 | '''Radio changes are a trial.''' Enter new settings (or pick ''ScotMesh 868'') and press ''Try these''. The node uses them for five minutes. Reconnect on the new settings and press ''Keep''. If you don't, the node goes back to the old settings by itself, so a mistake can't strand a remote node. | ||
[[File:role.png|frameless|upright=2.2|Role page]] | [[File:role.png|frameless|upright=2.2|Role page]] | ||
| Line 206: | Line 206: | ||
# ''Device → Restart & update → WiFi update → Yes, start''. The page shows a one-time WiFi password. Write it down; it is shown once. | # ''Device → Restart & update → WiFi update → Yes, start''. The page shows a one-time WiFi password. Write it down; it is shown once. | ||
# The node restarts as a WiFi access point called '''ScotMesh-Update''', off the mesh, for '''20 minutes'''. | # The node restarts as a WiFi access point called '''ScotMesh-Update''', off the mesh, for '''20 minutes'''. | ||
# Within WiFi range, join that network with the password and open '''<nowiki>http://192.168.4.1</nowiki>'''. | # Within WiFi range, join that network with the password and open '''<nowiki><nowiki>http://192.168.4.1</nowiki></nowiki>'''. | ||
# Choose the <code>.bin</code> from inside the board's release zip (for example <code>rnode_firmware_heltec32v3.bin</code>) and press ''Update''. The node verifies it and restarts into the new firmware. | # Choose the <code>.bin</code> from inside the board's release zip (for example <code>rnode_firmware_heltec32v3.bin</code>) and press ''Update''. The node verifies it and restarts into the new firmware. | ||
| Line 217: | Line 217: | ||
# This restarts the node with a Bluetooth firmware-update service for '''20 minutes'''. It advertises as <code>SenseCAP P1 DFU</code>. | # This restarts the node with a Bluetooth firmware-update service for '''20 minutes'''. It advertises as <code>SenseCAP P1 DFU</code>. | ||
# Within Bluetooth range, open '''nRF Device Firmware Update''' or '''nRF Connect''' on a phone. | # Within Bluetooth range, open '''nRF Device Firmware Update''' or '''nRF Connect''' on a phone. | ||
# Send the node's <code>rnode_firmware_seeed_solar_node_p1.zip</code> from the [https://github.com/ | # Send the node's <code>rnode_firmware_seeed_solar_node_p1.zip</code> from the [https://github.com/ScotMesh/microReticulum_Firmware/releases releases]. | ||
If nothing connects, the node restarts normally when the window closes. | If nothing connects, the node restarts normally when the window closes. | ||
| Line 271: | Line 271: | ||
| <code>/api/radio</code> | | <code>/api/radio</code> | ||
| — | | — | ||
| <code>{"freq": | | <code>{"freq":869462500,"bw":125000,"sf":9,"cr":5,"txp":22,"airtime":4.4,"noise":-105,"rssi":-59,"snr":10}</code> | ||
|- | |- | ||
| <code>/api/net</code> | | <code>/api/net</code> | ||
Latest revision as of 13:36, 17 September 2026
ScotMesh microReticulum is our build of attermann's microReticulum firmware. It turns a LoRa board into its own Reticulum transport node, so a board on a hill or a roof can relay for the mesh with no Raspberry Pi. On top of upstream it adds:
- the SenseCAP Solar Node P1;
- battery reporting;
- a NomadNet page you can manage the node from over the mesh;
- a small telemetry API;
- a position on rmap.world.
Source: github.com/ScotMesh/microReticulum_Firmware. Firmware: rnode.scotmesh.net (choose Standalone node).
Boards
| Board | Node pages & API | Firmware update over the air |
|---|---|---|
| Seeed SenseCAP Solar Node P1 🏴 built by ScotMesh | Yes | Bluetooth update window, or USB bootloader |
| Heltec V2/V3/V4, Heltec Wireless Tracker V2, XIAO ESP32S3, T-Beam Supreme, T-Deck | Yes | WiFi update window |
| T-Beam, T3S3, LoRa32 v1/v2/v2.1, RNode NG 2.0/2.1, Feather ESP32, generic ESP32 | Yes | USB only (one firmware slot) |
| RAK4631, RAK3401, T-Echo | Original microReticulum pages (the new ones don't fit their flash yet) | USB |
Setting a node up
- Open rnode.scotmesh.net in Chrome or Edge on a computer. Choose Standalone node, pick your board, and flash.
- On the configure step:
- pick ScotMesh 868;
- give the node a name;
- choose its role (normally Fixed relay);
- paste your identity hash under Remote management. That makes you its admin.
- The node restarts in transport mode and announces its NomadNet page. You can do everything else from that page over the mesh.
Using the node's page
Open the node's NomadNet address in Nomad Network or MeshChatX. You'll find the address:
- at the end of the flasher;
- on the node's About page;
- in the node's announce.
Every page is small enough to arrive in one LoRa packet, so it loads first time even on weak links. Most are 150–300 bytes, and the limit is 409.
The screenshots below are the real pages, fetched over LoRa from our bench P1 (3 hops, through rns.scotmesh.net and a gateway). What you see in your browser depends on its colours.
Home page
The home page shows:
- the node's name;
- its battery, as a bar (green / amber / red) with % and voltage, plus ▲ while charging or ▼ while discharging;
- uptime and the number of known routes.
An admin can also show the radio settings, airtime and an operator line. The footer always shows the firmware version and the board. Not identified means your browser hasn't identified to the node. That's fine for visitors.
Routes and neighbours
Routes lists the node's path table: destination, hops and when it was last heard. Neighbours lists the transport nodes it hears directly, with their names where they announce one. To change the view:
- tick Short for 8-character addresses (or leave it off for full ones);
- set Rows and press Apply;
- use next and back to page through.
An admin can hide both pages from visitors.
Becoming an admin
You are an admin if your identity is on the node's remote-management list (the same list rnstatus -R checks). In your browser, choose Identify for the node (NomadNet: the Identify option on the page; MeshChatX: identify to this node) and reload. The page then shows 🛡️ Verified identity and an Admin link. There is no password to log in with: being identified is being logged in.
Admins see every row. A * marks rows that visitors don't see.
If an admin has switched on password registration, a visitor who has identified sees Register. Entering the password adds their identity as an admin, or puts them in a queue for an existing admin to approve.
The admin pages
The hub shows battery and uptime, and warns you when a radio trial needs confirming or someone is waiting for approval. It links to three sections.
| Section | Pages |
|---|---|
| Settings | Name & announce: renaming announces straight away. Announce every 30 min, 1 h, 3 h, 6 h or 12 h. Home page: what visitors see, telemetry API on or off, and a visitor preview. |
| Access | Admins: add by identity hash; remove with confirmation. Password registration. |
| Device | Health: free RAM and flash, starts and last reset reason, noise floor, last RSSI/SNR, airtime, packets, table sizes. Lights & Bluetooth, Logs (last five log lines), Maintenance, Restart & update, About |
Name & announce
Home page layout
Radio and role
Radio changes are a trial. Enter new settings (or pick ScotMesh 868) and press Try these. The node uses them for five minutes. Reconnect on the new settings and press Keep. If you don't, the node goes back to the old settings by itself, so a mistake can't strand a remote node.
Role:
- Fixed relay: forwards for everyone. Use it for hilltop and roof nodes.
- Access point: for a node that serves nearby clients.
- Mobile: for a node that moves.
- End device: never forwards.
A role change applies after a restart.
Power
Admins and password registration
- Admins (up to 8): paste a 32-character identity hash and press Add. Tap an identity to remove it; you're asked to confirm. The node won't remove its last admin.
- Password registration is off by default. An admin sets a password. Someone who knows it can identify to the node and register their own identity as an admin.
- Three wrong tries lock that identity for 15 minutes.
- Ten wrong tries in an hour pause registration.
- With Needs approval ticked, new registrations wait for an existing admin.
Health, lights and Bluetooth
Maintenance
From here you can:
- announce now;
- restart automatically every day or every week;
- clear stored routes and data;
- factory reset. This keeps the node's identity and its admins.
- full reset. The node forgets its identity too: new addresses, no admins, no settings. Use it to hand a node on, or before re-flashing it as a different node. Afterwards it needs USB to make it yours again (the flasher's Reconfigure path).
Anything disruptive asks you to confirm, with a link that works once, for two minutes.
Restart and firmware updates without a cable
Updates are started from the node's page over the mesh, but the firmware itself is too big to send over LoRa, so someone has to be near the node with a phone or laptop for the transfer. The node accepts the new image's hash by itself afterwards; you don't need rnodeconf or the flasher.
WiFi update (ESP32 boards with two firmware slots: Heltec V2/V3/V4, Tracker V2, XIAO ESP32S3, T-Beam Supreme, T-Deck):
- Device → Restart & update → WiFi update → Yes, start. The page shows a one-time WiFi password. Write it down; it is shown once.
- The node restarts as a WiFi access point called ScotMesh-Update, off the mesh, for 20 minutes.
- Within WiFi range, join that network with the password and open <nowiki>http://192.168.4.1</nowiki>.
- Choose the
.binfrom inside the board's release zip (for examplernode_firmware_heltec32v3.bin) and press Update. The node verifies it and restarts into the new firmware.
A WiFi update leaves the node running from its second firmware slot. That's fine for the flasher (it always resets the slot choice), but if you later update by hand with esptool or rnodeconf, write boot_app0.bin at 0xE000 as well as the firmware, or the board keeps booting the old slot and refuses to start transport ("device init failed").
If nothing is uploaded in 20 minutes, or the upload fails, the node restarts unchanged. The 4 MB boards (T-Beam, T3S3, LoRa32, RNode NG, Feather, generic ESP32) have one firmware slot and can only be updated over USB.
Bluetooth update (SenseCAP P1):
- This restarts the node with a Bluetooth firmware-update service for 20 minutes. It advertises as
SenseCAP P1 DFU. - Within Bluetooth range, open nRF Device Firmware Update or nRF Connect on a phone.
- Send the node's
rnode_firmware_seeed_solar_node_p1.zipfrom the releases.
If nothing connects, the node restarts normally when the window closes.
USB bootloader is for someone on site with a laptop. The node waits in its bootloader until it is flashed (for example from rnode.scotmesh.net) or reset.
None of these start below 30 % battery unless the node is charging.
Starting a node from scratch
The flasher keeps a node's identity, settings and routes across a reflash, which is what you want for an update. To wipe a node and start again (a second-hand board, or one you want new addresses for), tick Start from scratch: erase everything first on the flasher's Flash step. On ESP32 boards that erases the whole flash; on the P1 and other nRF52 boards it asks the firmware for a full reset and wipes the EEPROM. Either way the node comes back with a new identity and the flasher provisions and configures it again.
Showing the node on rmap.world
- On Settings → Map, paste the node's position straight from Google Maps. Right-click the spot and click the coordinates, e.g.
56.19858019391934, -3.1666195614405708. Degrees-minutes-seconds works too. - Set its height in metres.
- Choose Exact or ~1 km.
- Tick Publish and save.
The node then sends the standard Reticulum interface-discovery announce on the announce interval. It's the same announce a PC node sends with discoverable = yes. rns.scotmesh.net peers with rmap.world, so the announce reaches the map through the backbone.
The position is public once published. Use ~1 km if that matters.
Telemetry API
For trackers and dashboards, the node answers plain JSON requests on the same NomadNet address.
- No identity is needed.
- An admin can switch the API off under Home page.
- Each reply fits in one packet.
- List endpoints page with
o(offset) andn(rows), and add"more": truewhen there are more rows.
| Path | Request data | Reply (real examples from the bench P1) |
|---|---|---|
/api
|
— | {"v":1,"api":["bat","up","radio","net","sys","health","pos","paths","nbrs","all"]}
|
/api/bat
|
— | {"percent":96,"voltage":4.11,"charging":true}
|
/api/up
|
— | {"uptime":134,"reset":"soft-reset"}: seconds since start, and why it last started
|
/api/radio
|
— | {"freq":869462500,"bw":125000,"sf":9,"cr":5,"txp":22,"airtime":4.4,"noise":-105,"rssi":-59,"snr":10}
|
/api/net
|
— | {"routes":159,"neighbours":1,"rx":20,"tx":18,"links":1}
|
/api/sys
|
— | {"fw":"v1.86-scotmesh.3","board":"SenseCAP P1","name":"…","free_ram":33472,"free_flash":1822720}
|
/api/health
|
— | {"free_ram":33472,"free_flash":1822720,"reboots":7,"reset":"soft-reset","paths":159,"paths_max":500,"announces":0,"neighbours":1}
|
/api/pos
|
— | {"lat":56.19858,"lon":-3.16662,"height":310}, or {"error":"not published"}
|
/api/all
|
— | battery + uptime + network + airtime in one reply |
/api/paths
|
{"o":0,"n":5,"s":0}
|
{"total":159,"o":0,"cols":["dest","hops","age_s","via"],"rows":[[…],…],"more":true}
|
/api/nbrs
|
{"o":0,"n":5,"s":1}
|
{"total":1,"o":0,"cols":["dest","age_s","name"],"rows":[…]}
|
s=1 gives 8-character addresses. Unknown paths answer {"error":"unknown endpoint","see":"/api"}. If the node is short of memory, it answers {"error":"busy"}.
Here's a tracker in Python. It needs Reticulum installed and connected to the mesh, e.g. with a TCP interface to rns.scotmesh.net port 4242:
import RNS, json, time
RNS.Reticulum()
node = bytes.fromhex("cb37c17f7280d61d66b5278a02313d25") # the node's NomadNet address
if not RNS.Transport.has_path(node):
RNS.Transport.request_path(node)
while not RNS.Transport.has_path(node): time.sleep(0.5)
dest = RNS.Destination(RNS.Identity.recall(node), RNS.Destination.OUT,
RNS.Destination.SINGLE, "nomadnetwork", "node")
link = RNS.Link(dest) # no identify() needed
while link.status != RNS.Link.ACTIVE: time.sleep(0.2)
link.request("/api/all", response_callback=lambda r: print(json.loads(r.response)))
link.request("/api/paths", data={"o": 0, "n": 5},
response_callback=lambda r: print(json.loads(r.response)))
Keep one link open and poll every few minutes. Each request and reply is a single small packet (typically 3–5 s round trip over three hops).
Good to know
- The node keeps its settings in its own flash. Its identity and admin list survive firmware updates and a factory reset.
- One exception: RNode NG 2.0/2.1 and LoRa32 v2.1 nodes flashed with v1.86-scotmesh.2 or earlier get a new identity when updated to .4 or later, because those boards moved to a larger app slot (2.25 MB) to fit the pages. Add the node's new identity to your admin list again afterwards. Updates after that keep the identity.
- Memory is watched:
- pages and the API never copy the route table;
- the change log is a fixed 1.3 KB file;
- below about 8 KB of free RAM, the node answers "busy" rather than risk running out.
/api/healthshow free RAM, so a slow leak shows up as a trend. - The LEDs on the P1:
- white flash: packet received;
- blue flash: packet sent;
- blue and white alternating fast: the radio failed to start (the node restarts itself after a few seconds).
- Full debug logging stays in the firmware. Connect over USB and open a serial console at 115200 to see it.
- Upstream differences and the full change history are in the repository's README.

















