Idomatic asyncio wrapper around paho-mqtt.
Project description
MQTT client with idiomatic asyncio interface 🙌
Write code like this:
async with Client('test.mosquitto.org') as client:
await client.subscribe('floors/#')
async with client.filtered_messages('floors/+/humidity') as messages:
async for message in messages:
print(message.decode())
- No more callbacks! 👍
- No more return codes (welcome to the
MqttError
) - Graceful disconnection (forget about
on_unsubscribe
,on_disconnect
, etc.) - Compatible with
async
code - Did we mention no more callbacks?
asyncio-mqtt combines the stability of the time-proven paho-mqtt library with a modern, asyncio-based interface.
The whole thing is less than 250 lines of code.
Advanced use ⚡
Let's make the example from before more interesting:
import asyncio
from random import randrange
from asyncio_mqtt import Client
async def log_filtered_messages(client, topic_filter):
async with client.filtered_messages(topic_filter) as messages:
async for message in messages:
print(f'[topic_filter="{topic_filter}"]: {message.decode()}')
async def log_unfiltered_messages(client):
async with client.unfiltered_messages() as messages:
async for message in messages:
print(f'[unfiltered]: {message.decode()}')
async def main():
async with Client('test.mosquitto.org') as client:
await client.subscribe('floors/#')
# You can create any number of message filters
asyncio.create_task(log_filtered_messages(client, 'floors/+/humidity'))
asyncio.create_task(log_filtered_messages(client, 'floors/rooftop/#'))
# 👉 Try to add more filters!
# All messages that doesn't match a filter will get logged here
asyncio.create_task(log_unfiltered_messages(client))
# Publish a random value to each of these topics
topics = [
'floors/basement/humidity',
'floors/rooftop/humidity',
'floors/rooftop/illuminance',
# 👉 Try to add more topics!
]
while True:
for topic in topics:
message = randrange(100)
print(f'[topic="{topic}"] Publishing message={message}')
await client.publish(topic, message, qos=1)
await asyncio.sleep(2)
asyncio.run(main())
Alternative asyncio-based MQTT clients:
Is asyncio-mqtt not what you are looking for? Try another client:
- hbmqtt - Includes a broker
- aiomqtt - Direct wrapper around paho-mqtt
- aio-mqtt - Written from scratch
This is not an exhaustive list.
Dependencies
There is only a single dependency:
License
Note that the underlying paho-mqtt library is dual-licensed. One of the licenses is the so-called Eclipse Distribution License v1.0. It is almost word-for-word identical to the BSD 3-clause License. The only differences are:
- One use of "COPYRIGHT OWNER" (EDL) instead of "COPYRIGHT HOLDER" (BSD)
- One use of "Eclipse Foundation, Inc." (EDL) instead of "copyright holder" (bsd)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for asyncio_mqtt-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 169f3ccf4c9d207f00f0b68a2de4fb076296fc9863effac2154a50e724759ef4 |
|
MD5 | 70c9634dbd6e4a130b0b9199a6c77b19 |
|
BLAKE2b-256 | 2d1b31543713218f4359492cdcbd5ee6d8170fb92597e2764fb68f2c798885d7 |