Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Python Client for the OHF Matter Server

A PyPI package (matter-python-client) providing Python bindings for the OHF Matter Server. This is a drop-in replacement for the client portion of python-matter-server, with custom cluster definitions updated to match the Matter.js server.

Origin

The client and common modules were copied from python-matter-server v8.1.2 and modified:

  • Source: matter_server/client/ and matter_server/common/ from python-matter-server
  • Modified: matter_server/common/custom_clusters.py — updated to match the JS server's cluster definitions
  • Excluded: matter_server/server/ (the JS server replaces it), common/helpers/logger.py (depends on coloredlogs, a server-only dependency)

Custom Cluster Changes

Cluster Change
EveCluster +8 attributes (getConfig, setConfig, loggingMetadata, loggingData, lastEventTime, statusFault, childLock, rloc16), wattAccumulatedControlPoint type fixed
HeimanCluster Attribute IDs shortened to match JS server
NeoCluster Types changed from float32 to uint
Polling Removed (JS server handles polling natively)

Package

  • PyPI name: matter-python-client
  • Python module: matter_server (same import path as python-matter-server)
  • Python: >= 3.12
  • Dependencies: aiohttp, orjson, home-assistant-chip-clusters

npm Scripts (from monorepo root)

# First-time setup: create venv and install with test dependencies
npm run python:install

# Run unit + mock server tests (fast, ~1s)
npm run python:test

# Run full integration tests against real Matter.js server + test device (~40s)
npm run python:test-integration

# Run all Python tests
npm run python:test-all

# Build the PyPI package (.tar.gz + .whl)
npm run python:build

Usage

The package provides the same matter_server.client API as python-matter-server:

import aiohttp
from matter_server.client import MatterClient

async with aiohttp.ClientSession() as session:
    client = MatterClient("ws://localhost:5580/ws", session)
    await client.connect()

    init_ready = asyncio.Event()
    listen_task = asyncio.create_task(client.start_listening(init_ready))
    await init_ready.wait()

    nodes = client.get_nodes()

To reach a server that listens on a unix socket (--listen-address /path/to/socket), pass unix:///path/to/socket as the server URL. The client then opens its own session on that socket for the WebSocket and the OTA upload, and the session passed in stays unused.

OHF-only extensions

