How it works, what data drives the score, and how it ties to your Meshtastic network
Radio signals normally travel in straight lines and gradually spread out into space. Under certain atmospheric conditions, the lower atmosphere can act almost like a pipe or waveguide, trapping radio energy and bending it back toward the earth's surface. Instead of escaping into space, the signal follows the curvature of the earth far beyond where it would normally reach, sometimes hundreds of miles.
For Meshtastic (operating in the 900Mhz ISM band), this means nodes that would ordinarily be completely out of range can suddenly appear in your network as if they were nearby.
Ducting happens when the atmosphere is layered in a specific way: warm, dry air sitting on top of cooler, moist air close to the ground. This creates a temperature inversion. Normally temperature drops as you go up, but during an inversion it rises. At the same time, humidity drops sharply with altitude.
Together, these conditions make radio waves refract (bend) downward instead of going straight. The stronger and sharper that temperature/humidity transition, the more pronounced the ducting effect.
Open-Meteo is a free weather forecast API. For each location queried, it returns a hourly atmospheric profile which includes measurements at multiple altitudes simultaneously, not just at the surface.
| Variable | What it represents |
|---|---|
temperature_2m |
Air temperature at 2 metres (ground level) |
dewpoint_2m |
Dewpoint at surface, a direct measure of moisture |
temperature_Xhpa |
Air temperature at pressure level X (seven levels sampled) |
relative_humidity_Xhpa |
Relative humidity at pressure level X |
The pressure levels sampled are 1000, 975, 950, 925, 900, 875, and 850 hPa, corresponding roughly to altitudes from ~130m up to ~1500m above the surface. These cover the lowest portion of the troposphere where ducting actually occurs. Going higher than ~1500m isn't relevant because ducting is a near-surface phenomenon.
The forecast model used is NOAA's HRRR (High-Resolution Rapid Refresh). It updates hourly and covers the continental US at ~3 km resolution. Data is typically under an hour old. HRRR publishes every hour with a ~45-minute processing lag, compared to 6+ hours for the global GFS model, making it far more useful for detecting fast-changing atmospheric conditions.
Raw weather data is converted into a physics-based score using ITU-R P.453-14; an international telecommunications standard specifically designed to model how radio waves refract through the atmosphere.
The core concept is Modified Refractivity, denoted M. M is a single number that captures how much a given parcel of air bends radio waves, accounting for temperature, moisture (water vapor pressure), atmospheric pressure, and altitude all at once. Higher M generally means less bending; lower M means more.
The practical ceiling of this algorithm is approximately 5.25/10 under normal atmospheric conditions. The altitude weighting is intentionally conservative; layers below 500 m are capped to suppress false positives from common nocturnal inversions that are too shallow to trap 900 MHz signals. The Strong and Excellent bands represent the algorithm's theoretical envelope and will only be approached during exceptional events.
The local score only describes the atmosphere directly above your location. Ducting is a path phenomenon, it depends on conditions along the entire route between you and a distant station. So ducting scores are also computed at points 50 and 100 miles out in each of the 8 compass directions.
That's 16 sample points total, fetched in a single batch API request to avoid rate limiting. The highest score found across all points becomes the regional max score. Any compass direction where at least one sample meets or exceeds the correlation threshold is tracked as an elevated direction, a heading from which distant nodes are likely to appear.
When a node appears in the mesh that hasn't been seen in the past 24 hours, the script checks four criteria before attributing its arrival to ducting:
If all four criteria are met, the node is flagged as ducting-correlated. Meaning its arrival in the mesh is consistent with the atmospheric conditions the model predicted. These nodes appear on the Grafana geomap and are counted in the alert message.
The system is essentially doing what a trained RF engineer would do manually; looking at a vertical slice of the atmosphere, checking whether the temperature and humidity profile creates the conditions that trap radio waves near the ground, and quantifying how strong that effect is.
Open-Meteo provides the raw atmospheric measurements. The ITU-R standard provides the physics to convert those measurements into a prediction of radio behavior. And the node correlation closes the loop by checking whether what the network is actually observing matches what the atmosphere predicts.