Skip to main content

Python bindings for rustuyabridge — an MQTT bridge for Tuya devices

Project description

pyrustuyabridge

Python bindings for rustuya-bridge, an MQTT bridge for managing Tuya devices via the Tuya Local API.

This package exposes the bridge server as an embeddable component, so Python code can run it alongside and interpret MQTT topics/payloads identically to the native bridge.

Install

pip install pyrustuyabridge

Pre-built wheels are provided for Linux (manylinux2014 / musllinux_1_2 on x86_64 and aarch64), Windows x64, and macOS (x86_64 / arm64). Wheels are built with PyO3 abi3-py39, so a single wheel per platform supports CPython 3.9 and newer.

Quick start

import asyncio
from pyrustuyabridge import PyBridgeServer

async def main():
    server = PyBridgeServer(
        mqtt_broker="mqtt://localhost:1883",
        mqtt_root_topic="rustuya",
    )
    await server.start_async()

asyncio.run(main())

Keeping the bridge running across reconfigure

The bridge is meant to be driven entirely over MQTT — including config changes. To apply a change to the topic/payload templates or mqtt_retain, edit the config_path file and publish a reconfigure action to the command topic. The bridge clears the retained messages published under the old scheme and then exits cleanly so the new config can take effect — exactly like the native binary under systemd Restart=always.

In an embedded host there is no external supervisor, so wrap the server in a small recreate loop. An intentional shutdown stops the supervisor (not the bridge); any other exit — reconfigure or a crash — recreates it, re-reading config_path:

# asyncio
import asyncio
from pyrustuyabridge import PyBridgeServer

class AsyncBridgeSupervisor:
    def __init__(self, **kwargs):
        self._kwargs = {**kwargs, "no_signals": True}  # host owns signals
        self._stop, self._server = False, None

    async def run(self):
        while not self._stop:
            self._server = PyBridgeServer(**self._kwargs)  # re-reads config_path
            try:
                await self._server.start_async()           # returns on reconfigure/stop
            except Exception as e:
                print("bridge exited with error, restarting:", e)
                await asyncio.sleep(5)

    def stop(self):
        self._stop = True
        if self._server:
            self._server.stop()

# asyncio.run(AsyncBridgeSupervisor(config_path="/etc/rustuya/config.json").run())
# thread
import threading, time
from pyrustuyabridge import PyBridgeServer

class BridgeSupervisor:
    def __init__(self, **kwargs):
        self._kwargs = {**kwargs, "no_signals": True}
        self._stop = threading.Event()
        self._server = None

    def run(self):                                   # run in a thread (blocking)
        while not self._stop.is_set():
            self._server = PyBridgeServer(**self._kwargs)
            try:
                self._server.start()                 # blocks until reconfigure/stop
            except Exception as e:
                print("bridge exited with error, restarting:", e)
                time.sleep(5)

    def stop(self):
        self._stop.set()
        if self._server:
            self._server.stop()

Config precedence is kwargs > config_path file > defaults (the file only fills fields left unset). So put any field you want to change via reconfigure in the file, not in kwargs — a field passed as a kwarg wins and the file edit is ignored (same rule as CLI flags vs. config file in the native binary).

Helpers

The module also exposes topic/payload utilities for code that needs to match the bridge's wire format:

  • tpl_to_wildcard(template, root_topic) — template → MQTT wildcard.
  • match_topic(topic, template) — returns extracted variables or None.
  • render_template(template, vars) — substitutes {key} placeholders.
  • parse_payload(payload, vars) — parses an MQTT payload into a structured value.
  • parse_payload_with_template(payload, template) — reverse of render_template: recovers placeholder values from a rendered payload, or None if not reversible.
  • parse_seed_dps(payload, dp=None, template=None) — extracts the DPS map from an event payload exactly as the bridge's seed phase does; pass dp for single-DP ({dp}) topics, None for multi-DP topics whose payload is the full DPS object.
  • validate_payload_template(template)(ok, message); checks whether a payload template can be reverse-parsed.

See the project repository for full documentation.

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.

pyrustuyabridge-0.3.0rc26-cp39-abi3-win_amd64.whl (2.5 MB view details)

Uploaded CPython 3.9+Windows x86-64

pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_11_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_10_12_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 bd923b0d531efc5418c4d602fc7cc4c9d5ad8c04057b803bb1635aabe691e662
MD5 ea803e23ca3ca909d56b4790eee1f658
BLAKE2b-256 fbf7f0ec64473898d8b794e3db644119095b4b31473337d14f5a4498ea889f5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-win_amd64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c6750aa99935c501f3d8c96a6c715ff1a5ddd008335ecb0233ee2af2aa7efbb1
MD5 ff1d98d24288bfdab0c920142cab10e9
BLAKE2b-256 9bf5ead6a60b5eee694247bc936a908e964bf8dbf5280af017d10c846b222d42

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_x86_64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 349749abc9576e130f51cb77d5af208137b4fcaba6f08880fdc22639e147918b
MD5 3ba70c6bd770354be5eb2a652872a3c2
BLAKE2b-256 d20539b150db0cca1969b5eb2565b6e4d3aa2cb84205129eeea7d327e1fadaa2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-musllinux_1_2_aarch64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c67ce0794a225ee111f921a10de88ca83a50c67fa95e7aac19cadd44dfb43790
MD5 cf3e0201c67e66462c16ea39d9855262
BLAKE2b-256 361d0e88cea454873c3bb2f48323b7a2ddae93357ea270a5ec46d84b379132a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7f238fb2ee7694a118751e4d69a420c3b9dbc6ba298694bde15cea23860812e6
MD5 769917cd670d520eaf1ee0a32675b8d1
BLAKE2b-256 669105d593c24f6dcc9e1cad3363f37b7bad4f37d79a86d9121c91375e72b1e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 352905b80c2c21878655fea9246cf8c402f04fac5258690eff343b82c2df8c4d
MD5 9b2b1382b2305510527c9593834752d1
BLAKE2b-256 a3823cc746bf8fe170a05240c1e57da9e4fb4e2159636dc0127a9f355cf0f95d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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

File details

Details for the file pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 740ecd63fa86298f127e054d42e5a693ef9b765ba80ed5b0494bd120c10c1316
MD5 38e538af4080968a9502c541b14efaa1
BLAKE2b-256 742b7b714eb432dc230e8ac0dbfb37e71ee5b9939df2976d1d6d207ff7c8b344

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyrustuyabridge-0.3.0rc26-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on 3735943886/rustuya-bridge

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