Beyond the python-matter-server API, the client exposes commands the Matter.js server adds:

  • get_network_topology(refresh=False) — the Thread/Wi-Fi network as a graph (schema 13+)

  • upload_ota_file(image) — store a local .ota firmware image in the server's OTA image store (schema 13+). Takes the raw bytes or a path; reserves an upload id over the WebSocket session, then streams the bytes to POST /ota-upload/<upload_id>. Raises OtaUploadError (code 101) for a corrupt image, an expired/spent id, or disabled OTA support.

  • get_icd_state, register_icd, unregister_icd, resync_icd — ICD Check-In registration

  • read, subscribe, unsubscribe, enable_auto_subscription, disable_auto_subscription — Matter read and subscribe requests with explicit paths (schema 14+). read returns an InteractionReport, subscribe a SubscribeResult (the priming report plus subscription_id). A subscription is named by node_id and subscription_id together. Later reports arrive as subscription_report events (SubscriptionReportData), an end the caller did not ask for as subscription_ended (SubscriptionEndedData); both go only to the connection that subscribed and reach node_filter subscribers. Pass listener to subscribe to get every event of that one subscription, including those the server sends right behind the response. The listener gets no further calls once unsubscribe is called. When the connection is lost or disconnect is called, the listener receives a subscription_ended that the client builds itself, because the server ends the subscription without sending one; node_filter subscribers do not get it. If a subscribe call is cancelled or times out (for example in asyncio.wait_for) before it returns, the client ends that subscription with unsubscribe and logs a failure of that call. subscribe, unsubscribe and the two auto subscription methods need a server running with auto subscription disabled.

  • commission_with_code and commission_on_network take discovery_timeout_s (schema 14+)

  • send_batched_device_commands — sends (endpoint_id, command) pairs to one node in a single InvokeRequest and returns one BatchedCommandResult per command (schema 14+)

  • write_attribute takes * as the endpoint to write all endpoints of the node that have the attribute, and timed_request_timeout_ms for a timed write (schema 14+)

  • parse_onboarding_payload — decodes a QR code or manual pairing code without contacting a device and returns QrOnboardingPayloadResult or ManualOnboardingPayloadResult (schema 14+)

  • camera_get_capabilities, camera_start_stream, camera_provide_answer, camera_provide_ice_candidates, camera_stop_stream, camera_snapshot, camera_release_stream — the camera API (schema 14+). camera_get_capabilities, camera_start_stream, camera_stop_stream and camera_snapshot return dataclasses from matter_server.common.models; the other three return None. camera_start_stream's video / audio take None (the server decides), a CameraVideoHints / CameraAudioHints dict, or False (no such track). talkback=True lets the offer ask the camera to play your audio; without it the server makes the offer's audio sections not send, so a browser-style sendrecv audio offer goes to the camera as recvonly. camera_session_ended and camera_stream_evicted events arrive as CameraSessionEndedData / CameraStreamEvictedData; webrtc_callback stays a dict. Errors 102 to 106 (CameraStreamIncompatible, ...) expose their details as attributes, e.g. err.reason and err.bound on CameraStreamIncompatible

    The minimal camera_start_stream call is node_id, endpoint_id, stream_usage and your SDP offer: the server reuses or allocates the best stream the camera can serve that still fits what the offer can decode, and adds audio when it can. Pass video / audio hints only to set hard bounds. A session opened this way is driven with camera_provide_answer, camera_provide_ice_candidates and camera_stop_stream only, not with send_webrtc_provider_command or a send_device_command EndSession: the server tracks the session and its streams, and only the camera_* methods keep that record correct. The exception is a re-offer (ICE restart), which goes through send_webrtc_provider_command. See docs/websockets_api.md for the flow and every option.

    try:
        result = await client.camera_start_stream(node_id, 1, "LiveView", sdp=offer)
    except CameraStreamIncompatible as err:
        print(err.reason, err.bound)
    else:
        # The camera's answer arrives as a webrtc_callback "answer" event for this session.
        print(result.webrtc_session_id, result.video.codec if result.video else None)
    version = await client.upload_ota_file("/path/to/firmware.ota")
    print(version.vid, version.pid, version.software_version)

To use this package instead of python-matter-server in the Home Assistant Matter integration, change manifest.json:

- "requirements": ["python-matter-server==8.1.2"],
+ "requirements": ["matter-python-client==1.0.0"],

Testing

The test suite has three layers:

  • Import smoke tests (8 tests) — verify all HA integration imports resolve
  • Mock server tests (4 tests) — Python client against JS MockMatterServer subprocess
  • Integration tests (63 tests) — Python client against real Matter.js server + test device, mirroring the JS IntegrationTest.ts

Metadata

Release files for matter-python-client 1.5.0a0.dev202610200302

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for matter-python-client 1.5.0a0.dev202610200302
File Size Uploaded Provenance
matter_python_client-1.5.0a0.dev202610200302.tar.gz 255.6 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for matter-python-client 1.5.0a0.dev202610200302
File Interpreter ABI Platform
matter_python_client-1.5.0a0.dev202610200302-py3-none-any.whl Python 3 none any Details

Total release size: 603.9 kB

Release files / matter_python_client-1.5.0a0.dev202610200302.tar.gz

Download URL matter_python_client-1.5.0a0.dev202610200302.tar.gz
Size 255.6 kB
Tags Source
SHA-256 checksum
How to use checksums
6d146278891f32a2035bf27b02f822534824db0c9303cc4bdf6bc32ae3a8821f
BLAKE2b-256 checksum
How to use checksums
17480e6ceeaf493dd6fef817e891ce84121fd3fd22f8123230088fd0ea25770c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / matter_python_client-1.5.0a0.dev202610200302-py3-none-any.whl

Download URL matter_python_client-1.5.0a0.dev202610200302-py3-none-any.whl
Size 348.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7581404cdf560dea7e6eb11aa57ee854c8b04f771188f08247947da3747a5410
BLAKE2b-256 checksum
How to use checksums
cc3bcfc71c634fc3725f92fb70c78c661408c5a611a7734fe92763bc68b79afb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for matter-python-client 1.5.0a0.dev202610200302

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for matter_python_client-1.5.0a0.dev202610200302.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page