L-MESH (Leantegra Mesh) is a battery-operated 2.4 GHz TDMA mesh protocol with relay functions for RTLS, GNSS, Sensor Telemetry and Alarms.
L-MESH carries measurements and messages across a chain of devices that have no cabling and no network coverage — the case an underground tunnel presents. It runs on the Unified TDMA schedule, so its slots share one time base with UWB ranging rather than competing with it, and it provides the assistance functions that let the expensive radios stay asleep.
| Band | 2.4 GHz |
| Access | TDMA — scheduled slots, no contention |
| Platform | nRF52 series, within the capabilities of the fitted radio |
| Relays | RTLS · GNSS · Sensor Telemetry · Alarms |
| Provides | presence detection · assistance data distribution |
The decision that shapes everything else is that a receiver is told when to listen. An unscheduled protocol cannot say that, so the listener must scan — and scanning is what makes battery relays impossible:
| Approach | Receiver cost |
|---|---|
| Advertising — listener scans 30 ms every 500 ms | ≈ 0.28 mA |
| Advertising — listener scans continuously | ≈ 4.6 mA |
| L-MESH — listener opens a known 1.3 ms window per relay round | ≈ 0.072 mA |
Transmitting is cheap in any protocol. Hearing is what costs, and it costs in proportion to how long the receiver has to keep its radio on waiting. A schedule collapses that window to the width of the frame plus a guard.
A tunnel is effectively one-dimensional, which makes the hard parts of mesh easy. Routing is upstream or downstream — there is no discovery protocol and no routing table to converge. Nodes are placed along the drift, typically every 50 m, giving 60 to 100 nodes across 3–5 km.
Relay slots are assigned by position in the chain, not by device:
relay slot = hop index mod reuse factor (default 4)
Four relay slots therefore serve a chain of any length. A hundred-node chain does not need a hundred slots, which matters because the schedule is bounded — see capacity below.
Ordering the reuse groups along the direction of flow means data advances one hop per relay slot rather than one hop per superframe. The reuse factor sets how many slot identities exist — four; the relay region sets how many slot positions the superframe carries, and that is what bounds progress:
hops advanced per superframe = relay slots in the superframe (default 24)
| Chain | Ordered — 24 hops/superframe | Unordered — 1 hop/superframe |
|---|---|---|
| 59 hops (3 km) | ≈ 1.1 s | ≈ 30 s |
| 99 hops (5 km) | ≈ 2.0 s | ≈ 50 s |
The relay region cannot be made arbitrarily long: it competes for the same slot table as everything else in the superframe, which holds 29 usable positions. A chain longer than the relay region spans more than one superframe, and the superframe boundary — not the hop — becomes the dominant cost. See Delays and performance.
At the data rates these networks run — 0.5 Hz, often 0.1 Hz — transmitting is not what drains the battery. What drains it is opening a receive window wide enough to be certain of catching the sender, and that width is set by how far the local clock has drifted since the last sync.
On receiving a sync frame a node learns two things: where its clock is (phase error) and, by differencing against the previous sync, how fast it is running (rate error). Correcting only the first leaves a 500 ppm part behaving like a 500 ppm part. Correcting both makes it behave like roughly 50 ppm.
phase_err = t_actual − t_expected
rate_ppm = phase_err / interval_since_last_sync
ppm_est = filter(ppm_est, rate_ppm)
slot_time −= slot_time × ppm_est
guard_us = k × |ppm_est| × time_since_sync ← adaptive, not fixed
Required receive window, including a 1 ms frame and radio ramp:
| Clock | Resync 2 s | Resync 10 s | Resync 30 s |
|---|---|---|---|
| Uncompensated RC, 500 ppm | 3.1 ms | 11.2 ms | 31.1 ms |
| Calibrated RC, 250 ppm | 2.1 ms | 6.2 ms | 16.1 ms |
| Rate-compensated, ≈ 50 ppm | 1.3 ms | 2.1 ms | 4.1 ms |
| 32.768 kHz crystal, 20 ppm | 1.2 ms | 1.5 ms | 2.4 ms |
A node coasting 30 seconds on an uncompensated RC oscillator listens 26× longer than a crystal-equipped node for the same frame. Rate compensation recovers most of that in software, on hardware that has no low-frequency crystal fitted.
The guard tracks measured drift rather than a worst-case specification, so a node in a thermally stable tunnel converges to a narrow guard and stays there, while one near ventilation widens its own until it re-converges. Nothing is configured per site, and no unit pays for the worst unit in the fleet.
A node opens one receive window per relay round — six per superframe, twelve per second — whether or not anything arrives for it. Guard width therefore multiplies straight into standing current, and the rows below are the drift table above priced at that cadence:
| Clock | Resync 2 s | Resync 10 s |
|---|---|---|
| Uncompensated RC, 500 ppm | 0.171 mA | 0.618 mA |
| Calibrated RC, 250 ppm | 0.116 mA | 0.342 mA |
| Rate-compensated, ≈ 50 ppm | 0.072 mA | 0.116 mA |
| 32.768 kHz crystal, 20 ppm | 0.066 mA | 0.083 mA |
Against a 9600 mAh cell (Locator Lite XT) that is 1.8 years for an uncompensated part at a 10 s resync, against a figure bounded by cell ageing rather than consumption once rate compensation is holding. Compensation is worth 2.4× at a 2 s resync and brings a crystal-less part within 9% of one that has a crystal fitted.
This is the standing cost of belonging to the mesh — listening in every relay round with nothing to carry. What traffic adds on top is in Delays and performance, and it is the smaller number of the two.
These are idle figures — the cost of holding a place in the schedule with nothing to carry, which is set by clock quality alone. What relayed traffic adds on top is in Delays and performance.
The channel is derived from the slot counter rather than fixed:
channel = hop_seq[ (slot_counter + node_offset) mod HOP_LEN ]
Two things follow. A chain that would fail on one congested channel keeps running on the rest — worth having anywhere near WiFi. And the same 16-channel hop set supplies the frequency diversity that L-DCB positioning depends on — L-DCB sequences that set within a single slot on its own counter rather than taking one channel per slot, so the two share the channel plan without sharing the derivation.
Relay traffic is not uniform. A telemetry record can wait for the next scheduled slot; an alarm cannot.
| Class | Carries | Latency |
|---|---|---|
| Expedited | Alarms — gas, SOS, proximity | Injected at the next round boundary rather than waiting for the relay period — transit across the chain is still the relay’s |
| Scheduled | RTLS, GNSS, Sensor Telemetry | Relay cadence — 0.5 Hz or 0.1 Hz |
| Bulk | Buffered history, diagnostics | Best effort, yields to both |
A relay running at 0.1 Hz would hold an alarm for up to ten seconds plus hop latency. The expedited class exists because that is not an acceptable number for a safety function, and it is stated separately from the telemetry cadence for exactly that reason.
Beyond carrying data, L-MESH lets the power-hungry subsystems stay asleep. Both functions exploit the same asymmetry — the 2.4 GHz radio costs a fraction of what UWB reception or GNSS acquisition costs, so it is used to decide whether those radios need to run at all. The schedule already says when each slot begins; what it cannot say is whether a given slot will carry anything.
| Function | Provides | Detail |
|---|---|---|
| Presence detection | a device announces itself on 2.4 GHz; the positioning radio wakes only for slots belonging to devices known to be in range | A-RTLS |
| Assistance data | satellite ephemeris and almanac broadcast downstream over slots the chain already uses | A-GNSS |
Both are downstream of the same design decision: because every radio reads one Unified TDMA schedule, a wake time worked out on the cheap radio is directly usable by the expensive one. No negotiation is needed to agree when to listen.
Because access is scheduled, capacity is a slot count rather than a collision probability. It is exact, and it is bounded.
| TDMA superframe | Usable slots | Relay | Sync + ingress |
|---|---|---|---|
| 500 ms | 29 | 24 | 5 |
| 250 ms | 29 | 24 | 5 |
The split is the design decision that matters most, because the two halves buy different things. Relay slots buy latency — each one advances a record a further hop before the superframe ends. Ingress slots buy admitted devices. At 24 relay slots a chain crosses 24 hops per superframe and five slots remain for sync and ingress.
Ingress capacity is not five devices. Ingress slots are spatially reused exactly as relay slots are, so the same five positions serve every reuse zone along the chain independently — roughly 25 zones on a 100-node chain. It is the local density that is capped at five per zone, not the population.
Slot count is capped by the scheduler, not by airtime — at these TDMA superframe periods the ceiling binds well before the medium does. Deployments needing more concurrent devices either shorten the superframe or raise the cap.
Behaviour at the limit differs from a contention protocol in a way worth designing around. A contention network degrades gradually and silently as density rises; a scheduled one delivers everything it admits and refuses what it cannot. That makes admission control a required feature rather than an optional one.
Every node's data crosses the last link before the gateway, so that node's load scales with the whole chain while the far end stays idle:
| Chain | Per node | Head-node load |
|---|---|---|
| 60 nodes | 1 record/s | 60 records/s |
| 100 nodes | 1 record/s | 100 records/s |
| 100 nodes | 5 records/s | 500 records/s |
What that concentration costs the head node in current, and how it behaves as devices are added, is in Delays and performance.
Three responses, in order of preference: power the head node, since portals and substations generally have mains; place gateways along the chain, roughly every kilometre, which splits the funnel and shortens the longest path; and aggregate before relaying, since at these record sizes framing overhead is a large fraction of airtime.
The question a deployment has to answer is how old a record is by the time it reaches the terminating node — the gateway end of the chain — and what carrying that traffic costs the nodes in between. Both follow from the schedule, so both are calculable rather than measured after the fact.
A record advances one hop per relay slot, and the superframe carries 24 of them. A 99-hop chain therefore needs five superframes, and what dominates is not the hops but the four waits between them:
Latency is a staircase, not a slope. Every 24 hops adds one whole superframe, so a 24-hop chain and a 1-hop chain both deliver inside 500 ms, while hop 25 costs another half second. Chain length is a commissioning parameter for that reason, and the step is worth designing segments around rather than discovering afterwards.
Every latency figure in this section is for a fixed chain of 100 nodes. Chain length is the variable that actually moves them — device count does not:
| Nodes | Chain | Hops | Superframes | Arrival |
|---|---|---|---|---|
| 25 | 1.2 km | 24 | 1 | 0.12 s |
| 49 | 2.4 km | 48 | 2 | 0.62 s |
| 50 | 2.45 km | 49 | 3 | 1.00 s |
| 60 | 3.0 km | 59 | 3 | 1.05 s |
| 100 | 5.0 km | 99 | 5 | 2.02 s |
The 49-to-50 node row is the staircase in practice: one extra node at the end of a drift costs 380 ms, because hop 49 starts a third superframe that hop 48 did not need. A commissioning decision can therefore cost more latency than any setting in this document.
These figures assume the relay region holds 24 slots — that L-MESH has the superframe close to itself. Where UWB ranging shares the same 29-slot table, relay gets fewer: at 14 relay slots the 99-hop chain becomes 3.5 s. The split is a deployment decision before it is a protocol one.
Latency is flat across device count and reporting rate throughout the range below, and is set by chain length alone. That is the property scheduled access is bought for: a record occupies a slot that was already reserved, so adding devices does not lengthen anyone else’s path. What device count changes is how full each relay frame is, not when it departs.
| Devices | Rate | Records/s | Relay frame | Far-end arrival | Mid-chain arrival |
|---|---|---|---|---|---|
| 10 | 1 Hz | 10 | 1 of 16 records | 2.0 s | 1.0 s |
| 10 | 0.5 Hz | 5 | 1 of 16 | 2.0 s | 1.0 s |
| 10 | 0.1 Hz | 1 | 1 of 16 | 2.0 s | 1.0 s |
| 50 | 1 Hz | 50 | 2 of 16 | 2.0 s | 1.0 s |
| 50 | 0.5 Hz | 25 | 1 of 16 | 2.0 s | 1.0 s |
| 50 | 0.1 Hz | 5 | 1 of 16 | 2.0 s | 1.0 s |
| 100 | 1 Hz | 100 | 4 of 16 | 2.0 s | 1.0 s |
| 100 | 0.5 Hz | 50 | 2 of 16 | 2.0 s | 1.0 s |
| 100 | 0.1 Hz | 10 | 1 of 16 | 2.0 s | 1.0 s |
The two arrival columns are transit time — from a record entering the mesh to it reaching the terminating node. What that does and does not cover:
| Starts at | the record entering its ingress slot — for a sensor sampled inside its own slot this is the moment of measurement |
| Ends at | the terminating node at the gateway end of the chain |
| Covers | ingress slot, every relay hop — 99 at the far end, 50 mid-chain — and the superframe boundary crossed after every 24 hops |
| Is the mean | a record entering just after its relay slot has passed waits one more superframe; the worst case at 99 hops is 2.5 s |
| Excludes | gateway processing and the onward MQTT publish; a retransmission after a lost frame adds one round, 20 ms |
A relay frame is about 1 ms and holds roughly 16 records at Sensor TLV sizes. At 100 devices reporting every second the head node is carrying two records per frame — an eighth of one frame’s capacity, against 24 frame opportunities per TDMA superframe. Airtime is not the constraint anywhere in this table. The reporting rate sets how often a value is refreshed, not how long it takes to arrive.
The two directions do not cost the same. Slots are ordered along the direction of flow — toward the gateway — so a record travelling upstream advances one hop per slot, while one travelling downstream finds the next node’s slot has already passed and must wait for the following round:
| Chain | Upstream — one hop per slot | Downstream — one hop per round |
|---|---|---|
| 19 hops (1 km segment) | 0.10 s | ≈ 2.0 s |
| 99 hops (5 km) | 2.06 s | ≈ 10 s |
| 199 hops (10 km) | 4.50 s | ≈ 20 s |
Downstream traffic is configuration, assistance data and messages — rare, and tolerant of seconds. The asymmetry is a deliberate consequence of ordering the schedule for the direction that carries almost all the traffic. Where outbound latency matters, alternating the slot ordering between superframes makes the two symmetric at the cost of halving upstream throughput.
| Traffic | Added before relay |
|---|---|
| Sensor TLV — sampled inside the device’s own slot | none |
| RTLS position — ranging slot ordered before ingress | none |
| RTLS position — ranging slot ordered after ingress | + one superframe (500 ms) |
| Alarm — Expedited class | next round boundary, ≤ 20 ms |
Slot ordering inside the TDMA superframe is worth half a second on every RTLS record and costs nothing to get right. Placing the ranging slot ahead of the ingress slot lets a position leave in the superframe it was measured in; the reverse order holds it until the next one.
A relay region of 24 slots is six rounds of four. A node listens once per round — 1.3 ms with rate compensation held at a 2 s resync — which is 0.072 mA of listening whether or not anything arrives, and transmits a 1 ms frame only when it has something to forward. Listening, not traffic, is most of the bill:
| Devices | Rate | Frames/superframe | Head node | Head-node service life |
|---|---|---|---|---|
| 10 | 1 Hz | 1 | 0.081 mA | cell-limited |
| 10 | 0.5 Hz | 1 | 0.081 mA | cell-limited |
| 10 | 0.1 Hz | < 1 | 0.077 mA | cell-limited |
| 50 | 1 Hz | 2 | 0.091 mA | cell-limited |
| 50 | 0.5 Hz | 1 | 0.081 mA | cell-limited |
| 50 | 0.1 Hz | 1 | 0.081 mA | cell-limited |
| 100 | 1 Hz | 4 | 0.110 mA | ≈ 10 years |
| 100 | 0.5 Hz | 2 | 0.091 mA | cell-limited |
| 100 | 0.1 Hz | 1 | 0.081 mA | cell-limited |
Relay contribution only, against a 9600 mAh cell (Locator Lite XT); sensing, positioning and MCU wake add to it. Cell-limited means the computed figure passes 20 years, at which point calendar ageing decides service life rather than consumption.
The whole column spans 0.077 to 0.110 mA — a 43% range across a tenfold change in offered load, because 0.072 mA of it is listening that happens regardless. Traffic is close to free; holding a place in the schedule is not. That also means the levers worth pulling on power are the ones that shorten the listening, not the ones that reduce records: a wider resync interval or a narrower guard moves this table far more than halving the device count does.
The head node is still the node to mains-power, but on this arithmetic the reason is reliability rather than current: it is the single point every record crosses, and at 0.11 mA the relay function alone would outlast the cell. The funnel matters for what it concentrates, not for what it consumes.
Because the delay is superframe crossings rather than airtime, the levers that look obvious are not the ones that work. Narrowing the slot does nothing at all — it shortens the 495 ms of airtime inside a 2.0 s total that is otherwise idle waiting:
| Change | Hops | Far-end arrival | Cost |
|---|---|---|---|
| Baseline — 5 km, 50 m spacing, 24 relay slots | 99 | 2.0 s | — |
| Slot 5 ms to 3 ms | 99 | 2.0 s | no effect — the wait is superframes, not airtime |
| Superframe 500 ms to 250 ms | 99 | 1.0 s | halves the step; doubles sync cost |
| Spacing 50 m to 100 m | 49 | 1.0 s | requires the link budget to carry it |
| Gateway every 1 km | 19 | 0.10 s | fits one superframe — four more gateways to power |
| Raise the slot table to 100 entries | 99 | 0.50 s | changes the shared scheduler, not just L-MESH |
Segmenting is the only lever that crosses the threshold rather than nibbling at it. A segment of 24 hops or fewer — 1.2 km at 50 m spacing — completes inside one superframe, which turns 2.0 s into 0.10 s and divides the funnel by the number of segments at the same time. Everything else on that list trades something real for a factor of two.
These figures assume the schedule is being held — that sync is not being missed. A node that loses sync widens its guard, and the receive window is what the power figures are made of. A retransmission after a lost frame adds one round rather than one superframe, provided the retry slot sits inside the same sweep.
Settings a deployment tunes. Sync cadence and relay rate are independent on purpose — resync is cheap and frequent so that guards stay narrow, while payload is rare and rate-configurable.
| Setting | Default | Effect |
|---|---|---|
| Relay rate | 0.5 Hz | payload cadence |
| Sync cadence | 2 s | bounds drift, and so sets guard width |
| Reuse factor | 4 | raise where radio range exceeds three hops |
| Slot duration | 5 ms | floor set by sync accuracy |
| Hop index | assigned | position in the chain |
| Channel hop set | 16 | 1 disables hopping |
| Guard mode | adaptive | fixed for bring-up and diagnostics |
| Presence gating | on | off where devices are continuously present |
This release targets the nRF52 series, operating within the capabilities of the radio fitted to each product. Devices without a 32.768 kHz crystal run the internal RC oscillator, which is what makes rate compensation load-bearing rather than an optimisation.
| Interacts with | |
|---|---|
| Unified TDMA | the schedule L-MESH slots occupy |
| A-RTLS | presence gating for UWB TWR, UWB TDoA and L-DCB |
| Sensor TLV | the record format relayed |
| A-GNSS | assistance data distribution |
| MQTT | what the gateway publishes onward |
Every current and timing figure on this page is derived from device datasheet characteristics and the schedule arithmetic above — nRF52 receive at 4.6 mA, transmit at 4.8 mA at 0 dBm. They describe the design, and want confirming by measurement on a bench unit running the shipped schedule before they are used to size a deployment.