tuanchris 3 месяцев назад
Родитель
Сommit
f87f9d9f3c
5 измененных файлов с 82 добавлено и 15 удалено
  1. 59 0
      check_docker_network.sh
  2. 3 3
      main.py
  3. 4 4
      modules/core/state.py
  4. 12 4
      static/js/led-control.js
  5. 4 4
      templates/wled.html

+ 59 - 0
check_docker_network.sh

@@ -0,0 +1,59 @@
+#!/bin/bash
+# Helper script to determine how Docker should access Hyperion on the host
+
+echo "=== Docker Network Configuration Helper ==="
+echo ""
+echo "Checking your network configuration..."
+echo ""
+
+# Check if running in Docker
+if [ -f /.dockerenv ]; then
+    echo "✓ Running inside Docker container"
+    echo ""
+
+    # Show container's network info
+    echo "Container IP addresses:"
+    ip addr show | grep "inet " | grep -v 127.0.0.1
+    echo ""
+
+    # Try to find gateway
+    echo "Docker gateway (try this IP for Hyperion):"
+    ip route | grep default | awk '{print $3}'
+    echo ""
+
+    # Test if we can reach common IPs
+    echo "Testing connectivity to potential Hyperion IPs..."
+
+    for IP in "127.0.0.1" "172.17.0.1" "host.docker.internal"; do
+        echo -n "  Testing $IP:8090 ... "
+        if timeout 2 bash -c "echo > /dev/tcp/$IP/8090" 2>/dev/null; then
+            echo "✓ REACHABLE (use this!)"
+        else
+            echo "✗ Not reachable"
+        fi
+    done
+else
+    echo "✓ Running on host (not in Docker)"
+    echo ""
+
+    # Show host network info
+    echo "Host IP addresses:"
+    if command -v ip &> /dev/null; then
+        ip addr show | grep "inet " | grep -v 127.0.0.1
+    else
+        ifconfig | grep "inet " | grep -v 127.0.0.1
+    fi
+    echo ""
+
+    echo "For Docker containers to reach Hyperion on this host, use one of:"
+    echo "  1. Run container with --network host, then use: 127.0.0.1"
+    echo "  2. Use Docker gateway IP: 172.17.0.1 (most common)"
+    echo "  3. Use host's LAN IP (shown above)"
+fi
+
+echo ""
+echo "=== Recommendations ==="
+echo "If your Docker container is on Raspberry Pi:"
+echo "  • Best: Add --network host to docker run, use 127.0.0.1:8090"
+echo "  • Alternative: Use 172.17.0.1:8090 (Docker bridge gateway)"
+echo ""

+ 3 - 3
main.py

@@ -1551,9 +1551,9 @@ async def hyperion_set_effects(request: dict):
     idle_effect = request.get("idle_effect")
     playing_effect = request.get("playing_effect")
 
-    # Allow None/empty string to clear the setting
-    state.hyperion_idle_effect = idle_effect if idle_effect else None
-    state.hyperion_playing_effect = playing_effect if playing_effect else None
+    # Save effect settings - "off"/None/empty string all mean clear priority
+    state.hyperion_idle_effect = idle_effect if idle_effect else "off"
+    state.hyperion_playing_effect = playing_effect if playing_effect else "off"
 
     state.save()
     logger.info(f"Hyperion effects configured - Idle: {state.hyperion_idle_effect}, Playing: {state.hyperion_playing_effect}")

+ 4 - 4
modules/core/state.py

@@ -44,8 +44,8 @@ class AppState:
         self.hyperion_port = 8090
         self.led_provider = "none"  # "wled", "hyperion", or "none"
         self.led_controller = None
-        self.hyperion_idle_effect = "Candle"  # Effect to show when idle ("off" = clear priority)
-        self.hyperion_playing_effect = "Rainbow swirl fast"  # Effect to show when playing ("off" = clear priority)
+        self.hyperion_idle_effect = "off"  # Effect to show when idle ("off" = clear priority)
+        self.hyperion_playing_effect = "off"  # Effect to show when playing ("off" = clear priority)
         self.skip_requested = False
         self.table_type = None
         self._playlist_mode = "loop"
