Skip to main content

Thin Python SDK for Plexus — send telemetry in one line

Project description

plexus-python

Thin Python SDK for Plexus. Send telemetry to the Plexus gateway in one line. Storage, dashboards, alerts, and fleet management live in the platform — this package just ships your data.

PyPI License

Quick Start

pip install plexus-python
from plexus import Plexus

px = Plexus(api_key="plx_xxx", source_id="device-001")
px.send("temperature", 72.5)

Get an API key at app.plexus.company → Devices → Add Device.

Device identity

Every device needs a unique source_id. The recommended way to set one on a real host is the bootstrap script, which requires a device name up front:

curl -sL https://app.plexus.company/setup | bash -s -- \
  --key plx_xxx --name drone-01

The name must match ^[a-z0-9][a-z0-9_-]{1,62}$. setup.sh refuses to run without --name (or without a TTY to prompt for one) — this is deliberate, because the previous hostname fallback silently merged telemetry from cloned SD-card images that all booted as raspberrypi.

If two devices end up requesting the same name, the gateway auto-suffixes: the first connection gets drone-01, the second gets drone-01_2, the third drone-01_3, and so on. The SDK logs the rename at INFO and persists the assigned name to ~/.plexus/config.json so the device keeps its identity across reboots. Under the hood, a per-installation UUID (install_id, lazily generated on first run) is what lets the gateway tell "same device reconnecting" from "different device claiming the same name."

In normal code, you usually just pass source_id=... explicitly to Plexus(...) and never have to think about it.

Usage

from plexus import Plexus

px = Plexus(source_id="rig-01")   # reads PLEXUS_API_KEY from env

# Numbers
px.send("engine.rpm", 3450)
px.send("coolant.temperature", 82.3, tags={"unit": "C"})

# Strings, bools, objects, arrays — all JSON-serializable
px.send("vehicle.state", "RUNNING")
px.send("motor.enabled", True)
px.send("position", {"x": 1.5, "y": 2.3, "z": 0.8})

# Batch
px.send_batch([
    ("temperature", 72.5),
    ("pressure", 1013.25),
])

# Named run for grouping related data
with px.run("thermal-cycle-001"):
    while running:
        px.send("temperature", read_temp())

Bring Your Own Protocol

This package ships no adapters, auto-detection, or daemons — just the client. Use whatever library you'd use anyway and pipe values into px.send().

# MAVLink (pymavlink)
for msg in conn:
    if msg.get_type() == "ATTITUDE":
        px.send("attitude.roll", msg.roll)

# CAN (python-can)
for msg in bus:
    px.send(f"can.0x{msg.arbitration_id:x}", int.from_bytes(msg.data, "big"))

# MQTT (paho-mqtt)
def on_message(_c, _u, msg):
    px.send(msg.topic.replace("/", "."), float(msg.payload))

# I2C sensor (Adafruit CircuitPython)
px.send("temperature", bme.temperature)

See examples/ for runnable versions of each.

Reliability

Every send buffers locally before hitting the network, retries with exponential backoff, and keeps your data safe across outages. Enable SQLite persistence to survive restarts and power loss:

px = Plexus(persistent_buffer=True)

Point counts and flush:

px.buffer_size()
px.flush_buffer()

Transport

By default the SDK connects over a WebSocket to /ws/device on the gateway — same wire protocol as the C SDK. This gives you:

  • lower-latency streaming of telemetry,
  • live command delivery from the UI / API to the device.

If the socket is unavailable, sends transparently fall back to POST /ingest so no data is lost.

# default — ws with http fallback
px = Plexus()

# force http (legacy)
px = Plexus(transport="http")

Handling commands

Register a handler before the first send() so the command is advertised in the auth frame:

def reboot(name, params):
    delay = params.get("delay_s", 0)
    # ... reboot logic ...
    return {"ok": True, "delay": delay}

px = Plexus()
px.on_command("reboot", reboot, description="reboot the device")
px.send("temperature", 72.5)   # opens the socket, waits for auth

The SDK sends an ack frame before invoking the handler, then a result frame with whatever the handler returns (or an error frame if it raises).

Environment Variables

Variable Description Default
PLEXUS_API_KEY API key (required) none
PLEXUS_GATEWAY_URL HTTP ingest URL https://plexus-gateway.fly.dev
PLEXUS_GATEWAY_WS_URL WebSocket URL wss://plexus-gateway.fly.dev

Architecture

Your code ── px.send() ── HTTP POST /ingest ──> plexus-gateway ──> ClickHouse + Dashboard

One thin path. No agent, no daemon, no adapters. If you want the full HardwareOps platform — dashboards, alerts, RCA, fleet views — that's the web UI at app.plexus.company. This package gets your data there.

License

Apache 2.0

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

plexus_python-0.4.3.tar.gz (47.5 kB view details)

Uploaded Source

Built Distribution

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

plexus_python-0.4.3-py3-none-any.whl (27.6 kB view details)

Uploaded Python 3

File details

Details for the file plexus_python-0.4.3.tar.gz.

File metadata

  • Download URL: plexus_python-0.4.3.tar.gz
  • Upload date:
  • Size: 47.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plexus_python-0.4.3.tar.gz
Algorithm Hash digest
SHA256 4c1e6e333f7189a1af845c17c2f2e872f2384cc4119835b7382e062318c7abaa
MD5 5b7f11143db4a643a42ac37fefa4c132
BLAKE2b-256 b3b616d335e278cafc566acbbf49a8c3b572bd4e6388ade3fa9944f014155be2

See more details on using hashes here.

Provenance

The following attestation bundles were made for plexus_python-0.4.3.tar.gz:

Publisher: publish.yml on plexus-oss/plexus-python

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

File details

Details for the file plexus_python-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: plexus_python-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 27.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plexus_python-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 08f3e7e82f63e8e93d78cba060dcf4d2cb4b04267eb55016aa78e304f2c7008a
MD5 be74052b70204ddaef1ed8c7bcc85b4c
BLAKE2b-256 324feed4524b66b8c2638b99c11cf9ec960c8ea86e232358f58f6f64ad7a8cba

See more details on using hashes here.

Provenance

The following attestation bundles were made for plexus_python-0.4.3-py3-none-any.whl:

Publisher: publish.yml on plexus-oss/plexus-python

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