Skip to main content

A Python library for managing spx server.

Project description

spx-python — Quick‑Start Guide

Lightweight Python wrapper for the SPX server — model, simulate and test devices through the SPX REST API.
Designed for effortless use in local development, CI pipelines, and unit‑testing suites.


Table of Contents

  1. Requirements
  2. Installation
  3. Running an SPX server
  4. Connecting from Python
  5. Common operations (step‑by‑step)
  6. Full‑system example
  7. Using the client in unit tests
  8. LLM usage docs
  9. CI integration (GitHub Actions)
  10. FAQ
  11. License

Requirements

Requirement Notes
Python ≥ 3.7 Officially tested on 3.9 – 3.12
Docker & Docker Compose To launch spx‑server locally
SPX_PRODUCT_KEY Export in your shell or set as a CI secret

Installation

pip install spx-python                         # or add to poetry/requirements.txt

If you develop the package locally:

poetry add --dev spx-python pytest pytest-cov coverage

Running an SPX server

1. Create docker‑compose.yml (minimal):

services:
  spx-server:
    image: simplephysx/spx-server:latest
    ports: ["8000:8000"]
    environment:
      SPX_PRODUCT_KEY: ${SPX_PRODUCT_KEY}
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8000/ || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 5

2. Start it:

export SPX_PRODUCT_KEY="YOUR_REAL_KEY"
docker compose up -d         # server listens on :8000

Connecting from Python

import os, spx_python
from spx_python.client import SpxClient

client: SpxClient = spx_python.init(
    address     = "http://localhost:8000",   # default
    product_key = os.environ["SPX_PRODUCT_KEY"],
)

client now represents the root of the SPX system and behaves like a dictionary plus convenience helpers.


Common operations (step‑by‑step)

1 · Inspect an empty system

print(client.keys())      # ['models', 'instances', 'timer', 'polling']

2 · Add a model

client["models"]["TemperatureSensor"] = {
    "attributes": {"temperature": 25.0, "heating_power": 0.0}
}

3 · Create an instance

client["instances"]["sensor"] = "TemperatureSensor"
sensor = client["instances"]["sensor"]

4 · Read / write an attribute

temp_attr = sensor["attributes"]["temperature"]
print(temp_attr.internal_value)      # 25.0
temp_attr.internal_value = 30.0      # update

5 · Delete things

del client["instances"]["sensor"]
del client["models"]["TemperatureSensor"]

Full‑system example

The unit‑tests (tests/test_full_spx_python.py) show a PID loop built from three models (TemperatureSensor, PowerSupply, PIDController).
Load the YAML, create instances, wire connections, then run prepare() and run() to watch values propagate.


Using the client in unit tests

def test_attribute_roundtrip():
    key = os.environ["SPX_PRODUCT_KEY"]
    w   = spx_python.init(product_key=key)

    w["models"]["Foo"] = {"attributes": {"x": 1}}
    w["instances"]["foo1"] = "Foo"
    inst = w["instances"]["foo1"]

    inst["attributes"]["x"].internal_value = 42
    assert inst["attributes"]["x"].internal_value == 42

LLM usage docs

If you are using an LLM to integrate spx-python in another project, start here:


CI integration (GitHub Actions)

env:
  SPX_PRODUCT_KEY: ${{ secrets.SPX_PRODUCT_KEY }}

steps:
  - uses: actions/checkout@v3
  - uses: actions/setup-python@v4
    with: { python-version: "3.10" }

  - run: |
      python -m pip install poetry
      poetry install

  - run: docker compose up -d        # start server
  - run: |                           # wait until healthy
      for i in {1..10}; do
        curl -fs http://localhost:8000/ && break
        echo "waiting…"; sleep 5
      done
  - run: |                           # run unit tests + coverage
      poetry run python -m unittest discover -s tests
  - if: always()
    run: docker compose down

FAQ

Question Answer
Why not use str|None type‑hints? Optional[str] keeps compatibility with Python 3.7 – 3.8.

License

SPX‑Python is released under the MIT License – 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

spx_python-1.0.0rc3.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

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

spx_python-1.0.0rc3-py3-none-any.whl (22.6 kB view details)

Uploaded Python 3

File details

Details for the file spx_python-1.0.0rc3.tar.gz.

File metadata

  • Download URL: spx_python-1.0.0rc3.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for spx_python-1.0.0rc3.tar.gz
Algorithm Hash digest
SHA256 4d882b596ecee97eec1e2e1c89c083a155c7e5e4be42c097a620613bf9c2c0f9
MD5 adf7e90a885c49d240fa63545a4ca877
BLAKE2b-256 396589722eec507904ca064499c3f072d7f669a11f6faf13c6e2c7436f0e2504

See more details on using hashes here.

File details

Details for the file spx_python-1.0.0rc3-py3-none-any.whl.

File metadata

  • Download URL: spx_python-1.0.0rc3-py3-none-any.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for spx_python-1.0.0rc3-py3-none-any.whl
Algorithm Hash digest
SHA256 46e5e14e3f0f47d0498aa68d401dc3c78ed1051ef6ce7a14938fc18b47cca4a9
MD5 30ea41affe8f76c9017c136c070ee209
BLAKE2b-256 65a75978ab3111ca14458b00735e2fc9ca930028afe2546568783d129722103a

See more details on using hashes here.

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