Skip to main content

Blocking Python facade for driving Extron SIS devices over SSH

Project description

sismatic

A blocking Python facade for driving Extron devices over SSH using their Simple Instruction Set (SIS). The name is SIS + automatic: it handles the SIS machinery — connection pooling, the SSH handshake, byte-level framing — behind the scenes so you address a pool of devices by id and send plain instructions.

The package is a thin Python layer over a compiled Rust extension (sismatic-core), shipped as an abi3 wheel that covers CPython 3.9+ with a single build.

Install

pip install sismatic

Quickstart

from sismatic import Sis

# No connections are opened here; devices connect lazily on first use.
sis = Sis.from_file("devices.toml")

for device_id in sorted(sis.ids()):
    print(device_id)

sis.query("atrium-101", "firmware")          # read a built-in field
sis.register("atrium-101", "title", "Wk 4")  # write a metadata register
sis.command("atrium-101", "start")           # run a recorder command

Use it as a context manager to tear the session down deterministically:

with Sis.from_file("devices.toml") as sis:
    sis.command("atrium-101", "start")
# every SSH connection is closed on exit

Configuration

from_file picks the deserializer from the extension (.toml, .json, .yaml/.yml). A config is a defaults table plus a list of devices:

[defaults]
port = 22023
connect_secs = 5
command_secs = 3
eager = true              # open connections up front instead of on first use
sis_keepalive_secs = 120  # probe idle devices so warm connections stay warm

[[device]]
id = "atrium-101"
host = "10.0.0.7"
username = "admin"
password = "extron"

[[device]]
id = "annex-far"
host = "10.0.0.8"
username = "admin"
password = "extron"
connect_secs = 10  # per-device override
command_secs = 8

Not using a file? Sis.from_config(mapping) takes an already-parsed dict shaped the same way, so you can source config from INI, XML, a database row, or environment variables with any parser you like.

Connections are lazy by default — the expensive SSH handshake is paid on a device's first instruction. Set eager to pay it up front, and sis_keepalive_secs to send a benign probe on an interval so a device's inactivity timer never lets the connection go cold. See the design note on eager connections and SIS keepalive for the full rationale.

API at a glance

>>> from sismatic import Sis
>>> [m for m in dir(Sis) if not m.startswith('_')]
['close', 'command', 'from_config', 'from_file', 'from_toml', 'ids', 'query', 'register']

The wheel ships a PEP 561 py.typed marker and a type stub, so editors and mypy see full signatures, including the exact accepted instruction names. Full API docs: https://metzenseifner.github.io/sismatic/.

Example: start a recording across a batch of devices

# control_recording.py
# Starts recording and stamps a title across a batch of devices.

from dataclasses import dataclass
from sismatic import Sis

@dataclass(frozen=True)
class RecordingJob:
    """(device_id × title) as a product type. A job is exactly a pairing of
    the two — never one without the other — so the type says that, instead
    of the two strings being threaded separately through every call site as
    two positional arguments that happen to always travel together."""
    device_id: str
    title: str


def run_job(sis: Sis, job: RecordingJob) -> None:
    sis.register(job.device_id, "title", job.title)  # "title" — see Register::Title
    sis.command(job.device_id, "start")              # "start" — see Command::Start


def main() -> None:
    with Sis.from_file("devices.toml") as sis:
        jobs = [
            RecordingJob(device_id="atrium-101", title="Week 4 — Lecture"),
            RecordingJob(device_id="annex-far", title="Week 4 — Overflow Room"),
        ]
        for job in jobs:
            run_job(sis, job)


if __name__ == "__main__":
    main()

License

ECL-2.0. Part of the sismatic workspace.

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

sismatic-0.2.17.tar.gz (87.8 kB view details)

Uploaded Source

Built Distributions

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

sismatic-0.2.17-cp39-abi3-manylinux_2_28_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

sismatic-0.2.17-cp39-abi3-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

sismatic-0.2.17-cp39-abi3-macosx_10_12_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file sismatic-0.2.17.tar.gz.

File metadata

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

File hashes

Hashes for sismatic-0.2.17.tar.gz
Algorithm Hash digest
SHA256 5958dcc20ebafedf80c551fe37529eefbe79d550d5bf44710693f78bea088195
MD5 6216590a42a483165b7e366e2c827b9c
BLAKE2b-256 8442ba1c08729694852ced7cf17c90364b69812881d4d5da39676d4b4b5b5844

See more details on using hashes here.

Provenance

The following attestation bundles were made for sismatic-0.2.17.tar.gz:

Publisher: pipeline.yml on metzenseifner/sismatic

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

File details

Details for the file sismatic-0.2.17-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sismatic-0.2.17-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b55a027a8841ff859ac237a616a601df9e30fce12495ae495ad94b38afef9bc
MD5 b55a1946488b9a6da788a28ca1e48a88
BLAKE2b-256 19d7de94807e6933e1ca6cb70dd9f73afd614a73b310af1ca81c38fa158f73a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for sismatic-0.2.17-cp39-abi3-manylinux_2_28_x86_64.whl:

Publisher: pipeline.yml on metzenseifner/sismatic

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

File details

Details for the file sismatic-0.2.17-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sismatic-0.2.17-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c749647173b8e49ce2eeef624e72c930f40d55130ffa276a9f45e30c3cdac0a5
MD5 214a76ad31e91b6c70627a7b83e95052
BLAKE2b-256 a5bf86624f270f32d7bfe96a6c6b8d1dc98dd50458f45bacc07c8721544c2c9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sismatic-0.2.17-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: pipeline.yml on metzenseifner/sismatic

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

File details

Details for the file sismatic-0.2.17-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for sismatic-0.2.17-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 47a11500847ce510840d33e67386447a08f5554660a0095110ab048f9a200df3
MD5 7c0450049d4f0e0fa6fc9b0729a52b93
BLAKE2b-256 aac03b6bfac2a77aafb42f94f37d6db866df4e2a8c58bf51d64750f60f8898d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sismatic-0.2.17-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: pipeline.yml on metzenseifner/sismatic

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