{"id":31044820,"url":"https://github.com/legout/flowerpower-mqtt","last_synced_at":"2025-09-14T16:51:57.063Z","repository":{"id":312320021,"uuid":"1047022491","full_name":"legout/flowerpower-mqtt","owner":"legout","description":"MQTT Plugin for FlowerPower","archived":false,"fork":false,"pushed_at":"2025-09-01T15:43:43.000Z","size":1314,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-08T15:09:16.140Z","etag":null,"topics":["data-pipeline","flowepower","iot","mqtt","rq"],"latest_commit_sha":null,"homepage":"https://legout.github.io/flowerpower-mqtt/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/legout.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-29T15:59:40.000Z","updated_at":"2025-09-01T21:44:52.000Z","dependencies_parsed_at":"2025-08-29T21:01:42.783Z","dependency_job_id":"f3b9a03b-4044-4f84-af70-ff9823251ff4","html_url":"https://github.com/legout/flowerpower-mqtt","commit_stats":null,"previous_names":["legout/flowerpower-mqtt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/legout/flowerpower-mqtt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/legout%2Fflowerpower-mqtt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/legout%2Fflowerpower-mqtt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/legout%2Fflowerpower-mqtt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/legout%2Fflowerpower-mqtt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/legout","download_url":"https://codeload.github.com/legout/flowerpower-mqtt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/legout%2Fflowerpower-mqtt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275136699,"owners_count":25411709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-14T02:00:10.474Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-pipeline","flowepower","iot","mqtt","rq"],"created_at":"2025-09-14T16:51:51.646Z","updated_at":"2025-09-14T16:51:57.052Z","avatar_url":"https://github.com/legout.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FlowerPower MQTT Plugin\n\nA simple yet powerful MQTT plugin for [FlowerPower](https://github.com/legout/flowerpower) that triggers pipeline execution when messages arrive on subscribed topics. Features configurable QoS levels, optional RQ job queue integration for asynchronous processing, and a beautiful CLI for easy management.\n\n## Features\n\n### Core Features\n- **Simple API**: Easy-to-use interface for connecting, subscribing, and listening\n- **QoS Support**: Full MQTT QoS support (0, 1, 2) for reliable message delivery\n- **Async Processing**: Optional RQ job queue integration for background pipeline execution\n- **High Performance**: Uses msgspec for fast serialization and deserialization\n- **Flexible Payload Handling**: Supports JSON, YAML, MessagePack, Pickle, Protobuf, and PyArrow IPC payload serialization/deserialization with auto-detection.\n- **Multiple Execution Modes**: \n  - `sync`: Direct pipeline execution (blocking)\n  - `async`: Background execution via RQ\n  - `mixed`: QoS-based routing (QoS 2 → sync, QoS 0/1 → async)\n- **Topic Wildcards**: Support for MQTT topic patterns (`+`, `#`)\n- **Graceful Shutdown**: Ctrl+C handling and proper cleanup\n- **Statistics \u0026 Monitoring**: Built-in metrics and job tracking\n- **Configuration Management**: YAML-based configuration support with msgspec validation\n- **Automatic Reconnection**: Robust connection handling with configurable retry attempts and exponential backoff\n\n### CLI Features\n- **Beautiful Interface**: Rich, colorful CLI with tables and progress bars\n- **Interactive Configuration**: Step-by-step configuration setup\n- **Real-time Monitoring**: Live statistics and subscription monitoring\n- **Configuration Management**: Create, validate, edit, and show configurations\n- **Job Queue Management**: Monitor and manage RQ workers and jobs\n- **Shell Completion**: Auto-completion support for commands and options\n- **JSON Output**: Machine-readable output for scripting and automation\n\n## Installation\n\n`flowerpower-mqtt` is available on PyPI and can be installed using `uv pip` (recommended) or `pip`.\n\n### Using `uv pip` (Recommended)\n\n`uv` is a fast Python package installer and resolver. It's the recommended way to install `flowerpower-mqtt`.\n\n```bash\nuv pip install flowerpower-mqtt\n```\n\n### Using `pip`\n\nIf you prefer using `pip`, you can install `flowerpower-mqtt` directly:\n\n```bash\npip install flowerpower-mqtt\n```\n\nAfter installation, the `flowerpower-mqtt` CLI command will be available.\n\n## Quick Start\n\n### CLI Quick Start\n\nThe fastest way to get started is using the CLI:\n\n```bash\n# 1. Create configuration interactively\nflowerpower-mqtt config create --interactive\n\n# 2. Connect to MQTT broker\nflowerpower-mqtt connect --config mqtt_config.yml\n\n# 3. Subscribe to topics\nflowerpower-mqtt subscribe \"sensors/+/temperature\" temperature_processor --qos 1\n\n# 4. Start listening (press Ctrl+C to stop)\nflowerpower-mqtt listen\n```\n\nFor async processing with job queue:\n\n```bash\n# 1. Create config with job queue enabled\nflowerpower-mqtt config create --interactive --job-queue\n\n# 2. Start RQ worker (in separate terminal)\nrq worker mqtt_pipelines --url redis://localhost:6379\n\n# 3. Connect and subscribe with async mode\nflowerpower-mqtt connect --config mqtt_config.yml\nflowerpower-mqtt subscribe \"data/+\" data_processor --qos 1 --mode async\n\n# 4. Start listening and monitor\nflowerpower-mqtt listen --background \u0026\nflowerpower-mqtt monitor --interval 5\n```\n\n### Programmatic Usage\n\n### 1. Basic Synchronous Usage\n\n```python\nimport asyncio\nfrom flowerpower_mqtt import MQTTPlugin\n\nasync def main():\n    # Create plugin instance\n    mqtt = MQTTPlugin(\n        broker=\"localhost\",\n        base_dir=\"/path/to/flowerpower/project\"\n    )\n    \n    # Connect to broker\n    await mqtt.connect()\n    \n    # Subscribe to topic\n    await mqtt.subscribe(\"sensors/temperature\", \"temperature_pipeline\", qos=1)\n    \n    # Start listening (blocks until Ctrl+C)\n    await mqtt.start_listener()\n\n# Run the plugin\nasyncio.run(main())\n```\n\n### 2. Asynchronous with Job Queue\n\n```python\nimport asyncio\nfrom flowerpower_mqtt import MQTTPlugin\n\nasync def main():\n    # Create plugin with RQ job queue enabled\n    mqtt = MQTTPlugin(\n        broker=\"mqtt.example.com\",\n        base_dir=\"/path/to/flowerpower/project\",\n        use_job_queue=True,\n        redis_url=\"redis://localhost:6379\"\n    )\n    \n    await mqtt.connect()\n    \n    # Subscribe with async execution\n    await mqtt.subscribe(\"sensors/+/data\", \"sensor_processor\", qos=1, execution_mode=\"async\")\n    await mqtt.subscribe(\"alerts/critical\", \"alert_handler\", qos=2, execution_mode=\"sync\")\n    \n    # Start listener in background\n    await mqtt.start_listener(background=True)\n    \n    # Do other work...\n    await asyncio.sleep(60)\n    \n    # Stop gracefully\n    await mqtt.stop_listener()\n\nasyncio.run(main())\n```\n\n### 3. Using Configuration File\n\nCreate `mqtt_config.yml`:\n\n```yaml\nmqtt:\n  broker: \"mqtt.example.com\"\n  port: 1883\n  keepalive: 60\n  client_id: \"flowerpower_mqtt_client\"\n  reconnect_retries: 5\n  reconnect_delay: 5\n\nsubscriptions:\n  - topic: \"sensors/+/temperature\"\n    pipeline: \"temperature_processor\"\n    qos: 1\n    execution_mode: \"async\"\n  - topic: \"alerts/critical\"\n    pipeline: \"alert_handler\"\n    qos: 2\n    execution_mode: \"sync\"\n\njob_queue:\n  enabled: true\n  type: \"rq\"\n  redis_url: \"redis://localhost:6379\"\n  queue_name: \"mqtt_pipelines\"\n  worker_count: 4\n\nbase_dir: \"/path/to/flowerpower/project\"\nlog_level: \"INFO\"\n```\n\nThen use it:\n\n```python\nimport asyncio\nfrom flowerpower_mqtt import MQTTPlugin\n\nasync def main():\n    # Load from configuration\n    mqtt = MQTTPlugin.from_config(\"mqtt_config.yml\")\n    \n    await mqtt.connect()\n    await mqtt.start_listener()\n\nasyncio.run(main())\n```\n\n## CLI Reference\n\nThe FlowerPower MQTT CLI provides a comprehensive interface for managing MQTT connections, subscriptions, and monitoring.\n\n### Configuration Management\n\n```bash\n# Create configuration interactively\nflowerpower-mqtt config create --interactive\n\n# Create configuration with job queue enabled\nflowerpower-mqtt config create --job-queue --output my_config.yml\n\n# Validate configuration file\nflowerpower-mqtt config validate mqtt_config.yml\n\n# Show current configuration\nflowerpower-mqtt config show\n\n# Edit configuration (opens in $EDITOR)\nflowerpower-mqtt config edit\n```\n\n### Connection Management\n\n```bash\n# Connect to MQTT broker\nflowerpower-mqtt connect --broker localhost --port 1883\n\n# Connect with job queue enabled\nflowerpower-mqtt connect --broker mqtt.example.com --job-queue --redis-url redis://localhost:6379\n\n# Connect using configuration file\nflowerpower-mqtt connect --config mqtt_config.yml\n\n# Disconnect from broker\nflowerpower-mqtt disconnect\n```\n\n### Subscription Management\n\n```bash\n# Subscribe to topic\nflowerpower-mqtt subscribe \"sensors/temperature\" temp_processor --qos 1\n\n# Subscribe with async execution\nflowerpower-mqtt subscribe \"data/+/events\" event_processor --qos 1 --mode async\n\n# Subscribe with mixed mode (QoS-based routing)\nflowerpower-mqtt subscribe \"mixed/data\" mixed_processor --qos 2 --mode mixed\n\n# List all subscriptions\nflowerpower-mqtt list-subscriptions\n\n# List only active subscriptions\nflowerpower-mqtt list-subscriptions --active\n\n# Unsubscribe from topic\nflowerpower-mqtt unsubscribe \"sensors/temperature\"\n```\n\n### Listening and Monitoring\n\n```bash\n# Start listening (blocks until Ctrl+C)\nflowerpower-mqtt listen\n\n# Start listening in background\nflowerpower-mqtt listen --background\n\n# Start with execution mode override\nflowerpower-mqtt listen --override-mode async\n\n# Start with timeout\nflowerpower-mqtt listen --timeout 300\n\n# Show current status\nflowerpower-mqtt status\n\n# Show status as JSON\nflowerpower-mqtt status --json\n\n# Real-time monitoring\nflowerpower-mqtt monitor --interval 5\n\n# Monitor for specific duration\nflowerpower-mqtt monitor --interval 10 --duration 300\n```\n\n### Job Queue Management\n\n```bash\n# Check job queue status\nflowerpower-mqtt jobs status\n\n# Start RQ worker (shows command to run)\nflowerpower-mqtt jobs worker start --count 2\n\n# Check worker status\nflowerpower-mqtt jobs worker status\n```\n\n### Common CLI Workflows\n\n#### Development Workflow\n```bash\n# 1. Create and validate configuration\nflowerpower-mqtt config create --interactive\nflowerpower-mqtt config validate mqtt_config.yml\n\n# 2. Quick testing\nflowerpower-mqtt connect\nflowerpower-mqtt subscribe \"test/+\" test_pipeline --qos 0\nflowerpower-mqtt listen --timeout 60\n\n# 3. Real-time monitoring\nflowerpower-mqtt monitor --interval 5\n```\n\n#### Production Workflow\n```bash\n# 1. Load from version-controlled config\nflowerpower-mqtt config validate production_config.yml\nflowerpower-mqtt connect --config production_config.yml\n\n# 2. Start with job queue\nrq worker mqtt_pipelines --url redis://localhost:6379 \u0026\nflowerpower-mqtt listen --background --override-mode async\n\n# 3. Monitor operations\nflowerpower-mqtt monitor --json \u003e monitoring.log \u0026\nflowerpower-mqtt jobs status\n```\n\n### CLI Tips\n\n- Use `--json` flag for machine-readable output in scripts\n- Configuration files can be version controlled and shared\n- Use `--save-config` to persist CLI-created subscriptions\n- The CLI supports shell completion (enable with your shell)\n- Use `flowerpower-mqtt --help` to see all available commands\n- Each command has detailed help: `flowerpower-mqtt connect --help`\n\n## Documentation\n\nFor comprehensive and detailed information about FlowerPower MQTT, including advanced topics, API references, and in-depth usage guides, please refer to our [Full Documentation](https://legout.github.io/flowerpower-mqtt/).\n\nOur documentation has been recently reorganized to provide a more user-friendly navigation structure, making it easier to find the information you need.\n\n## Usage Patterns\n\n### QoS Levels\n\nChoose the appropriate QoS level based on your use case:\n\n```python\n# QoS 0: Fire-and-forget (best for high-volume, non-critical data)\nawait mqtt.subscribe(\"logs/debug\", \"log_processor\", qos=0)\n\n# QoS 1: At-least-once delivery (good for important events)\nawait mqtt.subscribe(\"sensors/data\", \"data_processor\", qos=1)\n\n# QoS 2: Exactly-once delivery (critical business processes)\nawait mqtt.subscribe(\"payments/completed\", \"payment_processor\", qos=2)\n```\n\n### Execution Modes\n\n```python\n# Synchronous: Direct execution (blocking)\nawait mqtt.subscribe(\"critical/alerts\", \"alert_handler\", execution_mode=\"sync\")\n\n# Asynchronous: Background execution via RQ\nawait mqtt.subscribe(\"batch/data\", \"batch_processor\", execution_mode=\"async\")\n\n# Mixed: QoS-based routing\nawait mqtt.subscribe(\"mixed/topic\", \"mixed_pipeline\", execution_mode=\"mixed\")\n\n### Payload Deserialization\n\nSpecify how incoming MQTT message payloads should be deserialized:\n\n```python\n# JSON (default if not specified for text-based payloads)\nawait mqtt.subscribe(\"data/json\", \"json_processor\", deserialization_format=\"json\")\n\n# MessagePack\nawait mqtt.subscribe(\"data/msgpack\", \"msgpack_processor\", deserialization_format=\"msgpack\")\n\n# YAML\nawait mqtt.subscribe(\"data/yaml\", \"yaml_processor\", deserialization_format=\"yaml\")\n\n# Pickle\nawait mqtt.subscribe(\"data/pickle\", \"pickle_processor\", deserialization_format=\"pickle\")\n\n# Protobuf (requires a compiled Protobuf schema)\nawait mqtt.subscribe(\"data/protobuf\", \"protobuf_processor\", deserialization_format=\"protobuf\")\n\n# PyArrow IPC (e.g., for Arrow Tables)\nawait mqtt.subscribe(\"data/arrow\", \"arrow_processor\", deserialization_format=\"pyarrow\")\n\n# Auto-detection (attempts JSON, MessagePack, YAML, PyArrow, Pickle in order)\nawait mqtt.subscribe(\"data/auto\", \"auto_processor\", deserialization_format=\"auto\")\n```\n```\n\n### Context Manager Usage\n\n```python\nasync def main():\n    async with MQTTPlugin(\"localhost\", base_dir=\".\") as mqtt:\n        await mqtt.subscribe(\"test/topic\", \"test_pipeline\")\n        await mqtt.start_listener()\n```\n\n### Bulk Subscriptions\n\n```python\nsubscriptions = [\n    {\"topic\": \"sensors/+/temperature\", \"pipeline\": \"temp_monitor\", \"qos\": 1},\n    {\"topic\": \"alerts/critical/#\", \"pipeline\": \"alert_handler\", \"qos\": 2},\n    {\"topic\": \"data/batch/+\", \"pipeline\": \"batch_processor\", \"qos\": 0}\n]\n\nawait mqtt.subscribe_bulk(subscriptions)\n```\n\n## Pipeline Integration\n\nYour FlowerPower pipelines will receive MQTT message data as input:\n\n```python\n# pipelines/sensor_processor.py\nimport pandas as pd\nfrom hamilton.function_modifiers import parameterize\n\ndef process_mqtt_message(mqtt_message: dict, mqtt_topic: str, mqtt_qos: int) -\u003e dict:\n    \"\"\"Process incoming MQTT message.\"\"\"\n    print(f\"Received message from {mqtt_topic} (QoS {mqtt_qos})\")\n    \n    # Access message payload\n    sensor_data = mqtt_message.get(\"sensor_data\", {})\n    \n    # Process the data\n    result = {\n        \"processed_at\": mqtt_message[\"execution_timestamp\"],\n        \"topic\": mqtt_topic,\n        \"temperature\": sensor_data.get(\"temperature\"),\n        \"status\": \"processed\"\n    }\n    \n    return result\n\ndef save_results(process_mqtt_message: dict) -\u003e str:\n    \"\"\"Save processing results.\"\"\"\n    # Save to database, file, etc.\n    return f\"Saved results: {process_mqtt_message['status']}\"\n```\n\n## Monitoring and Statistics\n\n```python\n# Get current subscriptions\nsubscriptions = mqtt.get_subscriptions()\nfor sub in subscriptions:\n    print(f\"Topic: {sub['topic']}, Messages: {sub['message_count']}\")\n\n# Get plugin statistics\nstats = mqtt.get_statistics()\nprint(f\"Connected: {stats['connected']}\")\nprint(f\"Message count: {stats['message_count']}\")\nprint(f\"Pipeline executions: {stats['pipeline_count']}\")\nprint(f\"Errors: {stats['error_count']}\")\n\n# Save current configuration\nmqtt.save_config(\"current_config.yml\")\n```\n\n## Job Queue Integration\n\nWhen using RQ for asynchronous processing:\n\n### Start RQ Worker\n\n```bash\n# In a separate terminal, start RQ worker\nrq worker mqtt_pipelines --url redis://localhost:6379\n```\n\n### Monitor Jobs\n\n```python\n# Job status is automatically tracked\nstats = mqtt.get_statistics()\nif \"job_queue_stats\" in stats:\n    print(f\"Queue: {stats['job_queue_stats']['queue_name']}\")\n```\n\n## Error Handling\n\nThe plugin includes comprehensive error handling:\n\n```python\nfrom flowerpower_mqtt import MQTTPlugin, ConnectionError, SubscriptionError\n\ntry:\n    mqtt = MQTTPlugin(\"invalid.broker.com\")\n    await mqtt.connect()\nexcept ConnectionError as e:\n    print(f\"Connection failed: {e}\")\n\ntry:\n    await mqtt.subscribe(\"test/topic\", \"nonexistent_pipeline\", qos=3)\nexcept SubscriptionError as e:\n    print(f\"Subscription failed: {e}\")\n```\n\n## Examples\n\nCheck the `examples/` directory for comprehensive, self-contained examples. Each example is organized in its own dedicated folder with complete setup instructions, dependencies, and runnable notebooks.\n\n### Available Examples\n\n- **`examples/basic_usage/`** - Simple synchronous MQTT message processing\n- **`examples/async_with_rq/`** - Asynchronous processing with RQ job queue\n- **`examples/config_based/`** - Configuration file management and usage\n- **`examples/monitoring/`** - Real-time statistics and monitoring\n- **`examples/multiple_qos/`** - Different QoS levels and execution modes\n- **`examples/cli_vs_programmatic/`** - CLI vs programmatic API comparison\n\n### Example Structure\n\nEach example folder contains:\n- `README.md` - Detailed setup and usage instructions\n- `pyproject.toml` - Project dependencies and configuration\n- `[example_name].py` - Original Python script\n- `[example_name].ipynb` - Interactive Jupyter notebook\n- `[example_name]_marimo.py` - Marimo notebook for reactive exploration\n\n### Quick Start with Examples\n\n```bash\n# Navigate to an example\ncd examples/basic_usage\n\n# Install dependencies\nuv pip install -e ../..\nuv pip install .\n\n# Run the example\nuv run python basic_usage.py\n\n# Or explore interactively with Jupyter\nuv run jupyter lab basic_usage.ipynb\n\n# Or use Marimo for reactive exploration\nuv run marimo run basic_usage_marimo.py\n```\n\n### Common Pipeline\n\nThe `examples/_common/pipelines/example_pipeline.py` contains a sample FlowerPower pipeline that demonstrates how to process MQTT messages within your data pipelines.\n\n## CLI vs Programmatic Usage\n\nChoose the right approach for your use case:\n\n### Use CLI When:\n- **Development \u0026 Testing**: Quick iterations and prototyping\n- **Operations**: Monitoring, troubleshooting, and administration\n- **Configuration Management**: Creating, validating, and editing configurations\n- **Simple Use Cases**: Basic MQTT message processing\n- **Learning**: Exploring features with immediate feedback\n- **Scripting**: Automation with shell scripts\n\n### Use Programmatic API When:\n- **Application Integration**: Embedding in larger applications\n- **Complex Logic**: Conditional operations and business rules\n- **Custom Monitoring**: Integration with existing dashboards\n- **Error Handling**: Advanced error handling and recovery\n- **Dynamic Behavior**: Runtime decision making\n- **Performance Critical**: Fine-tuned control over operations\n\n### Hybrid Approach (Recommended):\nUse CLI for setup and operations, programmatic API for application logic:\n\n```python\n# Use CLI-generated config in Python code\nfrom flowerpower_mqtt import MQTTPlugin\n\nplugin = MQTTPlugin.from_config(\"cli_generated_config.yml\")\n# Add custom business logic here...\n```\n\n## Requirements\n\n- Python \u003e=3.11\n- FlowerPower\n- aiomqtt \u003e=2.0.0\n- msgspec \u003e=0.18.0 (high-performance serialization)\n- typer[all] \u003e=0.9.0 (CLI framework)\n- rich \u003e=13.0.0 (beautiful CLI output)\n- Redis (for job queue functionality)\n- RQ \u003e=1.15.0 (for async processing)\n\n## Development\n\n```bash\n# Clone repository\ngit clone https://github.com/legout/flowerpower-mqtt.git\ncd flowerpower-mqtt\n\n# Install development dependencies\nuv pip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Type checking\nmypy src/\n\n# Code formatting\nblack src/\nruff check src/\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Run the test suite\n6. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Changelog\n\n### v0.2.0 (Current)\n- **Breaking Change**: Migrated from Pydantic to msgspec.Struct for 10-50x performance improvement\n- **New**: Comprehensive CLI with beautiful rich output\n- **New**: Interactive configuration creation and management\n- **New**: Real-time monitoring with rich tables and charts\n- **New**: Job queue management via CLI\n- **New**: Shell completion support\n- **New**: JSON output for scripting and automation\n- **Enhanced**: Configuration validation with detailed error messages\n- **Enhanced**: Better error handling throughout the codebase\n\n### v0.1.0\n- Initial release\n- Basic MQTT subscription and pipeline execution\n- QoS support (0, 1, 2)\n- RQ job queue integration\n- Configuration management\n- Graceful shutdown handling\n- Statistics and monitoring","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flegout%2Fflowerpower-mqtt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flegout%2Fflowerpower-mqtt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flegout%2Fflowerpower-mqtt/lists"}