Skip to main content

Pure asyncio MQTT 3.1.1/5.0 client library

Project description

zmqtt

Pure asyncio MQTT 3.1.1 and 5.0 client library. No paho dependency, no threading, no god classes.

Why not aiomqtt?

aiomqtt is a thin async wrapper around paho-mqtt. You inherit paho's threading model, 10 000-line files, and implicit global state — just with async/await painted on top.

zmqtt is built from scratch:

zmqtt aiomqtt (paho)
I/O model pure asyncio paho threads + asyncio bridge
Packet codec pure functions, I/O-free paho internals
MQTT 5.0 native, typed properties dataclasses partial
Type annotations strict mypy partial
Backpressure bounded subscription queues none
QoS 2 full state machine paho impl

Installation

pip install zmqtt

Quick start

import asyncio
from zmqtt import MQTTClient

async def main():
    async with MQTTClient("broker.example.com") as client:
        async with client.subscribe("sensors/#") as messages:
            async for msg in messages:
                print(msg.topic, msg.payload)

asyncio.run(main())

Publish

async with MQTTClient("broker.example.com") as client:
    await client.publish("sensors/temperature", b"23.5", qos=1)

QoS levels

from zmqtt import QoS

await client.publish("topic", b"data", qos=QoS.AT_LEAST_ONCE)   # QoS 1
await client.publish("topic", b"data", qos=QoS.EXACTLY_ONCE)    # QoS 2

Manual acknowledgement

Hold the PUBACK/PUBREC until your application has durably processed the message:

async with client.subscribe("orders/#", auto_ack=False) as messages:
    async for msg in messages:
        await save_to_database(msg)
        await msg.ack()  # broker will redeliver if we crash before this

Subscription as explicit get

Useful when interleaving message handling with other async work:

async with client.subscribe("sensors/#") as messages:
    msg = await messages.get_message()
    print(msg.topic, msg.payload)

Reconnection

MQTTClient reconnects automatically with exponential backoff. Active subscriptions are transparently re-registered after reconnect — your async for loop keeps running.

MQTT 5.0

Pass version=5 to use MQTT 5.0. Properties are typed dataclasses:

from zmqtt import MQTTClient
from zmqtt.packets.properties import PublishProperties

async with MQTTClient("broker.example.com", version=5) as client:
    props = PublishProperties(content_type="application/json")
    await client.publish("topic", b'{"value": 42}', properties=props)

Architecture

src/zmqtt/
  packets/        # I/O-free codec: frozen dataclasses + pure encode/decode
  transport/      # thin asyncio reader/writer (TCP, TLS)
  state.py        # session state, QoS 2 state machine
  protocol.py     # packet dispatch, ping loop, flow control
  client.py       # public API: MQTTClient, Subscription

The codec layer has zero asyncio imports — every packet type is a frozen dataclass, serialization and parsing are pure functions. This makes the entire codec trivially testable.

Project details


Download files

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

Source Distribution

zmqtt-0.0.1a4.tar.gz (23.4 kB view details)

Uploaded Source

Built Distribution

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

zmqtt-0.0.1a4-py3-none-any.whl (31.5 kB view details)

Uploaded Python 3

File details

Details for the file zmqtt-0.0.1a4.tar.gz.

File metadata

  • Download URL: zmqtt-0.0.1a4.tar.gz
  • Upload date:
  • Size: 23.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zmqtt-0.0.1a4.tar.gz
Algorithm Hash digest
SHA256 76437add8e38d852e8f068580a118773da6981a9797a8b12d1165952e8fefd8a
MD5 00501c077caa8471b8383e8c0616d28d
BLAKE2b-256 6715df3e691a15e0598ad469e1bdc9d1b34a5fc9f1b83041067eee3e06fb22fd

See more details on using hashes here.

File details

Details for the file zmqtt-0.0.1a4-py3-none-any.whl.

File metadata

  • Download URL: zmqtt-0.0.1a4-py3-none-any.whl
  • Upload date:
  • Size: 31.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zmqtt-0.0.1a4-py3-none-any.whl
Algorithm Hash digest
SHA256 a91c74d0cfd6ac83b74cc11f370e0b6f7dfcae686c91faf72d4bb4d78f0de30f
MD5 579a4f31f0ee32c119fa3250fa752b43
BLAKE2b-256 273a1625b38678ce1cdc0777b546fc9cdb6ed803a722deb3f48df1bac9da1f3b

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