🗼 Kelly APRS iGate

Put MeshCore GPS trackers, and their telemetry, on aprs.fi. Every Kelly Page station can be an iGate.

Licensed operators only. APRS-IS is an amateur network. A tracker is gated only under its owner's own callsign, which must be a licensed amateur callsign. Never gate anyone else's tracker under your call, and never add an unlicensed person's tracker to your list.

What it does

A MeshCore node with GPS puts its position in its adverts, the short "here I am" packets it sends. When your Kelly's MeshCore node hears an advert from a node on your list, Kelly turns it into an APRS position and sends it to APRS-IS, and the node appears on aprs.fi under its owner's callsign. For devices you set it up for, Kelly also reads the node's telemetry (battery, solar, temperature, noise floor and so on) and sends it as APRS telemetry, which aprs.fi draws as graphs.

Set up an iGate

  1. Start the Kelly bridge on a PC or Pi with internet. That's the iGate's way to APRS-IS.
  2. Connect your MeshCore node on the LoRa Mesh page (USB, Bluetooth or the bridge), and leave it connected. Kelly only hears what the node hears.
  3. Open APRS iGate, in the sidebar under Data services.
  4. Check the Callsign (Kelly fills it in from your station setup) and pick an SSID. -10 is the usual one for an iGate. The badge shows the full call, e.g. VK4AZ-10.
  5. Put some nodes on 🗼 My list (see Your list).
  6. Try Dry run first. Turn on Gate the MeshCore nodes on my list to APRS-IS and watch the Log: it shows exactly what would be sent. When it looks right, turn Dry run off.

The status badge reads gating when everything is ready. Otherwise it names what's missing: a callsign, an empty list, or no Kelly bridge.

Running it all the time. Kelly gates only while it's running and the node is connected. On a Raspberry Pi with the Kelly keeper, it keeps gating with every PC switched off. See install-pi.html.

Options

APRS-IS passcode

You don't enter one. The Kelly bridge works it out from your callsign, and it never leaves the bridge. If you need a different passcode, set KELLY_IGATE_PASS in the bridge's environment.

MeshPRS frames

MeshPRS is a new standard for APRS over MeshCore: stations send positions, messages, telemetry, objects and status as small frames on the #meshprs channel. Turn on Gate MeshPRS frames in the 📡 MeshPRS frames card, and press Add #meshprs to my node if the card says your node doesn't have the channel yet.

A frame reaches aprs.fi only when its callsign is on your list (or the club list) with the same node key, and that node's advert was heard in the last 24 hours. The card counts what was heard, queued, sent and dropped, and why.

Kelly can send MeshPRS frames too. Turn on Send my beacon as a MeshPRS position frame too, pick the SSID, symbol and a short comment, and each time Beacon my position sends your advert, Kelly also sends a position frame on #meshprs, flood or zero-hop to match. Your node needs the #meshprs channel, and other iGates need your node's key on their list (or the club list) to gate it.

Your list

🗼 My list is the only thing that lets a node through. It fills three ways, and the From column shows which:

Use Edit, Disable and ✕ in the table. A disabled node stays on the list but isn't gated. A removed or dismissed node isn't offered or added again until you press Forget dismissed nodes.

Telemetry on aprs.fi

APRS telemetry gives each station 5 values (graphed on aprs.fi) and 8 on/off bits. Each device is set up separately, because what a node reports depends on its hardware and firmware. Press Telemetry on a row of your list:

  1. Pick a Device type to start from: MeshCore repeater (battery, noise floor, transmit airtime, RSSI, SNR), SenseCAP Solar Node, GPS tracker (battery), Weather / environment sensor (battery, temperature, humidity, pressure), or Custom.
  2. Press Read the node now. Kelly asks the node for its telemetry and, for a repeater, its status, and lists every reading under What the node reports, e.g. ch 1 voltage 4.05 V or st:noise -110 dBm.
  3. Adjust the 5 values for this device. Each one has a Source (one of those readings), a Name and Unit as aprs.fi will show them, and a Min and Max. A value goes out as 0-255 across min-max, so choose a range that just covers what you expect, e.g. a single-cell battery 3.0-4.5 V. The Now column shows what would be sent. Under and 8 on/off bits you can add rules such as LowBat when the battery is below 3.5 V.
  4. Turn on Send telemetry to aprs.fi, pick how often (every 10 minutes or more), and press Save for this device. The preview shows the exact lines.
  5. Got several of the same device? Press Save as a device type… and pick that type for the others.

