Răsfoiți Sursa

Fix DW LEDs race condition and mDNS async warning

- Fix DW LEDs not working after background homing: connect_device() was
  overwriting led_controller with None because it didn't handle "dw_leds"
  provider. Now preserves existing controller or initializes if needed.
- Use AsyncZeroconf in discover_tables() to fix blocking I/O warning
- Add frontend dist volume mount for dev without rebuild

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
tuanchris 3 săptămâni în urmă
părinte
comite
b305c777b9
3 a modificat fișierele cu 23 adăugiri și 7 ștergeri
  1. 1 0
      docker-compose.yml
  2. 16 1
      modules/connection/connection_manager.py
  3. 6 6
      modules/core/mdns.py

+ 1 - 0
docker-compose.yml

@@ -13,6 +13,7 @@ services:
     network_mode: "host" # Use host network for device access
     volumes:
       - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
+      - ./static/dist:/usr/share/nginx/html:ro  # Mount local build for dev without rebuild
     depends_on:
       - backend
     container_name: dune-weaver-frontend

+ 16 - 1
modules/connection/connection_manager.py

@@ -223,16 +223,31 @@ def device_init(homing=True):
 
 def connect_device(homing=True):
     # Initialize LED interface based on configured provider
+    # Note: DW LEDs are initialized at startup in main.py, so we preserve the existing controller
     if state.led_provider == "wled" and state.wled_ip:
         state.led_controller = LEDInterface(provider="wled", ip_address=state.wled_ip)
+    elif state.led_provider == "dw_leds":
+        # DW LEDs are already initialized in main.py at startup
+        # Only initialize here if not already set up (e.g., reconnection scenario)
+        if not state.led_controller or not state.led_controller.is_configured:
+            state.led_controller = LEDInterface(
+                provider="dw_leds",
+                num_leds=state.dw_led_num_leds,
+                gpio_pin=state.dw_led_gpio_pin,
+                pixel_order=state.dw_led_pixel_order,
+                brightness=state.dw_led_brightness / 100.0,
+                speed=state.dw_led_speed,
+                intensity=state.dw_led_intensity
+            )
     elif state.led_provider == "hyperion" and state.hyperion_ip:
         state.led_controller = LEDInterface(
             provider="hyperion",
             ip_address=state.hyperion_ip,
             port=state.hyperion_port
         )
-    else:
+    elif state.led_provider == "none" or not state.led_provider:
         state.led_controller = None
+    # For other cases (e.g., wled without IP), preserve existing controller
 
     # Show loading effect
     if state.led_controller:

+ 6 - 6
modules/core/mdns.py

@@ -177,12 +177,12 @@ class MDNSManager:
         discovered = []
 
         try:
-            # Create a temporary zeroconf instance for discovery
-            zc = Zeroconf()
+            # Create an async zeroconf instance for discovery
+            async_zc = AsyncZeroconf()
             listener = DuneWeaverServiceListener()
 
-            # Start browsing for services
-            browser = ServiceBrowser(zc, SERVICE_TYPE, listener)
+            # Start browsing for services using async browser
+            browser = AsyncServiceBrowser(async_zc.zeroconf, SERVICE_TYPE, listener)
 
             # Wait for discovery
             await asyncio.sleep(timeout)
@@ -190,9 +190,9 @@ class MDNSManager:
             # Collect results
             discovered = list(listener.discovered_tables.values())
 
-            # Cleanup
+            # Cleanup using async methods
             browser.cancel()
-            zc.close()
+            await async_zc.async_close()
 
             logger.info(f"mDNS: Discovered {len(discovered)} table(s)")