Skip to main content

Python bindings for libiec61850 - IEC 61850 protocol implementation

Project description

pyiec61850-ng

Next Generation Python bindings for libiec61850, packaged as a Python wheel.

Build and Test PyPI version Python Versions

This repository provides Python bindings for the libiec61850 library, which is an open-source implementation of the IEC 61850 standard for communication networks and systems in substations.

Installation

Install from PyPI (Recommended)

pip install pyiec61850-ng

Install from GitHub Release

pip install pyiec61850-ng --find-links https://github.com/f0rw4rd/pyiec61850-ng/releases/latest/download/

Install directly from GitHub

pip install git+https://github.com/f0rw4rd/pyiec61850-ng.git

Install from local wheel

pip install pyiec61850-ng-*.whl

Usage

Quick Start (Recommended - Safe API)

from pyiec61850.mms import MMSClient

# Use context manager for automatic cleanup
with MMSClient() as client:
    client.connect("192.168.1.100", 102)
    print("Connected successfully!")

    # Get server identity
    identity = client.get_server_identity()
    print(f"Server: {identity.vendor} {identity.model}")

    # Discover logical devices
    devices = client.get_logical_devices()
    for device in devices:
        print(f"Device: {device}")

        # Get logical nodes
        nodes = client.get_logical_nodes(device)
        for node in nodes:
            print(f"  Node: {node}")

# Connection automatically closed

Low-Level API

For advanced use cases, you can use the raw bindings directly:

import pyiec61850.pyiec61850 as pyiec61850

# Create and connect to an IEC 61850 server
connection = pyiec61850.IedConnection_create()
error = pyiec61850.IedConnection_connect(connection, "192.168.1.100", 102)

if error == pyiec61850.IED_ERROR_OK:
    print("Connected successfully!")
    # Perform operations...
    pyiec61850.IedConnection_close(connection)

pyiec61850.IedConnection_destroy(connection)

Examples

For comprehensive examples, see the examples directory:

Run examples:

python examples/01_basic_connection.py 192.168.1.100
python examples/02_device_discovery.py 192.168.1.100

Building from Source

The wheel package is built using Docker:

docker build -t pyiec61850-builder --build-arg LIBIEC61850_VERSION=v1.6 .

To extract the wheel file:

mkdir -p ./dist
docker create --name wheel-container pyiec61850-builder
docker cp wheel-container:/wheels/. ./dist/
docker rm wheel-container

Versioning

This package uses the format: LIBIEC61850_VERSION.REVISION

  • Example: 1.6.0.1 = libiec61850 v1.6.0, first package revision
  • 1.6.0: The exact libiec61850 version included (static)
  • .1: Package revision for bug fixes, rebuilds, binding improvements

This clearly shows which libiec61850 version you're getting and our package iteration.

Check current version:

python version.py        # Package version: 1.6.0.1
python version.py --libiec61850  # libiec61850 version: v1.6.0

TASE.2/ICCP Support (Highly Experimental)

Warning: TASE.2 support is highly experimental and may change significantly.

pyiec61850-ng includes support for TASE.2 (IEC 60870-6), also known as ICCP (Inter-Control Center Communications Protocol), used for real-time data exchange between control centers in the electric utility industry.

TASE.2 Quick Start

from pyiec61850.tase2 import TASE2Client

client = TASE2Client(
    local_ap_title="1.1.1.999",
    remote_ap_title="1.1.1.998"
)
client.connect("192.168.1.100", port=102)

# Discover domains (VCC/ICC)
domains = client.get_domains()
for domain in domains:
    print(f"Domain: {domain.name} ({domain.domain_type})")

# Read a data point
value = client.read_point("ICC1", "Voltage")
print(f"Value: {value.value}, Quality: {value.quality}")

# Security analysis
security = client.analyze_security()
print(f"Readable points: {security['readable_points']}")
print(f"Concerns: {security['concerns']}")

client.disconnect()

TASE.2 Features

  • Domain Discovery: VCC (Virtual Control Center) and ICC (Indication Control Center)
  • Variable Enumeration: List and read data points with quality information
  • Data Point Access: Read/write individual points or bulk enumeration
  • Transfer Sets (Block 2): RBE (Report-by-Exception) management
  • Device Control (Block 5): Select-Before-Operate, commands, setpoints
  • Bilateral Tables: Access control configuration queries
  • Security Analysis: Automated security assessment and recommendations

TASE.2 Data Types

from pyiec61850.tase2 import (
    Domain,          # VCC/ICC domain
    PointValue,      # Data point with value and quality
    TransferSet,     # Block 2 transfer set
    BilateralTable,  # Access control table
    ServerInfo,      # Server information
)

