Skip to main content

Scadable Edge SDK — write device logic in Python, compile to native

Project description

Scadable SDK

PyPI Python CI Coverage Tests License

Write industrial device logic in Python. Compile to artifacts your gateway runs. Version it like code.

Scadable SDK is the authoring tool for the Scadable platform. You declare which registers to read from your Modbus PLC, what controllers should run on incoming data, and what to publish back to the cloud — all in plain Python. The compiler turns your project into deployable artifacts (YAML driver configs + manifest + bundle) that the gateway-linux runtime reads on boot.

pip install scadable-sdk

30-second hello world

scadable init linux boiler-room
cd boiler-room
scadable add device modbus-tcp inlet-temp
scadable verify
scadable compile
ls build/   # → manifest.json, drivers/inlet-temp.yaml, bundle.tar.gz

The compile output goes straight onto a gateway:

scp build/drivers/inlet-temp.yaml \
    pi@gateway.local:/etc/scadable/devices/inlet-temp/config.yaml
ssh pi@gateway.local sudo systemctl restart scadable-gateway

The gateway picks it up, spawns the Modbus driver subprocess, and starts publishing telemetry to your project.

What you can write

# devices/inlet_temp.py
from scadable import Device, Register, modbus_tcp, every, SECONDS

class InletTemp(Device):
    id = "inlet-temp"
    connection = modbus_tcp(host="${PLC_HOST}", port=502, slave=1)
    poll = every(5, SECONDS)
    registers = [
        Register(40001, "temperature",
                 dtype="float32", unit="°C", scale=0.1,
                 on_error="last_known"),
        Register(40003, "flow",
                 dtype="uint32", unit="L/min", endianness="little"),
    ]
# controllers/safety.py
from scadable import Controller, Topics, on, SECONDS
from devices.inlet_temp import InletTemp

class Topics(Topics):
    OVERHEAT_ALERT = "alerts/inlet-overheat"

class SafetyMonitor(Controller):

    @on.interval(2, SECONDS)
    def check(self):
        t = InletTemp.temperature
        self.publish("inlet-data", {"temperature": t},
                     quality="good" if t < 200 else "stale")

        if t > 95:
            self.alert("critical", f"Inlet temp {t}°C — shutting down")
            InletTemp.flow = 0   # writes back to register

That's it. The DSL is declarative, target-agnostic, and reads like English — your controls engineers can review it without learning Python idioms.

Why this exists

Industrial IoT projects today either:

  • Hand-write driver code per device, in a per-vendor SDK that doesn't port between deployments, or
  • Build flow-chart configurators in proprietary tools that lock you to one vendor and don't version-control cleanly.

Scadable's bet: device logic deserves the same treatment as application code — written in a real language, reviewed in pull requests, tested in CI, deployed via the same release pipeline as the rest of your software. The SDK is the authoring half of that bet; the gateway is the runtime half.

Status

v0.2.0 — current release.

Target Status Protocols
linux production modbus_tcp, modbus_rtu, ble, gpio, serial, i2c, rtsp
esp32 preview DSL accepted; emitter ships in v0.3
rtos preview DSL accepted; emitter ships in v0.4

Modbus (TCP + RTU) is the production protocol surface in v0.2.0; other protocols compile but their gateway-side drivers are not yet ready for production fleets.

Documentation

Contributing

See CONTRIBUTING.md. Quick path:

git clone https://github.com/scadable/scadable-sdk
cd scadable-sdk
python -m venv .venv && source .venv/bin/activate
pip install -e ".[test]"
pytest -q          # 172 tests, < 1 second
ruff check .
mypy --strict scadable

License

Apache-2.0. 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

scadable_sdk-0.4.0.tar.gz (80.1 kB view details)

Uploaded Source

Built Distribution

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

scadable_sdk-0.4.0-py3-none-any.whl (88.6 kB view details)

Uploaded Python 3

File details

Details for the file scadable_sdk-0.4.0.tar.gz.

File metadata

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

File hashes

Hashes for scadable_sdk-0.4.0.tar.gz
Algorithm Hash digest
SHA256 deef484c620419ab174483e6867c7515829a16a31392219a9f18d0cb7fda9d83
MD5 70c7724d0fdb72a1d34e631de5f89cd1
BLAKE2b-256 43cb0660c629c61da9738681349fb29ca5e49c07cd279056909fc96509a013ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for scadable_sdk-0.4.0.tar.gz:

Publisher: release.yml on scadable/scadable-sdk

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

File details

Details for the file scadable_sdk-0.4.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for scadable_sdk-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ac01d28f01d10c915a26e308c58b0cfc5ba7e0a2ef7ca37dfc8c124e89d4188
MD5 d55803d5342f401e727cea592b5f2f56
BLAKE2b-256 352915db4b4ca72316021768e553a6ff2c747866cfe19150b220e5c0ef1c658e

See more details on using hashes here.

Provenance

The following attestation bundles were made for scadable_sdk-0.4.0-py3-none-any.whl:

Publisher: release.yml on scadable/scadable-sdk

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