Skip to main content

Bot for Meshtastic Networks to monitor high traffic users and kindly ask them to check settings.

Project description

MeshPatrol

MeshPatrol is a Meshtastic packet-monitoring bot that:

  • subscribes to incoming packets from a Meshtastic node (serial or TCP)
  • stores packet payloads using meshdb
  • tracks per-node and per-packet-type hourly counts in SQLite
  • sends a direct message (DM) to nodes that exceed configured thresholds
  • serves a dashboard over HTTP (window follows configured threshold unit)

Requirements

  • Python >=3.9,<3.15
  • A Meshtastic-compatible radio reachable by USB serial or Meshtastic TCP
  • Runtime dependencies:
    • meshtastic
    • meshdb
    • PyPubSub
    • Flask

Installation

Install from PyPI (recommended)

pip install meshpatrol

Install from source

git clone https://github.com/pdxlocations/meshpatrol.git
cd meshpatrol
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e .

Running MeshPatrol

After installation, run:

meshpatrol

You can also run directly as a module:

python -m meshpatrol

Connection selection (CLI)

Use one of these optional flags to pick the interface at runtime:

# Serial device path
python -m meshpatrol --serial /dev/ttyUSB0

# TCP host:port
python -m meshpatrol --tcp 192.168.1.50:4403

# IPv6 TCP target
python -m meshpatrol --tcp [fe80::1]:4403

On startup, MeshPatrol:

  • connects to your Meshtastic interface (SerialInterface or TCPInterface)
  • subscribes to meshtastic.receive
  • starts a web dashboard on 0.0.0.0:5050 (by default), accessible from your LAN via http://<host-ip>:5050

Stop with Ctrl+C.

Configuration

Runtime settings live in APP_SETTINGS in meshpatrol/__main__.py. Threshold values are loaded from config/thresholds.json.

APP_SETTINGS = {
    "interface": "serial",
    "port": None,
    "tcp_hostname": "127.0.0.1",
    "tcp_port": 4403,
    "meshdb_path": "./meshpatrol-data/databases/mesh_packets.db",
    "counter_db_path": "./meshpatrol-data/databases/packet_counters.db",
    "thresholds_path": "./meshpatrol-data/thresholds.json",
    "threshold_unit": "hour",
    "default_threshold": 120,
    "threshold_overrides": [],
    "alert_template": "...",
    "log_level": "INFO",
    "web_ui": True,
    "web_host": "0.0.0.0",
    "web_port": 5050,
}

Key settings

  • interface: "serial" or "tcp" (used when no CLI override is provided).
  • port: serial device path. Use None for Meshtastic auto-detect.
  • tcp_hostname / tcp_port: TCP destination when interface="tcp".
  • thresholds_path: JSON file for threshold configuration.
  • threshold_unit: legacy fallback default unit if missing from thresholds JSON ("hour" or "24h").
  • default_threshold / threshold_overrides: legacy fallback only, used if thresholds_path file is missing.
  • alert_template: DM text. Supports {node_id}, {packet_type}, {count}, {threshold}, {hour_bucket}, {window_label}, {threshold_unit}.
  • web_ui: enable/disable dashboard.
  • meshdb_path: SQLite file used by meshdb packet storage.
  • counter_db_path: SQLite file used for rate counters and alert history.

Threshold file format

config/thresholds.json:

{
  "threshold_unit": "hour",
  "default_threshold": 120,
  "overrides": {
    "POSITION_APP": 300,
    "TELEMETRY_APP": {
      "threshold": 180,
      "unit": "24h"
    }
  }
}
  • threshold_unit: default unit ("hour" or "24h") for entries that do not specify a unit.
  • default_threshold: fallback threshold value in the default unit for packet types without an override.
  • overrides: per-port thresholds keyed by Meshtastic port name. Each value can be:
    • integer: threshold using default threshold_unit
    • object: { "threshold": <int>, "unit": "hour" | "24h" } for per-port unit override

Dashboard and API

When web_ui is enabled, MeshPatrol serves:

  • GET / - HTML dashboard
  • GET /api/snapshot - JSON snapshot for the active threshold windows (hour, 24h, or mixed)

Dashboard includes:

  • top nodes by packet count (active window)
  • totals by packet type (active window)
  • configured thresholds
  • node+type breakdown with ETA to threshold (per-port threshold unit)
  • recent alerts (active window)

Data files

By default, MeshPatrol creates/updates files in the working-directory ./meshpatrol-data/ folder:

  • ./meshpatrol-data/databases/mesh_packets.<owner_node_num>.db (created by meshdb)
  • ./meshpatrol-data/databases/packet_counters.db
  • ./meshpatrol-data/thresholds.json

If WAL mode is active, you may also see -wal and -shm sidecar files.

Logging

Logging is controlled by APP_SETTINGS["log_level"] and defaults to INFO.

Development

Install editable with dependencies:

pip install -e .

Run directly:

python -m meshpatrol

Release process

This repository includes a GitHub Actions workflow at .github/workflows/release.yaml that:

  1. triggers on semantic version tags (for example: 1.2.3, 1.2.3rc1)
  2. checks the new tag version is greater than the latest on PyPI
  3. builds with Poetry
  4. publishes artifacts to PyPI
  5. creates a GitHub Release with generated notes

License

GPL-3.0-only. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meshpatrol-0.0.13.tar.gz (32.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

meshpatrol-0.0.13-py3-none-any.whl (32.1 kB view details)

Uploaded Python 3

File details

Details for the file meshpatrol-0.0.13.tar.gz.

File metadata

  • Download URL: meshpatrol-0.0.13.tar.gz
  • Upload date:
  • Size: 32.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for meshpatrol-0.0.13.tar.gz
Algorithm Hash digest
SHA256 703f2f3b915c6cd57aa788bd9bf5a68fa5d5cef0b963fbafd665a83337542a27
MD5 e692e2ca52c9b25e202d1545b6de4bf6
BLAKE2b-256 e1eb734727a5bb13dcb7a35704c6eb85013cf106bbd4166b4ee17eac9f76ef49

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshpatrol-0.0.13.tar.gz:

Publisher: release.yaml on pdxlocations/meshpatrol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshpatrol-0.0.13-py3-none-any.whl.

File metadata

  • Download URL: meshpatrol-0.0.13-py3-none-any.whl
  • Upload date:
  • Size: 32.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for meshpatrol-0.0.13-py3-none-any.whl
Algorithm Hash digest
SHA256 7e4b074d5b79feab2f11c6abf2db0622b88829dc680c9e17550552ad85bea1d0
MD5 dd3b0a9f0c7dc819916c6bbcc83b8c1d
BLAKE2b-256 a90baca8159bd14e2a5bfda3a54d95755150ab7b73a5344299e1f1c6566b622b

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshpatrol-0.0.13-py3-none-any.whl:

Publisher: release.yaml on pdxlocations/meshpatrol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page