Marcel van den Bosch in front of a blue technology background

Tuning a LoRa MeshCore repeater: what I learned from chasing a cleaner signal

Author: Marcel van den Bosch Date:

A MeshCore repeater and antenna on a ballasted rooftop mast in Zevenaar

I set out to improve LoRa coverage around the centre of Zevenaar. The project started with a rooftop repeater and a good antenna; it turned into a lesson in radio interference, network topology, and the value of measuring before buying more equipment.

The setup

LoRa, short for “Long Range,” is a low-power radio technology for sending small amounts of data over relatively long distances. It is not designed for video or large files; it is useful for short messages, sensor readings, and location information.

MeshCore uses LoRa devices to form a community-run mesh. Nodes can communicate directly or pass messages onward through repeaters, without depending on a mobile network or central telecom provider. That makes the technology interesting for off-grid communication, although real-world coverage depends on radio conditions, network participation, and available power.

My repeater is a SenseCAP P1 Pro running MeshCore, connected to a McGill 868 MHz, 7.5 dBi omni antenna. I mounted it on a removable rooftop mast base with concrete ballast rather than drilling into the roof.

The rooftop MeshCore setup with its SenseCAP P1 Pro, McGill antenna, and ballasted mast

The SenseCAP P1 Pro repeater, Kerlink cavity filter, and McGill 7.5 dBi omni antenna.

The first results were mixed. Other nodes could hear my transmissions, but I was receiving fewer neighbours and fewer weak regional signals than I expected from the rooftop position and antenna.

A strong antenna cannot fix a noisy receiver

One of the first things I learned was that good hardware does not guarantee good reception. A cellular site operated by Odido is nearby and has line of sight to the rooftop. That raised the possibility that strong, out-of-band cellular signals were desensitizing the LoRa receiver: overloading it even though the cellular transmissions were outside the LoRa channel.

A nearby cellular site visible beyond the rooftop antenna

The nearby Odido LTE/5G cell site has line of sight to the antenna.

The repeater reported a noise floor around -92 to -97 dB. For comparison, I had seen readings around -115 dB or lower at some cleaner locations. Those observations suggested the local RF environment deserved investigation before changing the antenna or repeater.

Filtering made the difference

I added a Kerlink cavity filter for the EU868 band between the antenna and the repeater. A filter is not an amplifier: it slightly attenuates the wanted signal—less than 1 dB in this case—while suppressing signals outside the band.

The Kerlink EU868 cavity filter installed in the repeater's RF chain

The Kerlink EU868 cavity filter.

After adding it, the reported noise floor dropped to around -118 dB. That was the turning point. It strongly suggested that out-of-band RF energy, rather than a faulty antenna, SenseCAP device, or MeshCore configuration, was contributing to the weak reception.

The filter did not make the LoRa signal stronger. It helped the receiver hear the signal in a cleaner environment. That distinction changed how I thought about the whole installation.

A repeater is about topology, not just range

I also had to consider what role the node plays in the mesh. A node can provide excellent coverage for its immediate area without being a major transit point between distant regions. Another node may have fewer local neighbours but sit at a more useful position between two groups.

My measurements suggest this repeater is a strong coverage node for central Zevenaar, with useful regional uplinks, rather than a dominant backbone node. Some of the readings at the time of writing were:

Measurement Observed value
Noise floor Around -118 dB
Last SNR Around +12 dB
Transmit queue 0
Transmit airtime Roughly 2%
Receive error ratio Roughly 13%
Duplicate flood packets Roughly 70%

MeshCore repeater status and its current neighbours

Repeater status and neighbour overview.

A high duplicate-packet count can sound alarming, but it is not automatically a problem in a flood-based mesh: a well-placed node may hear the same message along several paths. It matters more whether duplicates coincide with high airtime, growing queues, or frequent receive errors. In these measurements, the queue stayed at zero and airtime remained low.

The neighbour list also changed over time. Strong local and regional links remained, while some more distant neighbours reappeared depending on timing, propagation, and network activity.

  • Zevenaar-GH was a strong local neighbour.
  • NL-DDM-OMN acted as a strong regional anchor.
  • ERDW, Stollenberg, Ellecom, and PI4TTA were useful, more variable links.
  • NL-VSR-PI-AIR reappeared toward Varsseveld and Aalten.
  • Seeed Solar #3 was a very weak but interesting long-distance signal.

A map overview of MeshCore neighbours and links across the Netherlands

Overview of MeshCore node neighbours.

LoRa can decode signals below the noise floor, depending on the spreading factor and coding rate. I use SF7/CR5, which is fast and efficient but less forgiving than higher spreading factors. A link at -2 dB SNR can be usable; a link at -8 or -10 dB is much closer to the edge. Neither value guarantees a reliable connection by itself.

A regional MeshCore message sent across the Netherlands

A region-scoped message observed by 276 nodes, courtesy of MC-Radar.

A message received in Zevenaar after travelling through ten MeshCore hops

A message received from Voorburg, South Holland, after ten hops.

Would a higher antenna help?

One suggestion was to raise the antenna by another metre. At 868 MHz, a metre is almost three wavelengths. More height can clear obstructions and roof edges or improve a marginal path, but the result depends on the specific site.

It would also mean a new base, more ballast, extra work at height, and greater wind loading. The estimated cost was about €250, before accounting for the practical challenges. I decided not to raise the mast without evidence that the change would help.

If I revisit it, I would first run a safe, temporary height comparison and look for a repeatable improvement of 2–4 dB on the weak links. Any rooftop work also needs to account for the building, weather exposure, and safe access.

What I learned

This project taught me more about measurement than about buying equipment:

  1. Check the noise floor. A better antenna can reveal how noisy a location is; it cannot remove interference.
  2. Filtering can matter more than amplification. The cavity filter cleaned up the receiver's environment rather than boosting the wanted signal.
  3. Height is helpful, not magic. Line of sight, obstructions, topology, and actual network activity all matter.
  4. Look at multiple metrics. SNR, noise floor, airtime, receive errors, queue length, duplicates, and neighbour recency each tell part of the story.
  5. Measure the node's actual role. Reliable local coverage can be as valuable as being a long-distance backbone repeater.

What began as an attempt to improve a LoRa signal became a practical lesson in RF diagnostics and resilient communication. The next experiment I am exploring is a proof of concept for MeshCore-based communication during a large power-grid outage: which locations would be useful, and could the network help field teams share status and location information? Those are questions to test, not claims that a community mesh can replace established emergency communications.

This post is adapted from my original LinkedIn article.