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.1a1.tar.gz (20.7 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.1a1-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file spx_python-1.0.1a1.tar.gz.

File metadata

  • Download URL: spx_python-1.0.1a1.tar.gz
  • Upload date:
  • Size: 20.7 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.1a1.tar.gz
Algorithm Hash digest
SHA256 58f15491a09da9de5c14ab00513057a1aeb91d09b58e4c29928c61183414bdb9
MD5 5cc981a7aba5a8d4ff75ce4bd3547ff2
BLAKE2b-256 7b58379d910a0ba8776d2ecbd722a73a2346e8d95b6b9b7efd55db753c0c17c4

See more details on using hashes here.

File details

Details for the file spx_python-1.0.1a1-py3-none-any.whl.

File metadata

  • Download URL: spx_python-1.0.1a1-py3-none-any.whl
  • Upload date:
  • Size: 22.9 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.1a1-py3-none-any.whl
Algorithm Hash digest
SHA256 b4fc73638a8b5eb76b788319e12d1618b1be3dd8db764bce7ff7d1f6e3b720d3
MD5 648264e35a4022478dd7d000539bfef0
BLAKE2b-256 2eff7090cbe32e95d1151155b9c492de17ae69d00ea9479eefe4dcede28ebd6e

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