tuanchris 2 ماه پیش
والد
کامیت
7daa206d90
2فایلهای تغییر یافته به همراه29 افزوده شده و 19 حذف شده
  1. 13 13
      main.py
  2. 16 6
      modules/mqtt/factory.py

+ 13 - 13
main.py

@@ -2055,14 +2055,14 @@ async def set_mqtt_config(request: dict):
     try:
         # Update state with new values
         state.mqtt_enabled = request.get("enabled", False)
-        state.mqtt_broker = request.get("broker", "").strip()
-        state.mqtt_port = int(request.get("port", 1883))
-        state.mqtt_username = request.get("username", "").strip()
-        state.mqtt_password = request.get("password", "").strip()
-        state.mqtt_client_id = request.get("client_id", "dune_weaver").strip()
-        state.mqtt_discovery_prefix = request.get("discovery_prefix", "homeassistant").strip()
-        state.mqtt_device_id = request.get("device_id", "dune_weaver").strip()
-        state.mqtt_device_name = request.get("device_name", "Dune Weaver").strip()
+        state.mqtt_broker = (request.get("broker") or "").strip()
+        state.mqtt_port = int(request.get("port") or 1883)
+        state.mqtt_username = (request.get("username") or "").strip()
+        state.mqtt_password = (request.get("password") or "").strip()
+        state.mqtt_client_id = (request.get("client_id") or "dune_weaver").strip()
+        state.mqtt_discovery_prefix = (request.get("discovery_prefix") or "homeassistant").strip()
+        state.mqtt_device_id = (request.get("device_id") or "dune_weaver").strip()
+        state.mqtt_device_name = (request.get("device_name") or "Dune Weaver").strip()
 
         # Validate required fields when enabled
         if state.mqtt_enabled and not state.mqtt_broker:
@@ -2096,11 +2096,11 @@ async def test_mqtt_connection(request: dict):
     """Test MQTT connection with provided settings."""
     import paho.mqtt.client as mqtt_client
 
-    broker = request.get("broker", "").strip()
-    port = int(request.get("port", 1883))
-    username = request.get("username", "").strip()
-    password = request.get("password", "").strip()
-    client_id = request.get("client_id", "dune_weaver_test").strip()
+    broker = (request.get("broker") or "").strip()
+    port = int(request.get("port") or 1883)
+    username = (request.get("username") or "").strip()
+    password = (request.get("password") or "").strip()
+    client_id = (request.get("client_id") or "dune_weaver_test").strip()
 
     if not broker:
         return JSONResponse(

+ 16 - 6
modules/mqtt/factory.py

@@ -7,27 +7,37 @@ from .base import BaseMQTTHandler
 from .handler import MQTTHandler
 from .mock import MockMQTTHandler
 from .utils import create_mqtt_callbacks
+from modules.core.state import state
 
 import logging
 
 logger = logging.getLogger(__name__)
 
-# Load environment variables
+# Load environment variables (fallback for legacy .env configuration)
 BASE_DIR = Path(__file__).resolve().parent.parent.parent  # Go up to project root
 env_path = os.path.join(BASE_DIR, '.env')
 load_dotenv(env_path)
 
 def create_mqtt_handler() -> BaseMQTTHandler:
     """Create and return an appropriate MQTT handler based on configuration.
-    
+
+    Configuration is read from state (UI settings) first, with fallback to
+    environment variables for legacy .env file support.
+
     Returns:
-        BaseMQTTHandler: Either a real MQTTHandler if MQTT_BROKER is configured,
+        BaseMQTTHandler: Either a real MQTTHandler if MQTT is enabled and configured,
                         or a MockMQTTHandler if not.
     """
+    # Check state-based configuration first (from UI settings)
+    if state.mqtt_enabled and state.mqtt_broker:
+        logger.info(f"Got MQTT configuration from state for broker: {state.mqtt_broker}, instantiating MQTTHandler")
+        return MQTTHandler(create_mqtt_callbacks())
+
+    # Fallback to environment variable for legacy support
     mqtt_broker = os.getenv('MQTT_BROKER')
     if mqtt_broker:
-        logger.info(f"Got MQTT configuration for broker: {mqtt_broker}, instantiating MQTTHandler")
+        logger.info(f"Got MQTT configuration from env for broker: {mqtt_broker}, instantiating MQTTHandler")
         return MQTTHandler(create_mqtt_callbacks())
-    
-    logger.info("MQTT Not going to be used, instantiating MockMQTTHandler")
+
+    logger.info("MQTT not enabled or not configured, instantiating MockMQTTHandler")
     return MockMQTTHandler()