Python library for MQTT communication with Dyson devices
Project description
libdyson-mqtt
A Python library for MQTT communication with Dyson devices.
Overview
libdyson-mqtt provides a clean, non-blocking interface for communicating with Dyson devices over MQTT. The library handles connection management, message queuing, and provides callbacks for real-time message processing.
Features
- Non-blocking operations: All operations are asynchronous and won't block your application
- Clean connection management: Automatic connection handling with proper cleanup
- Message queuing: Messages are queued internally for processing
- Callback support: Real-time callbacks for messages and connection status
- Type safety: Full type annotations and mypy support
- Comprehensive testing: Unit and integration tests included
Installation
pip install libdyson-mqtt
For development:
pip install -e .[dev]
Quick Start
from libdyson_mqtt import DysonMqttClient, ConnectionConfig
# Configure connection
config = ConnectionConfig(
host="192.168.1.100", # Your Dyson device IP
mqtt_username="your_username",
mqtt_password="your_password",
mqtt_topics=["475/device/status", "475/device/command"],
port=1883,
keepalive=60
)
# Create and connect client
client = DysonMqttClient(config)
client.connect()
# Check if connected
if client.is_connected():
print("Connected successfully!")
# Publish a command
client.publish("475/device/command", '{"command": "status"}')
# Get received messages
messages = client.get_messages()
for msg in messages:
print(f"Topic: {msg.topic}, Payload: {msg.payload_str}")
# Clean disconnect
client.disconnect()
Using Context Manager
For automatic connection management:
from libdyson_mqtt import DysonMqttClient, ConnectionConfig
config = ConnectionConfig(
host="192.168.1.100",
mqtt_username="your_username",
mqtt_password="your_password",
mqtt_topics=["475/device/status", "475/device/command"]
)
# Automatically connects and disconnects
with DysonMqttClient(config) as client:
client.publish("475/device/command", '{"command": "status"}')
messages = client.get_messages()
Using Callbacks
For real-time message processing:
def on_message(message):
print(f"Received: {message.topic} -> {message.payload_str}")
def on_connection_change(connected, error):
if connected:
print("Connected to device!")
else:
print(f"Connection lost: {error}")
client = DysonMqttClient(config)
client.set_message_callback(on_message)
client.set_connection_callback(on_connection_change)
client.connect()
# Messages will now be processed in real-time via callbacks
API Reference
ConnectionConfig
Configuration class for MQTT connection:
host: IPv4 address or IPv6 .local DNS addressmqtt_username: MQTT usernamemqtt_password: MQTT passwordmqtt_topics: List of topics to subscribe toport: MQTT port (default: 1883)keepalive: Keep-alive interval in seconds (default: 60)client_id: Optional custom client ID
DysonMqttClient
Main client class for MQTT communication:
Methods
connect(): Connect to MQTT broker (non-blocking)disconnect(): Disconnect from brokerpublish(topic, payload, qos=2, retain=False): Publish messageget_messages(clear_queue=True): Get queued messagesset_message_callback(callback): Set message received callbackset_connection_callback(callback): Set connection status callbackis_connected(): Check connection statusget_status(): Get detailed connection status
MqttMessage
Represents a received MQTT message:
topic: Message topicpayload: Raw payload bytespayload_str: Payload as UTF-8 stringqos: Quality of Service levelretain: Whether message is retainedtimestamp: When message was receivedto_dict(): Convert to dictionary
Error Handling
The library defines several exception types:
DysonMqttError: Base exceptionConnectionError: Connection issuesAuthenticationError: Authentication failuresTopicError: Topic subscription/publishing issuesClientNotConnectedError: Operations on disconnected clientCleanupError: Cleanup failures
from libdyson_mqtt.exceptions import ConnectionError, ClientNotConnectedError
try:
client.connect()
except ConnectionError as e:
print(f"Failed to connect: {e}")
try:
client.publish("test/topic", "message")
except ClientNotConnectedError:
print("Not connected to broker")
Development
Install development dependencies:
pip install -e .[dev]
Run tests:
pytest
Run type checking:
mypy src/
Format code:
black src/ tests/
isort src/ tests/
Requirements
- Python 3.9+
- paho-mqtt >= 1.6.0
License
MIT License. See LICENSE file for details.
Contributing
Contributions are welcome! Please read the contributing guidelines and submit pull requests to the main repository.
Home Assistant Integration
This library is designed to work well with Home Assistant integrations. The non-blocking design and callback system make it suitable for use in Home Assistant custom components:
# In your Home Assistant integration
import asyncio
from libdyson_mqtt import DysonMqttClient, ConnectionConfig
class DysonDevice:
def __init__(self, hass, config):
self.hass = hass
self.client = DysonMqttClient(config)
self.client.set_message_callback(self._handle_message)
def _handle_message(self, message):
# Process device status updates
self.hass.loop.call_soon_threadsafe(
self._update_state, message
)
async def _update_state(self, message):
# Update Home Assistant entity state
pass
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file libdyson_mqtt-0.1.1b2.tar.gz.
File metadata
- Download URL: libdyson_mqtt-0.1.1b2.tar.gz
- Upload date:
- Size: 12.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2119c25bab8e482ee56f1e2005e64e4a91e20243e91d4adca4857fb1d1165c1
|
|
| MD5 |
c459781859c3e321b56067612ac60162
|
|
| BLAKE2b-256 |
a61e60d19c2fe2d12597a9ac5df21b54441ce6a6d2f2b42d87fc998af05d33ec
|
Provenance
The following attestation bundles were made for libdyson_mqtt-0.1.1b2.tar.gz:
Publisher:
publish-to-pypi.yml on cmgrayb/libdyson-mqtt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
libdyson_mqtt-0.1.1b2.tar.gz -
Subject digest:
c2119c25bab8e482ee56f1e2005e64e4a91e20243e91d4adca4857fb1d1165c1 - Sigstore transparency entry: 428359825
- Sigstore integration time:
-
Permalink:
cmgrayb/libdyson-mqtt@77955f4ed1549ec3c6ef07ab8dfba7be09eea726 -
Branch / Tag:
refs/tags/v0.1.1b2 - Owner: https://github.com/cmgrayb
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@77955f4ed1549ec3c6ef07ab8dfba7be09eea726 -
Trigger Event:
release
-
Statement type:
File details
Details for the file libdyson_mqtt-0.1.1b2-py3-none-any.whl.
File metadata
- Download URL: libdyson_mqtt-0.1.1b2-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4dec88b52d0018b373888cdd1ee8e99c003f8976c978acc5420f1489f87435d
|
|
| MD5 |
f3c9623957751ad74b5cdcf22d390d42
|
|
| BLAKE2b-256 |
13fcff93e1404f1a6aaa1c7d648ebe748a7f42c0c2f2cda37d7ffb5acee5f94d
|
Provenance
The following attestation bundles were made for libdyson_mqtt-0.1.1b2-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on cmgrayb/libdyson-mqtt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
libdyson_mqtt-0.1.1b2-py3-none-any.whl -
Subject digest:
d4dec88b52d0018b373888cdd1ee8e99c003f8976c978acc5420f1489f87435d - Sigstore transparency entry: 428359827
- Sigstore integration time:
-
Permalink:
cmgrayb/libdyson-mqtt@77955f4ed1549ec3c6ef07ab8dfba7be09eea726 -
Branch / Tag:
refs/tags/v0.1.1b2 - Owner: https://github.com/cmgrayb
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@77955f4ed1549ec3c6ef07ab8dfba7be09eea726 -
Trigger Event:
release
-
Statement type: