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.0.tar.gz (71.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.3.0-py3-none-any.whl (79.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: scadable_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 71.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.3.0.tar.gz
Algorithm Hash digest
SHA256 540aebb04192eda086519479367bfff0489e8b110917106bb03611f75856aee7
MD5 0592a3ee4704e54c1e6a5d6510c3c30a
BLAKE2b-256 21660be06f1fcd1ce58a191d485694f9665d887197410a866e364c596cfc20a6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: scadable_sdk-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 79.2 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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 82fbd2a6e4951b28502c4a979f7db53b371ba5c8acf99981620ae884a2bd8131
MD5 da65956f7bbcbc16c64401bded4962ed
BLAKE2b-256 cdf3fe8ab0aef65c81f0c65b073bd5bae2dbdf4bc42ca214bef39dca62145b73

See more details on using hashes here.

Provenance

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