@@ -242,8 +242,8 @@ class AppState:
         self.hyperion_ip = data.get('hyperion_ip', None)
         self.hyperion_port = data.get('hyperion_port', 8090)
         self.led_provider = data.get('led_provider', "none")
-        self.hyperion_idle_effect = data.get('hyperion_idle_effect', "Candle")
-        self.hyperion_playing_effect = data.get('hyperion_playing_effect', "Rainbow swirl fast")
+        self.hyperion_idle_effect = data.get('hyperion_idle_effect', "off")
+        self.hyperion_playing_effect = data.get('hyperion_playing_effect', "off")
         self.app_name = data.get("app_name", "Dune Weaver")
         self.auto_play_enabled = data.get("auto_play_enabled", False)
         self.auto_play_playlist = data.get("auto_play_playlist", None)

+ 12 - 4
static/js/led-control.js

@@ -185,13 +185,13 @@ async function initializeHyperionControls() {
         }
     });
 
-    // Clear priority button
+    // Default (Off) button - clears priority
     document.getElementById('hyperion-clear-priority')?.addEventListener('click', async () => {
         try {
             await hyperionController.sendCommand('clear', {});
-            showStatus('Priority cleared - returned to default state', 'success');
+            showStatus('Returned to default state (off)', 'success');
         } catch (error) {
-            showStatus(`Failed to clear priority: ${error.message}`, 'error');
+            showStatus(`Failed to return to default: ${error.message}`, 'error');
         }
     });
 
@@ -212,7 +212,7 @@ async function initializeHyperionControls() {
 
             if (!response.ok) throw new Error(`HTTP ${response.status}`);
 
-            const result = await response.json();
+            await response.json();
             showStatus('Effect settings saved successfully', 'success');
         } catch (error) {
             showStatus(`Failed to save effect settings: ${error.message}`, 'error');
@@ -236,6 +236,14 @@ async function loadEffectsList() {
         // Clear loading option
         effectSelect.innerHTML = '<option value="">-- Select an effect --</option>';
 
+        // Add "Default (Off)" option to idle and playing effect selectors
+        if (idleEffectSelect) {
+            idleEffectSelect.innerHTML = '<option value="off">Default (Off)</option>';
+        }
+        if (playingEffectSelect) {
+            playingEffectSelect.innerHTML = '<option value="off">Default (Off)</option>';
+        }
+
         // Add effects to all dropdowns
         if (data.effects && data.effects.length > 0) {
             data.effects.forEach(effect => {

+ 4 - 4
templates/wled.html

@@ -159,7 +159,7 @@
           <div class="flex flex-col gap-2">
             <label class="text-sm font-medium text-slate-700">Idle Effect</label>
             <select id="hyperion-idle-effect" class="form-select w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 focus:outline-0 focus:ring-2 focus:ring-blue-500">
-              <option value="">Default (Clear Priority)</option>
+              <option value="">Default (Off)</option>
             </select>
           </div>
 
@@ -167,7 +167,7 @@
           <div class="flex flex-col gap-2">
             <label class="text-sm font-medium text-slate-700">Playing Effect</label>
             <select id="hyperion-playing-effect" class="form-select w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 focus:outline-0 focus:ring-2 focus:ring-blue-500">
-              <option value="">Default (Clear Priority)</option>
+              <option value="">Default (Off)</option>
             </select>
           </div>
         </div>
@@ -182,9 +182,9 @@
       <div class="flex items-center gap-4 pt-4 border-t border-slate-200">
         <button id="hyperion-clear-priority" class="flex items-center justify-center gap-2 rounded-lg bg-blue-600 px-4 py-2.5 text-sm font-semibold text-white shadow-md hover:bg-blue-700 transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-blue-400 focus:ring-offset-2">
           <span class="material-icons text-base">clear_all</span>
-          <span>Clear & Return to Default</span>
+          <span>Default (Off)</span>
         </button>
-        <p class="text-xs text-slate-500 flex-1">Clears Dune Weaver's control</p>
+        <p class="text-xs text-slate-500 flex-1">Clears Dune Weaver's control and returns to default state</p>
       </div>
     </div>
   </section>