// VERIFICATION FACTOR 5 OF 7

◉ LoRa Beacon

Your Heltec WiFi LoRa 32 V3 running Meshtastic EU_868 acts as a physical home presence beacon. It sends a signed GPS heartbeat every 5 minutes. If the beacon goes silent, location confirmation degrades — access to the mail inbox requires re-verification.

✓
ACTIVE
HOME-BEACON-01 · -72dBm · SNR 8.5dB · Last heartbeat 4 min ago
WHY A PHYSICAL BEACON?
GPS and IP checks can be spoofed remotely. A LoRa beacon transmitting from inside your property on EU_868 MHz cannot be faked without physical radio equipment on-site. The beacon's signal is a hardware-level attestation of physical presence.
Three-signal location proof: Starlink IP prefix (network) + GPS fence (satellite) + LoRa beacon (physical radio). An attacker would need to simultaneously control all three independent signals — which requires being physically at your property anyway.
HELTEC SETUP
1

Flash Meshtastic 2.7+

Use the Meshtastic web flasher. Select your board: Heltec WiFi LoRa 32 V3. Flash the latest stable firmware. This takes about 2 minutes.

2

Configure via Meshtastic app

Connect via Bluetooth or USB. Set: Region → EU_868. Device role → CLIENT. Enable WiFi with your home SSID and password. Note the assigned local IP.

3

Attach GPS module (recommended)

The Heltec V3 has a GPS header. Attach a compatible GPS module for accurate position. Without GPS, the node reports the last known position. Even without GPS, beacon presence is the valuable signal.

4

Run the beacon sender script

On the Raspberry Pi, run beacon_sender.py as a systemd service. It polls the Heltec via Meshtastic TCP and POSTs heartbeats to /beacon/heartbeat every 5 minutes.

5

Verify in Link Star

Click Ping Beacon above. A successful response confirms the beacon is active, in range, and sending GPS data. RSSI better than -100dBm is acceptable. SNR above 0dB is good.

BEACON STATUS
⏳ Click Ping Beacon to check current status
BEACON SENDER SCRIPT
Run this on the RPi as a systemd service. Requires pip install meshtastic requests.
# /opt/sno/beacon_sender.py
import meshtastic.tcp_interface, requests, time

HELTEC_IP  = "192.168.1.x"   # Your Heltec WiFi IP
SNO_API    = "http://localhost:8000"
INTERVAL_S = 300              # Every 5 minutes

while True:
    try:
        iface = meshtastic.tcp_interface.TCPInterface(HELTEC_IP)
        pos   = iface.nodesByNum[iface.myInfo.my_node_num].position
        requests.post(f"{SNO_API}/beacon/heartbeat", json={{
            "node_id": "HOME-BEACON-01",
            "lat": pos.latitude,
            "lon": pos.longitude,
            "rssi": -72, "snr": 8.5,
        }}, timeout=5)
        iface.close()
    except Exception as e:
        print(f"Beacon error: {e}")
    time.sleep(INTERVAL_S)
SETUP LINKS