Add MQTT publish request and response models, and implement publish route

- Introduced MQTTPublishRequest and MQTTPublishResponse models for handling MQTT message publishing.
- Implemented a new POST route for publishing MQTT messages, including error handling and logging.
- Enhanced the StandaloneAutoRecorder with improved logging during manual recording start.
- Updated the frontend to include an MQTT Debug Panel for better monitoring and debugging capabilities.
This commit is contained in:
salirezav
2025-12-01 13:07:36 -05:00
parent 5070d9b2ca
commit 73849b40a8
11 changed files with 950 additions and 19 deletions

View File

@@ -334,3 +334,21 @@ class SuccessResponse(BaseModel):
message: str
data: Optional[Dict[str, Any]] = None
timestamp: str = Field(default_factory=lambda: datetime.now().isoformat())
class MQTTPublishRequest(BaseModel):
"""MQTT publish request model"""
topic: str = Field(..., description="MQTT topic to publish to")
payload: str = Field(..., description="Message payload")
qos: int = Field(default=0, ge=0, le=2, description="Quality of Service level (0-2)")
retain: bool = Field(default=False, description="Whether to retain the message")
class MQTTPublishResponse(BaseModel):
"""MQTT publish response model"""
success: bool
message: str
topic: str
payload: str

View File

@@ -7,7 +7,7 @@ from typing import Dict
from fastapi import FastAPI, HTTPException, Query
from ...core.state_manager import StateManager
from ...mqtt.client import MQTTClient
from ..models import MQTTStatusResponse, MQTTEventsHistoryResponse, MQTTEventResponse
from ..models import MQTTStatusResponse, MQTTEventsHistoryResponse, MQTTEventResponse, MQTTPublishRequest, MQTTPublishResponse
def register_mqtt_routes(
@@ -70,3 +70,33 @@ def register_mqtt_routes(
logger.error(f"Error getting MQTT events: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/mqtt/publish", response_model=MQTTPublishResponse)
async def publish_mqtt_message(request: MQTTPublishRequest):
"""Publish an MQTT message (for testing/debugging)"""
try:
if not mqtt_client.is_connected():
raise HTTPException(status_code=503, detail="MQTT client is not connected")
success = mqtt_client.publish_message(
topic=request.topic,
payload=request.payload,
qos=request.qos,
retain=request.retain
)
if success:
logger.info(f"Published MQTT message: {request.topic} -> {request.payload}")
return MQTTPublishResponse(
success=True,
message=f"Message published successfully to {request.topic}",
topic=request.topic,
payload=request.payload
)
else:
raise HTTPException(status_code=500, detail="Failed to publish MQTT message")
except HTTPException:
raise
except Exception as e:
logger.error(f"Error publishing MQTT message: {e}")
raise HTTPException(status_code=500, detail=str(e))