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.7-cp313-cp313-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13

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

Uploaded CPython 3.12

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

Uploaded CPython 3.11

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

Uploaded CPython 3.10

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

Uploaded CPython 3.9

pyiec61850_ng-1.6.0.7-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.7-cp313-cp313-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6f6238d45182972d31d7b3b9ab1d90a662b6ed23ac61f2a69b8c0feef67c4e2d
MD5 765f06b81b3a6daab4378f8c4d2c4bc6
BLAKE2b-256 566e4d6883c2b3a04502095f559910eb58b750719f1daf30fc82eb418d327988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e1e80924987210f07dff1585ae8962ad7881da5781388fca52a1120f2bc62f3c
MD5 aebc55d3e4be5cf706f2094b037861b5
BLAKE2b-256 6bdfa91174a6faf5e5a2649704256497d822b0eb366c2d24f6a57edf36ec252e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 90ab8c6878e9a8db488424b95fc09a05d5b41d1df79060253410656222f8fc1c
MD5 6de82b96971cb83aa41379db05181148
BLAKE2b-256 51da0cb0bbb8ca05019cf89a9660e311e8c4a0829cde75cdb64247fd71ed3f57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f9d889d354fc56fe2592daf22cd4f93cb15a3378ef67d690eaa8ac69ac3bded2
MD5 c55bd4967c87b3c5e0bd758d07072eaa
BLAKE2b-256 6efde7479031e80481dc6cfa1d68ee53e2b07d220b20e2a2fa6a11f94bf14afa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cb581be4295c595358b113645aa7ace9fffede7afc83d2c1598f1d54cc793f81
MD5 598767fa1090b30662eb9ee3e9edb3d5
BLAKE2b-256 a13ab9129ce0067d323b97947b56823a025e6f7e68e606c3b2923deb190590a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.0.7-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c9c932fa277e8c3b07653ce0f6983286a5d60f02e43fb649727645015abb0eee
MD5 14c5423a1f44e166a75937e4b14728fe
BLAKE2b-256 8e597a46686ae5d92167cf23148b36dc3c45ed207282d47df971e5a54fd76570

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