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.2.1.tar.gz (43.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.2.1-py3-none-any.whl (51.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: scadable_sdk-0.2.1.tar.gz
  • Upload date:
  • Size: 43.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.2.1.tar.gz
Algorithm Hash digest
SHA256 1774059cd076de268b876d7889c80fc6e0d3a115087d932e4855d5efc34525ab
MD5 9d67d830cb8d07141092dfe7acf7a7c8
BLAKE2b-256 0687ccb2de12576fd45e6e094c25aac407df6ad8b29b2a762ff638bd8e244861

See more details on using hashes here.

Provenance

The following attestation bundles were made for scadable_sdk-0.2.1.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.2.1-py3-none-any.whl.

File metadata

  • Download URL: scadable_sdk-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 51.8 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 830e1cc688ef31181fb68a3c0735036a64185c88dd5f1776b234c0a205c09fb2
MD5 5938ca6c5153f2eb3b65cf581ec19979
BLAKE2b-256 4ce021e08a558f63572524e1d041335b42c01ea2aac1feaba4db27141e86a8fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for scadable_sdk-0.2.1-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