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.3.1.tar.gz (71.4 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.3.1-py3-none-any.whl (79.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: scadable_sdk-0.3.1.tar.gz
  • Upload date:
  • Size: 71.4 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.3.1.tar.gz
Algorithm Hash digest
SHA256 f73134b6caffdead8510f838afacb05a898a75342683e622f68f625c458eb86c
MD5 a12544bcbe56c451163d7791227cff08
BLAKE2b-256 9614e483cd09ac78a455447ceb0c7480e02bee1244a493c060929adfa04661cf

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: scadable_sdk-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 79.5 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.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bbbbf463924df5f59be2286fdcfca4a5bee0c973779e173607105911a530f4e2
MD5 0fead56b2216633a90bcf5d93aea722a
BLAKE2b-256 e69da91a007e4608462752fccea8865d7d2f0bd44a33cd0f3fb1eb00d36cc5f3

See more details on using hashes here.

Provenance

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