fix: mqtt integration

- Fixed subscription format to use QOS_1 constant
- Added more detailed logging
- Set initial state to 'closed' explicitly
- Made publish_state handle both bool and str states
- Added retain flag to state messages
This commit is contained in:
Josh Finlay 2025-01-08 10:00:38 +10:00
parent 2474253efa
commit aa1b6b384d
1 changed files with 16 additions and 9 deletions

View File

@ -1,7 +1,7 @@
import os import os
import json import json
import asyncio import asyncio
from typing import Optional, Callable from typing import Optional, Callable, Union
from gmqtt import Client as MQTTClient from gmqtt import Client as MQTTClient
import logging import logging
@ -102,9 +102,10 @@ class HomeAssistantMQTT:
logger.info("Connected to MQTT broker") logger.info("Connected to MQTT broker")
self._connected = True self._connected = True
try: try:
# Subscribe to command topic # Subscribe to command topic using gmqtt's Subscription class
await self.client.subscribe([{'topic': self.command_topic, 'qos': 1}]) from gmqtt.mqtt.constants import QOS_1
logger.info(f"Subscribed to {self.command_topic}") await self.client.subscribe([(self.command_topic, QOS_1)])
logger.info(f"Subscribed to command topic: {self.command_topic}")
# Publish discovery config # Publish discovery config
config = { config = {
@ -128,17 +129,21 @@ class HomeAssistantMQTT:
) )
logger.info("Published Home Assistant discovery config") logger.info("Published Home Assistant discovery config")
# Publish initial availability # Publish initial availability and state
await self.client.publish( await self.client.publish(
self.availability_topic, self.availability_topic,
"online", "online",
qos=1, qos=1,
retain=True retain=True
) )
logger.info("Published initial availability state") logger.info("Published availability: online")
await self.publish_state("closed")
logger.info("Published initial state: closed")
except Exception as e: except Exception as e:
logger.error(f"Error in post-connect setup: {e}", exc_info=True) logger.error(f"Failed in post-connect setup: {e}", exc_info=True)
await self.client.disconnect()
async def connect(self): async def connect(self):
"""Connect to MQTT broker""" """Connect to MQTT broker"""
@ -192,9 +197,11 @@ class HomeAssistantMQTT:
except Exception as e: except Exception as e:
logger.error(f"Failed to subscribe to topic: {e}") logger.error(f"Failed to subscribe to topic: {e}")
async def publish_state(self, state: str): async def publish_state(self, state: Union[bool, str]):
"""Publish gate state""" """Publish gate state"""
await self.publish(self.state_topic, state) if isinstance(state, bool):
state = "open" if state else "closed"
await self.publish(self.state_topic, state, retain=True)
def set_command_callback(self, callback: Callable): def set_command_callback(self, callback: Callable):
"""Set callback for handling commands""" """Set callback for handling commands"""