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:
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -249,19 +249,30 @@ class StandaloneAutoRecorder:
|
||||
self.logger.info(f"📹 AUTO-RECORDER: Starting recording with settings - Exposure: {camera_config.exposure_ms}ms, Gain: {camera_config.gain}, FPS: {camera_config.target_fps}")
|
||||
|
||||
# Use camera manager to start recording with camera's default settings
|
||||
success = self.camera_manager.manual_start_recording(
|
||||
camera_name=camera_name,
|
||||
filename=filename,
|
||||
exposure_ms=camera_config.exposure_ms if camera_config else None,
|
||||
gain=camera_config.gain if camera_config else None,
|
||||
fps=camera_config.target_fps if camera_config else None
|
||||
)
|
||||
self.logger.info(f"📹 AUTO-RECORDER: Calling manual_start_recording for {camera_name} with filename: {filename}")
|
||||
try:
|
||||
success = self.camera_manager.manual_start_recording(
|
||||
camera_name=camera_name,
|
||||
filename=filename,
|
||||
exposure_ms=camera_config.exposure_ms if camera_config else None,
|
||||
gain=camera_config.gain if camera_config else None,
|
||||
fps=camera_config.target_fps if camera_config else None
|
||||
)
|
||||
self.logger.info(f"📹 AUTO-RECORDER: manual_start_recording returned: {success}")
|
||||
except Exception as e:
|
||||
self.logger.error(f"❌ AUTO-RECORDER: Exception calling manual_start_recording: {e}", exc_info=True)
|
||||
success = False
|
||||
|
||||
if success:
|
||||
self.logger.info(f"✅ AUTO-RECORDER: Successfully started auto-recording: {camera_name} -> {filename}")
|
||||
self.active_recordings[camera_name] = filename
|
||||
else:
|
||||
self.logger.error(f"❌ AUTO-RECORDER: Failed to start auto-recording for camera {camera_name} (manual_start_recording returned False)")
|
||||
# Check camera status for more details
|
||||
if self.state_manager:
|
||||
camera_info = self.state_manager.get_camera_status(camera_name)
|
||||
if camera_info:
|
||||
self.logger.error(f"❌ AUTO-RECORDER: Camera status - is_recording: {camera_info.is_recording}, state: {camera_info.state}")
|
||||
else:
|
||||
# Standalone mode - use own recorder
|
||||
recorder = self._get_camera_recorder(camera_name)
|
||||
|
||||
Reference in New Issue
Block a user