Explorar o código

save wled ip to backend

Tuan Nguyen hai 11 meses
pai
achega
b78376c748

+ 22 - 0
dune_weaver_flask/app.py

@@ -439,6 +439,28 @@ def update_software():
             "error": error_message,
             "error": error_message,
             "details": error_log
             "details": error_log
         }), 500
         }), 500
+        
+@app.route('/set_wled_ip', methods=['POST'])
+def set_wled_ip():
+    """Save the WLED IP address to state"""
+    data = request.json
+    wled_ip = data.get("wled_ip")
+    
+    # Save to state
+    state.wled_ip = wled_ip
+    state.save()
+    logger.info(f"WLED IP updated: {wled_ip}")
+
+    return jsonify({"success": True, "wled_ip": state.wled_ip})
+
+
+@app.route('/get_wled_ip', methods=['GET'])
+def get_wled_ip():
+    """Retrieve the saved WLED IP address"""
+    if not state.wled_ip:
+        return jsonify({"success": False, "error": "No WLED IP set"}), 404
+
+    return jsonify({"success": True, "wled_ip": state.wled_ip})
 
 
 def on_exit():
 def on_exit():
     """Function to execute on application shutdown."""
     """Function to execute on application shutdown."""

+ 4 - 1
dune_weaver_flask/modules/core/state.py

@@ -32,6 +32,7 @@ class AppState:
         self.mqtt_handler = None  # Will be set by the MQTT handler
         self.mqtt_handler = None  # Will be set by the MQTT handler
         self.conn = None
         self.conn = None
         self.port = None
         self.port = None
+        self.wled_ip = None
         self.load()
         self.load()
 
 
     @property
     @property
@@ -103,7 +104,8 @@ class AppState:
             "current_playlist": self._current_playlist,
             "current_playlist": self._current_playlist,
             "current_playlist_index": self.current_playlist_index,
             "current_playlist_index": self.current_playlist_index,
             "playlist_mode": self.playlist_mode,
             "playlist_mode": self.playlist_mode,
-            "port": self.port
+            "port": self.port,
+            "wled_ip": self.wled_ip
         }
         }
 
 
     def from_dict(self, data):
     def from_dict(self, data):
@@ -125,6 +127,7 @@ class AppState:
         self.current_playlist_index = data.get("current_playlist_index")
         self.current_playlist_index = data.get("current_playlist_index")
         self.playlist_mode = data.get("playlist_mode")
         self.playlist_mode = data.get("playlist_mode")
         self.port = data.get("port", None)
         self.port = data.get("port", None)
+        self.wled_ip = data.get('wled_ip', None)
 
 
     def save(self):
     def save(self):
         """Save the current state to a JSON file."""
         """Save the current state to a JSON file."""

+ 81 - 31
dune_weaver_flask/static/js/main.js

@@ -1711,50 +1711,100 @@ function updateWledUI() {
 
 
 }
 }
 
 
-function saveWledIp() {
+// Save or clear the WLED IP, updating both the browser and backend
+async function saveWledIp() {
     const ipInput = document.getElementById('wled_ip');
     const ipInput = document.getElementById('wled_ip');
     const saveButton = document.querySelector('.wled-settings button.cta');
     const saveButton = document.querySelector('.wled-settings button.cta');
     const currentIp = localStorage.getItem('wled_ip');
     const currentIp = localStorage.getItem('wled_ip');
-  
+
     if (currentIp) {
     if (currentIp) {
-      // Clear the saved IP if one is already set
-      localStorage.removeItem('wled_ip');
-      ipInput.disabled = false;
-      ipInput.value = '';
-      saveButton.innerHTML = '<i class="fa-solid fa-save"></i><span>Save</span>';
-      logMessage('WLED IP cleared.', LOG_TYPE.INFO);
+        // Clear the saved IP if one is already set
+        localStorage.removeItem('wled_ip');
+        ipInput.disabled = false;
+        ipInput.value = '';
+        saveButton.innerHTML = '<i class="fa-solid fa-save"></i><span>Save</span>';
+        logMessage('WLED IP cleared.', LOG_TYPE.INFO);
+
+        // Also clear the IP on the backend
+        try {
+            const response = await fetch('/set_wled_ip', {
+                method: 'POST',
+                headers: { 'Content-Type': 'application/json' },
+                body: JSON.stringify({ wled_ip: null })
+            });
+            const data = await response.json();
+            if (data.success) {
+                logMessage('Backend IP cleared successfully.', LOG_TYPE.INFO);
+            } else {
+                logMessage('Failed to clear backend IP.', LOG_TYPE.ERROR);
+            }
+        } catch (error) {
+            logMessage(`Error clearing backend IP: ${error.message}`, LOG_TYPE.ERROR);
+        }
     } else {
     } else {
-      // Validate and save the new IP
-      const ip = ipInput.value.trim();
-      if (!validateIp(ip)) {
-        logMessage('Invalid IP address format.', LOG_TYPE.ERROR);
-        return;
-      }
-      localStorage.setItem('wled_ip', ip);
-      ipInput.disabled = true;
-      saveButton.innerHTML = '<i class="fa-solid fa-xmark"></i><span>Clear</span>';
-      logMessage(`WLED IP saved: ${ip}`, LOG_TYPE.SUCCESS);
+        // Validate and save the new IP
+        const ip = ipInput.value.trim();
+        if (!validateIp(ip)) {
+            logMessage('Invalid IP address format.', LOG_TYPE.ERROR);
+            return;
+        }
+        localStorage.setItem('wled_ip', ip);
+        ipInput.disabled = true;
+        saveButton.innerHTML = '<i class="fa-solid fa-xmark"></i><span>Clear</span>';
+        logMessage(`WLED IP saved: ${ip}`, LOG_TYPE.SUCCESS);
+
+        // Also save the IP to the backend
+        try {
+            const response = await fetch('/set_wled_ip', {
+                method: 'POST',
+                headers: { 'Content-Type': 'application/json' },
+                body: JSON.stringify({ wled_ip: ip })
+            });
+            const data = await response.json();
+            if (data.success) {
+                logMessage('Backend IP saved successfully.', LOG_TYPE.SUCCESS);
+            } else {
+                logMessage('Failed to save backend IP.', LOG_TYPE.ERROR);
+            }
+        } catch (error) {
+            logMessage(`Error saving backend IP: ${error.message}`, LOG_TYPE.ERROR);
+        }
     }
     }
     
     
-    updateWledUI(); // Optionally update other parts of your UI
-  }
-  
-  function loadWledIp() {
+    updateWledUI(); // Refresh any UI elements that depend on the IP
+}
+
+// Load the WLED IP from localStorage; if not available, retrieve it from the backend
+async function loadWledIp() {
     const ipInput = document.getElementById('wled_ip');
     const ipInput = document.getElementById('wled_ip');
     const saveButton = document.querySelector('.wled-settings button.cta');
     const saveButton = document.querySelector('.wled-settings button.cta');
-    const savedIp = localStorage.getItem('wled_ip');
-  
+    let savedIp = localStorage.getItem('wled_ip');
+
+    if (!savedIp) {
+        // Attempt to load from the backend if not found in localStorage
+        try {
+            const response = await fetch('/get_wled_ip');
+            const data = await response.json();
+            if (data.wled_ip) {
+                savedIp = data.wled_ip;
+                localStorage.setItem('wled_ip', savedIp);
+            }
+        } catch (error) {
+            logMessage(`Error fetching WLED IP from backend: ${error.message}`, LOG_TYPE.ERROR);
+        }
+    }
+
     if (savedIp) {
     if (savedIp) {
-      ipInput.value = savedIp;
-      ipInput.disabled = true;
-      saveButton.innerHTML = '<i class="fa-solid fa-xmark"></i><span>Clear</span>';
+        ipInput.value = savedIp;
+        ipInput.disabled = true;
+        saveButton.innerHTML = '<i class="fa-solid fa-xmark"></i><span>Clear</span>';
     } else {
     } else {
-      ipInput.disabled = false;
-      saveButton.innerHTML = '<i class="fa-solid fa-save"></i><span>Save</span>';
+        ipInput.disabled = false;
+        saveButton.innerHTML = '<i class="fa-solid fa-save"></i><span>Save</span>';
     }
     }
     
     
-    updateWledUI(); // Update any UI segment that depends on the IP
-  }
+    updateWledUI(); // Update any dependent UI segments
+}
 
 
 function validateIp(ip) {
 function validateIp(ip) {
     const ipRegex = /^(25[0-5]|2[0-4]\d|1\d\d|\d?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|\d?\d)){3}$/;
     const ipRegex = /^(25[0-5]|2[0-4]\d|1\d\d|\d?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|\d?\d)){3}$/;