Skip to main content

Python bindings for libiec61850 - IEC 61850 protocol implementation

Project description

pyiec61850-ng

This library is experimental. Use at your own risk. No warranty of any kind is provided.

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}")

MMS over TLS

The wheels ship libiec61850 with mbedTLS compiled in. Configure TLS with TLSConfig and pass it to the client — both server-authentication-only and mutual TLS are supported:

from pyiec61850.mms import MMSClient
from pyiec61850.mms.tls import TLSConfig, TLSVersion

tls = TLSConfig(
    own_cert="client.pem",          # omit cert+key for server-auth-only TLS
    own_key="client-key.pem",
    ca_certs=["ca.pem"],
    min_version=TLSVersion.TLS_1_2,
)

with MMSClient("192.168.1.100", tls=tls) as client:  # default TLS port 3782
    print(client.get_logical_devices())

Self-signed / test servers. If you have the server's certificate, pin it (real authentication, no CA needed):

tls = TLSConfig.pinning("server.pem")                 # trust exactly this cert
tls = TLSConfig.pinning("server.pem", own_cert="client.pem", own_key="client.key")
tls = TLSConfig.pinning("server.pem", allow_expired=True)   # tolerate expiry

If you don't have the certificate and just want an encrypted channel for testing, insecure=True accepts any certificate the server presents:

tls = TLSConfig(insecure=True)                        # accept any cert

⚠️ insecure=True disables all peer authentication — the connection is encrypted but offers no protection against a man-in-the-middle. Never use it in production. (Stock libiec61850 has no such mode; this package adds it via a small TLSConfiguration_setInsecure patch to the bundled library.)

The raw TLSConfiguration_* API (TLSConfiguration_create, TLSConfiguration_setOwnCertificateFromFile, …) is also exposed for low-level use, e.g. for IedServer_createWithTlsSupport.

Variable Type Introspection

get_variable_spec() reads a variable's MMS type specification (recursively for structures and arrays) and returns a plain dataclass:

spec = client.get_variable_spec("simpleIOGenericIO/GGIO1.AnIn1.mag[MX]")
print(spec.type_name)                    # "STRUCTURE"
print([c.name for c in spec.children])   # ["f"]

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

License

This project is licensed under the GNU General Public License v3.0 (GPLv3) - see the LICENSE file for details.

Third-Party Components

  • libiec61850 by MZ Automation GmbH - GPLv3 (commercial license available)
  • Mbed TLS - Apache License 2.0

The compiled libiec61850.so and SWIG bindings included in wheel distributions are built from the libiec61850 source code. See the NOTICE file for full attribution details.

For commercial use cases where GPLv3 is not suitable, a commercial license for libiec61850 is available from MZ Automation GmbH.

Trademarks

All marks belong to their owners; used nominatively to describe interoperability; no endorsement implied.

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.1.9-cp314-cp314-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.14Windows x86-64

pyiec61850_ng-1.6.1.9-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

pyiec61850_ng-1.6.1.9-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

pyiec61850_ng-1.6.1.9-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

pyiec61850_ng-1.6.1.9-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

pyiec61850_ng-1.6.1.9-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

pyiec61850_ng-1.6.1.9-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

pyiec61850_ng-1.6.1.9-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

pyiec61850_ng-1.6.1.9-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

pyiec61850_ng-1.6.1.9-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

pyiec61850_ng-1.6.1.9-cp39-cp39-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9Windows x86-64

pyiec61850_ng-1.6.1.9-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c792380bc3ed02635bcb04c4e5893f77a8ab4802c8a29fbb61c1bb71382e37ee
MD5 a03cd8877cb9d5c50d774c8517296d8e
BLAKE2b-256 cde4e1774f3add9bc179e145ef7cc6cb3f5e309ce5ea3854e24c9fd6a062b653

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp314-cp314-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9fa4ac1dda1efcac30f319656689a5d3cc0ba9a198e1b372a5df94f4ac192ebd
MD5 689b3a00c378ad15121815717b2aaba3
BLAKE2b-256 a48376d1c789088300c071265a479b65e1d399e07cc2dfa20331d0025ce89486

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 434829758cd5892f3b9efb9ea47a4314f57fb1b08ca4ca3c9ab62baeeba341e0
MD5 9c814e25131d9fbbfc2dd17d8c1a5719
BLAKE2b-256 b8785d0f0e749a2a50cee0c4d07fff65a0bc2b07e5c011a8b52d0e27df3c17b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp313-cp313-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ce80bf79eab747c06d2f17e8a98e625dd87229c9bec019c5b0275d683c476eff
MD5 96dd1e2826977a31e4de45f0b491aca2
BLAKE2b-256 92d8d86fcc8e25351a74eb3ff898b1eea187445513753ed621547dd44eed52e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9d24aa89e19d3475bd17e709350a978c420afec582c625695e8abb653c6727e1
MD5 c4e869d0810d9dca441ccdb86b000120
BLAKE2b-256 a0691ca756fa15739bbbac68e1ceeb117bdadda310bcd4eeb11361ebd87eee4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp312-cp312-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e5edeb08ae37658a7bde98e6286ea1b91c921ad6229e9dab9bfda2859c0bbd81
MD5 06dd9c2e78b05107212b2187b26ab011
BLAKE2b-256 c8ff66ef75b97ad5cc351a541a1d21e8394fa9c6f14f5a199108efcfb23c7876

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f10f4d0b6d1a9673764287ededb4515da26975c9d2ac0c6c1ab9bccc799b6dd3
MD5 14e5f77608e2323e0293d5b7d92148bf
BLAKE2b-256 7cc75855f0c760336ab11cb7f4b723e7daf9a59f7d881f21062e06f8f154b802

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp311-cp311-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6d50da1692d6c6ac5579e31c03f233dbd88089471977b43a1c158bc69d25c67b
MD5 8cf9b2f9bedd52b4e222df7882e56320
BLAKE2b-256 7d0d51c8cdaf7eae97285c0d10f0313c2297e5fd916c86c43bc6eac91bbf5630

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e299bb3ffbcb54be632011f0a306c068e4f84706d98ed0ebf4c1781797ecfa37
MD5 73b0c8391d7b04226bd46789d16dd057
BLAKE2b-256 389ac574612d6b6fca65ec04ffbb84e9995652c7e8057f15f1e735ed3b061a9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp310-cp310-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 709f4f4917614da3d41e08c67579dc3b09da14b0b0b5c6b576a737f0366a015c
MD5 8e1e4bd29c0059d067e02fa16b89c3df
BLAKE2b-256 16819f353d08e08e460fc4b6032b44c204d8b0092dc075f924dbd4b379faa71b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6865b5ff5203c77e9352249b531d3d3eca34fabbe0831acedd1dd7559aae07f1
MD5 c2408b84715782313e99abd2ddb87a77
BLAKE2b-256 c464abcf081cb97a93a55ec499a8d599a9722409e114bce645c1c9732a2d009f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp39-cp39-win_amd64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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

File details

Details for the file pyiec61850_ng-1.6.1.9-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyiec61850_ng-1.6.1.9-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cefa02de7c87993fa1925b65711664e1817b696a035326fa60e525e9ab34a2b7
MD5 8242c8ff963cbaf0d24501213146fa8c
BLAKE2b-256 b77eb826d2657de2a7f9fb36d273ab610b293cdcdb84c59725ad2b664be286ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyiec61850_ng-1.6.1.9-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build-wheel.yml on f0rw4rd/pyiec61850-ng

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