MMS Module (Safe Wrappers)

The pyiec61850.mms module provides safe Python wrappers around the raw SWIG bindings, preventing common crashes from NULL pointer dereferences and memory leaks.

Why Use the Safe Wrappers?

The raw pyiec61850 bindings require careful memory management:

  • LinkedList_destroy() must be called after iteration
  • MmsValue_delete() must be called after reading values
  • toCharP() crashes on NULL pointers

The MMS module handles all of this automatically.

MMS Client Example

from pyiec61850.mms import MMSClient, ConnectionFailedError

with MMSClient() as client:
    try:
        client.connect("192.168.1.100", 102)

        # All memory management is automatic
        for device in client.get_logical_devices():
            for node in client.get_logical_nodes(device):
                print(f"{device}/{node}")

    except ConnectionFailedError as e:
        print(f"Connection failed: {e}")

Safe Utilities for Raw Bindings

If you need to use raw bindings, use the safe utilities:

from pyiec61850.mms.utils import (
    safe_to_char_p,        # NULL-safe string conversion
    LinkedListGuard,       # Auto-cleanup context manager
    MmsValueGuard,         # Auto-cleanup for MmsValue
)
import pyiec61850.pyiec61850 as iec61850

# Safe iteration with automatic cleanup
result = iec61850.IedConnection_getLogicalDeviceList(connection)
device_list, error = result

with LinkedListGuard(device_list) as guard:
    for device_name in guard:  # NULL pointers automatically skipped
        print(device_name)
# LinkedList automatically destroyed

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

pyiec61850_ng-1.6.0.8-cp314-cp314-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14

pyiec61850_ng-1.6.0.8-cp313-cp313-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13

pyiec61850_ng-1.6.0.8-cp312-cp312-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.12

pyiec61850_ng-1.6.0.8-cp311-cp311-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.11

pyiec61850_ng-1.6.0.8-cp310-cp310-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10

pyiec61850_ng-1.6.0.8-cp39-cp39-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9

pyiec61850_ng-1.6.0.8-cp38-cp38-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8

File details

Details for the file pyiec61850_ng-1.6.0.8-cp314-cp314-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 69a2fd2f16f29715d9c6618a34c7a5ce9ca9f9fe9c0b31fe5e10c025f8169b5a
MD5 f0c7e50a7ba730de699b27b5076c6b38
BLAKE2b-256 e297921edf9fec31c7b14c8e9d76a325984348e84abf9a32fbbcf5bf580b2023

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp313-cp313-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b29c9a3078b2b92e39b232237b2e2c38da5d7eb5b1e79a2321a19d0a7eddf64a
MD5 e8f3344de2dd75bcd7826ece4212db50
BLAKE2b-256 48c233032f9279612e940b98ee22bb836bb2d3d6fcbf2300275fe5d66b524571

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp312-cp312-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cb91331ca95cf51fb62a5d8861327fed3261758bc83597c76fddb29ad4103ef2
MD5 80a414ee7f2a3d3ea009c0fdfb948082
BLAKE2b-256 3fb130fbadae47c8aec89a483c5b73a2ee1223d12e1870b7b6ceb3e7e318f217

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp311-cp311-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ba381ed9b7732bbb0a2663a6bd7fa7af8e574edc9eb0494293a8ce683fb5f208
MD5 b9d9345c6da7e3c67529b28ec17f377b
BLAKE2b-256 24474a65888dee29c981113a4c7be37b1a84b242dd9bd720f17f423b41433dc3

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp310-cp310-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2d8aab6b516642ca5facc455e290caec17a9908db891a6ad9a3f4cd1d56003a2
MD5 33a5879f02cf32ef62eaa73362e73078
BLAKE2b-256 112ec11cceeb5db928818e7662857e6ec037396019972b77480d97cfcf1e3abd

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp39-cp39-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f32e861e46f2df0b2e0a1d0c3371a586b9d07003c82b6edeb1afc91b47489a8f
MD5 52f3a3aa4dd6f8a416681aaca922135a
BLAKE2b-256 36eb312cfa47e1bda6acf74a6e2d4cb434e3289562c4d3e36b52ed43b838fa2a

See more details on using hashes here.

File details

Details for the file pyiec61850_ng-1.6.0.8-cp38-cp38-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.8-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3293d4f7e216ae536ccf99e929d92a029584d82cd53e04e5ac5ff50423a77cd1
MD5 e9777abfedf7f86e6aa5ec21209ce9ab
BLAKE2b-256 44be47b15e4626b05a7a84c23583abc7b00f7b0b01112cf8667df70e8f6e517d

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