Get your tracker on aprs.fi

  1. Name it with your callsign, e.g. VK4AZ Car or VK4AZ-9. Every Kelly iGate that hears it then offers to add it. The 📍 Beacon my position card tells you whether your own node's name carries your callsign.
  2. Or give the key (the card's Copy key) and the callsign, SSID and symbol you want to a Kelly owner near you, or to the club list admin so every Kelly gets it.
  3. Each gated station in the iGate's table has an aprs.fi ↗ link.

Buying and configuring a MeshCore GPS tracker

Any MeshCore companion node with a GPS will do. These all run MeshCore. Check the board is listed on the MeshCore web flasher before you buy, because supported boards change:

DeviceGood forNotes
Seeed SenseCAP T1000-EPocket, keyring, petCredit-card size, GPS and battery built in, weatherproof. The easiest choice.
RAK WisBlock (RAK4631 core + RAK12500 GNSS module)Car, bike, fixedModular and very low power. Needs a case, a battery and an antenna.
LilyGO T-EchoHandhelde-paper screen, GPS, nRF52 (long battery life).
Heltec Wireless Tracker / LilyGO T-BeamCar (USB powered)ESP32 with GPS. Uses more power, fine on a car's USB.

Beacon your own position

No tracker? Your Kelly can send your position out through your own MeshCore node, so another Kelly iGate puts it on aprs.fi. Name your node with your callsign so those iGates offer to add it.

Kelly gives the node the position, and the node keeps advertising it until it's changed.

Club list admin

The club list is an optional list of known users that every Kelly adds to its owner's own list. It has a version number that only goes up and is signed by an admin key. Every Kelly checks the signature before using a list, and refuses one that doesn't check out or is older than the one it has. It travels over P25 (the iGate's only use of P25): Kelly checks once a day, and parked radios are told when there's a new one. It can also be imported from a file or fetched from an address. The P25X gateway stores and hands out the list, but it has no key and can't change it.

One-time: make and pin the admin key

  1. In APRS iGate › Club list › Admin, press Generate an admin key. The key stays in this browser only. Press Show my seed and keep that 64-character seed somewhere safe and private (a password manager). Anyone with the seed can sign club lists.
  2. The panel shows the public key, marked not pinned. Paste it into ADMIN_KEYS in kelly-page/js/igate-wl.js, copy that file to tools/p25x-fault-finding-page/igate-wl.js, deploy the gateway, and release Kelly. From then on every station accepts lists signed by that key.
  3. To use the same key in another browser, press Import my seed there.

Adding, changing and removing stations

  1. Pick the node from MeshCore contact (if your node has heard it) or paste its 64-character key. Fill in callsign, SSID, symbol and comment, and press Add / update. Use Edit, Disable and ✕ in the table for existing ones.
  2. Press Sign + publish vN over P25 with your radio connected. The gateway checks the signature and the version, then pushes the list to parked Kelly radios, and the rest pick it up on their daily check. Or use Sign + save a file and upload the file on the dashboard (POST /api/igate/whitelist), or give it to members to import.

A station you remove from the club list leaves each Kelly's list, unless that owner has edited it. Owners always have the last word on their own list.

Lost the seed? Make a new key, pin it in place of the old one and release. Lists signed with the old key are then refused, so publish a fresh list with the new key straight away.

Counters and problems

The counters at the top survive a restart. Reset counters clears them.

CounterMeansWhat to do
Heard (MeshCore)Positions your node heardNone? Check the node is connected and the trackers' GPS and location-in-adverts are on.
TelemetryTelemetry lines sent (reports and labels)None? Check the device's telemetry is on, it has a direct route, and the log for "not allowed" or "log in".
Not on my listA position from a key that isn't on your listNormal: other people's nodes. Add the ones you want.
Invalid position0,0, out of range, no fix, heard over 10 minutes ago, an older advert replayed, or a bad signatureThe log says which. A tracker indoors often has no fix.
DuplicateThe same station and position again within 30 sNormal.
Rate-limitedToo soon for that station, or over the overall limitNormal in a busy area.
Couldn't sendNo Kelly bridge, or APRS-IS not verifiedCheck the APRS-IS box: Not verified = the bridge's passcode doesn't match the callsign; No bridge = start kelly_bridge.py.