Skip to main content

Interface Wrapper to allow event-based communication between containers via sidecar ENS

Project description

Procaaso SEAMS SDK

Version 1.0.0

A Python SDK for building distributed process control systems using the Procaaso Seam Interface Specification v1.0. Enables event-based communication between containerized services through standardized seam contracts.

Features

  • 5 Standard Contracts: Actuator, Sensor, Unit, Driver, and APP contracts per ISA-88
  • Idempotent Commands: Built-in command deduplication and replay protection
  • State Management: Automatic seam state synchronization via sidecar
  • Type Safety: Pydantic models for all seam attributes
  • Async/Await: Full asyncio support for non-blocking operations
  • ISA-88 Compliant: Recipe orchestration with APP → Unit → Equipment hierarchy
  • Polling & Streaming: Flexible command routing patterns

Installation

pip install procaaso-seams-sdk

Or with Poetry:

poetry add procaaso-seams-sdk

Quick Start

Creating an Actuator Service (Pump)

import asyncio
from procaaso_seams_sdk import ActuatorService
from procaaso_seams_sdk.bus.envelopes import CommandRequest

class PumpService(ActuatorService):
    async def handle_command(self, request: CommandRequest) -> None:
        cmd = request.command

        if cmd == "Start":
            await self.update_state(lifecycle_state="Running")
            await self.update_feedback(pv=50.0, sp=50.0)

        elif cmd == "Stop":
            await self.update_state(lifecycle_state="Idle")
            await self.update_feedback(pv=0.0, sp=0.0)

# Initialize and run
async def main():
    pump = PumpService(
        component_id="P01",
        bus=bus_adapter,
        store=seam_store,
        router=bus_router,
        log=logger
    )
    await pump.start()

asyncio.run(main())

Creating a Sensor Service

from procaaso_seams_sdk import SensorService

class TemperatureSensor(SensorService):
    async def handle_command(self, request: CommandRequest) -> None:
        if request.command == "ResetFault":
            await self.update_state(lifecycle_state="Online", faulted=False)

    async def read_sensor(self):
        # Simulate reading
        temperature = 25.5
        await self.update_value(pv=temperature, quality="GOOD")

asyncio.run(main())

ISA-88 Recipe Controller (APP Service)

from procaaso_seams_sdk import APPService

class RecipeController(APPService):
    async def handle_command(self, request: CommandRequest) -> None:
        if request.command == "LoadRecipe":
            recipe_id = request.args[0]["recipe_id"]
            await self.update_state(
                lifecycle_state="RecipeLoaded",
                loaded_recipe_id=recipe_id
            )

        elif request.command == "StartRecipe":
            await self.update_state(lifecycle_state="Running")
            await self.execute_recipe()

Architecture

┌─────────────────────────────────────────────────────────────┐
│                      MES / HMI / SCADA                      │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                    APP (Recipe Controller)                   │
│              Uses: APPService, UnitClient                   │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                  Unit (Batch Controller)                    │
│       Uses: UnitService, ActuatorClient, SensorClient       │
└──────────────────────────┬──────────────────────────────────┘
                           │
              ┌────────────┴────────────┐
              ▼                         ▼
┌──────────────────────┐    ┌──────────────────────┐
│  Actuators (P/V/M)   │    │   Sensors (T/P/F)    │
│  ActuatorService     │    │   SensorService      │
└──────────────────────┘    └──────────────────────┘

Contract Overview

Contract Purpose Key Attributes
Actuator Controllable devices (pumps, valves, motors) meta, state, capabilities, feedback, intent, cmd
Sensor Measurement devices meta, state, value, scaling, capabilities, cmd
Unit Process control logic (ISA-88 Unit Procedure) meta, state, intent, waiting_on, cmd, outcome
Driver I/O hardware with multiple channels meta, state, capabilities, inventory, cmd
APP Recipe orchestration (ISA-88 Master Recipe) meta, state, cmd

Examples

The SDK includes 15+ working examples demonstrating:

  • Simple Examples: Basic pump, sensor, and valve services
  • TFF System: Complete tangential flow filtration demo with ISA-88 coordination
  • Advanced Patterns: Polling routers, control loops, multi-phase recipes

See the examples/ directory and examples/README.md for details.

Documentation

Key Concepts

Seams

A seam is the integration surface between services. Each seam has:

  • component.instrument.attribute path (e.g., P01.actuator.state)
  • stateSchemaId URI defining structure
  • Typed fields (bool, float, int, string, list)

Idempotency

All commands use command_id for replay protection:

  • Duplicate commands return cached reply
  • Permanent tracking (requires UUID-based IDs)
  • Prevents double-execution on network retries

State Machine

Services follow ISA-88 state machines:

  • Actuator: Idle → Starting → Running → Stopping → Stopped
  • Unit: Idle → Running → Complete/Stopped/Aborted
  • APP: Idle → RecipeLoaded → Running → Complete

Development

Running Tests

poetry install
poetry run pytest

Building Package

poetry build

Requirements

  • Python 3.10+
  • procaaso-client ^0.1.19
  • pydantic ^1.10.0
  • aiohttp ^3.9.0

License

Copyright © 2025 Alphinity Bespoke Systems

Contributing

This SDK implements the Procaaso Seam Interface Specification v1.0. Changes must maintain backward compatibility or increment the major version per semantic versioning.


Developer Notes

For AI/Copilot development, see internal build contract:

Source of truth:

  • specs/Procaaso_Seam_Interface_Spec_v1.0.md
  • specs/seams_models_v1.yaml
  • specs/SDK_Behavior_Spec.md

Hard rules:

  • Do not invent seam shapes not in seams_models_v1.yaml
  • Bus envelopes must follow interface spec
  • All services: Announce → CommandRequest/Reply → StateEvent
  • Use async/await everywhere
  • Use procaaso-client for bus read/write

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

procaaso_seams_sdk-1.0.0.tar.gz (44.2 kB view details)

Uploaded Source

Built Distribution

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

procaaso_seams_sdk-1.0.0-py3-none-any.whl (61.1 kB view details)

Uploaded Python 3

File details

Details for the file procaaso_seams_sdk-1.0.0.tar.gz.

File metadata

  • Download URL: procaaso_seams_sdk-1.0.0.tar.gz
  • Upload date:
  • Size: 44.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.10.11 Windows/10

File hashes

Hashes for procaaso_seams_sdk-1.0.0.tar.gz
Algorithm Hash digest
SHA256 e3a61ab0a1cec3f4e516c9c19e3aef0448d250e1fcd752d295a2120bea64be71
MD5 66f4b68586ffbf98722dc9b7066cd0f5
BLAKE2b-256 436b593d9488c6253095e6cb31bd583accf1a458d3bf5e78edff1e1513714e35

See more details on using hashes here.

File details

Details for the file procaaso_seams_sdk-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for procaaso_seams_sdk-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2f9d6a4f6447f4d1fc38e1d9ff10d35e13e8447874c2c33c2a79d61fe871d634
MD5 0d00c2abc39ffec12ba47909cc9ab8f2
BLAKE2b-256 2f12f694468109b11ce0f4d7a356c77d2294920a22ca86e004b08ae73ee12bf3

See more details on using hashes here.

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