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:

  1. Install Meshtastic Python library;
  2. Download this script: https://github.com/pdxlocations/Meshtastic-Python-Examples/blob/main/print-packets-json.py
  3. In script, change connection type to appropriate, e.g. to Bluetooth;
  4. 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.

  1. 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
  • empireOfLove2@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    0
    ·
    edit-2
    8 hours ago

    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.