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. CI integration (GitHub Actions)
  9. FAQ
  10. 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

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-0.1.0rc4.tar.gz (7.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-0.1.0rc4-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file spx_python-0.1.0rc4.tar.gz.

File metadata

  • Download URL: spx_python-0.1.0rc4.tar.gz
  • Upload date:
  • Size: 7.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for spx_python-0.1.0rc4.tar.gz
Algorithm Hash digest
SHA256 9dfa509a8a740e7e6eb548d0d3adbd9fed7514693cf73314083c122a4af1e299
MD5 850e8f6e9e9b9842feb578203dfc7c25
BLAKE2b-256 07aeedc07321b0b0cf198e082d088c2cc904deed60ac4117254f416d2701fcee

See more details on using hashes here.

File details

Details for the file spx_python-0.1.0rc4-py3-none-any.whl.

File metadata

  • Download URL: spx_python-0.1.0rc4-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for spx_python-0.1.0rc4-py3-none-any.whl
Algorithm Hash digest
SHA256 2f6d0288396d04e38ce8d13abf6942e648544905ceea5d47968230957fb80d4b
MD5 52f39e54ba42077b3738c68474260dbc
BLAKE2b-256 fc843ad6ae53041eb934c0376f403a41fab272b3e5cda8ef7cc26a5eb7b47fc1

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