Each packet received by a node has two numeric values - SNR and RSSI. Big values mean good connection, small values mean bad connection.
You can collect all packets for some period of time and check SNR and RSSI they had. Presumably, they will represent quality of connection between your node and mesh network.
Can you look at the table below and tell if connection between my node and network is good or bad? Do you think this is a good method to measure quality of connection?
received fromId rxSnr rxRssi portNum
-------- ------ ----- ------ -------
2026-04-03 13:48 46e8 -4.5 -117 POSITION_APP
2026-04-03 13:49 dca4 -8.5 -121 NODEINFO_APP
2026-04-03 13:49 dca4 -17 -128
2026-04-03 13:49 dca4 -0.5 -112 POSITION_APP
2026-04-03 13:50 c8dc -15 -120 NODEINFO_APP
2026-04-03 13:55 5564 -111 POSITION_APP
2026-04-03 13:57 d77e -0.5 -111 NODEINFO_APP
2026-04-03 13:57 0fe0 -14.5 -120 TEXT_MESSAGE_APP
2026-04-03 13:57 0fe0 1 -110 TEXT_MESSAGE_APP
2026-04-03 14:02 d390 -18.25 -128 TELEMETRY_APP
2026-04-03 14:02 c8dc -9 -121 TELEMETRY_APP
2026-04-03 14:04 dca4 -0.5 -112 POSITION_APP
2026-04-03 14:06 5564 -2.75 -111 POSITION_APP
2026-04-03 14:10 30bc 1.25 -110 TELEMETRY_APP
2026-04-03 14:10 dd18 -1 -110 POSITION_APP
2026-04-03 14:10 30bc -9 -121
2026-04-03 14:11 a54c -10.5 -121 POSITION_APP
2026-04-03 14:11 a54c -10.25 -122
2026-04-03 14:23 c8dc -10 -122 TELEMETRY_APP
2026-04-03 14:25 46e8 -15.25 -122 NODEINFO_APP
2026-04-03 14:26 5564 -7.25 -119 TELEMETRY_APP
2026-04-03 14:26 1f3c 0.75 -110 NODEINFO_APP
2026-04-03 14:27 dd18 1 -110 NODEINFO_APP
2026-04-03 14:29 e278 1.75 -109 POSITION_APP
2026-04-03 14:33 0fe0 -12 -124 POSITION_APP
2026-04-03 14:33 0fe0 -20.5 -127
2026-04-03 14:33 0fe0 -8.75 -121 TELEMETRY_APP
2026-04-03 14:34 dca4 -10.75 -122 POSITION_APP
2026-04-03 14:35 c994 -11.75 -123 NODEINFO_APP
2026-04-03 14:38 5564 -110 POSITION_APP
In 3 hours I’ve got 99 packets with average SNR ~= -6 and average RSSI ~= -117. Is it good or bad?
How to get this data
In case if anyone is curious on how to get this data, here’s how I did it with Python and Powershell:
- Install Meshtastic Python library;
- Download this script: https://github.com/pdxlocations/Meshtastic-Python-Examples/blob/main/print-packets-json.py
- In script, change connection type to appropriate, e.g. to Bluetooth;
- Run script:
python3 ./print-packets-json-and-send.py | Add-Content ./packets-all.json;
This script will connect to your node and will start appending all packets in json format to packets-all.json file. Example of a packet (with some parts replaced with blabla):
{
"from": 2896903512,
"to": 4294967295,
"decoded": {
"portnum": "NODEINFO_APP",
"payload": "blabla",
"bitfield": 1,
"user": {
"id": "!acab3d58",
"longName": "blabla_basic",
"shortName": "WuGb",
"macaddr": "2IWsqz1Y",
"hwModel": "HELTEC_V3",
"role": "CLIENT_BASE",
"publicKey": "Vkblabla",
"isUnmessagable": true,
"raw": "blabla"
}
},
"id": 1719174,
"rxTime": 1775212872,
"rxSnr": -5.5,
"hopLimit": 3,
"rxRssi": -118,
"viaMqtt": true,
"hopStart": 6,
"relayNode": 60,
"transportMechanism": "TRANSPORT_LORA",
"raw": "blabla",
"fromId": "!acab3d58",
"toId": "^all"
}
Now you can query this file from another terminal tab, there’s no need to interrupt running Python script.
- This is powershell command I’ve used to create table above:
$headers = 'received,exported,fromId,rxSnr,rxRssi,portNum,text' -split ','
gc -Raw ./packets-all.json | sls -allm '(?smi)\n(\{.*?\n\})' | % Matches | % {$_.Groups[1].Value} | ConvertFrom-Json -de 99 | ? fromId -ne '!myOwnId' | % {
$received = [DateTimeOffset]::FromUnixTimeSeconds([int]$_.rxtime).ToLocalTime().LocalDateTime.ToString('yyyy-MM-dd HH:mm');
$exported = $_.exportedtime ? [DateTimeOffset]::FromUnixTimeSeconds([int]$_.exportedtime).ToLocalTime().LocalDateTime.ToString('yyyy-MM-dd HH:mm:ss') : $null;
$from = $_.fromId ? $_.fromId.substring(5,4) : '????'
$received,$exported,$from,$_.rxSnr,$_.rxRssi,$_.decoded.portNum,$_.decoded.text -join "`t"
} | ConvertFrom-Csv -delim "`t" -hea $headers | select -Last 30 -excl exported,text | Format-Table
Numerically snr and rssi are the ONLY ways to measure connection quality.
One can have a high rssi but a low snr depending on noise floor. So realistically snr is the only number that matters.Your SNR values are a little low on average and kind of random without much change in rssi- either this mesh has a lot of mobilenodes or you have some intermittent noise sources nearby. That said, LoRa works most reliably with any SNR above -10 and intermittently above maybe -16 depending on your local mesh’s radio settings.


