diff --git a/Scripts/web_server.py b/Scripts/web_server.py index 0a410c4..ffadd92 100644 --- a/Scripts/web_server.py +++ b/Scripts/web_server.py @@ -2,7 +2,7 @@ import socket import time class TempWebServer: - """Simple web server for viewing temperatures.""" + """Simple web server for viewing temperatures and adjusting settings.""" def __init__(self, port=80): self.port = port self.socket = None @@ -30,8 +30,12 @@ class TempWebServer: conn.settimeout(3.0) request = conn.recv(1024).decode('utf-8') - # Generate response - response = self._get_status_page(sensors, ac_monitor, heater_monitor) + # Check if this is a POST request (form submission) + if 'POST /update' in request: + response = self._handle_update(request, sensors, ac_monitor, heater_monitor) + else: + # Regular GET request + response = self._get_status_page(sensors, ac_monitor, heater_monitor) conn.send('HTTP/1.1 200 OK\r\n') conn.send('Content-Type: text/html; charset=utf-8\r\n') @@ -43,7 +47,55 @@ class TempWebServer: except Exception as e: print(f"Web server error: {e}") - def _get_status_page(self, sensors, ac_monitor, heater_monitor): + def _handle_update(self, request, sensors, ac_monitor, heater_monitor): + """Handle form submission and update settings.""" + try: + # Extract form data from POST body + body = request.split('\r\n\r\n')[1] if '\r\n\r\n' in request else '' + params = {} + + for pair in body.split('&'): + if '=' in pair: + key, value = pair.split('=', 1) + params[key] = float(value) + + # Update AC settings + if 'ac_target' in params and ac_monitor: + ac_monitor.target_temp = params['ac_target'] + print(f"AC target updated to {params['ac_target']}°F") + + if 'ac_swing' in params and ac_monitor: + ac_monitor.temp_swing = params['ac_swing'] + print(f"AC swing updated to {params['ac_swing']}°F") + + # Update heater settings + if 'heater_target' in params and heater_monitor: + heater_monitor.target_temp = params['heater_target'] + print("Heater target updated to {}°F".format(params['heater_target'])) + + if 'heater_swing' in params and heater_monitor: + heater_monitor.temp_swing = params['heater_swing'] + print("Heater swing updated to {}°F".format(params['heater_swing'])) + + # Send Discord notification + from scripts.discord_webhook import send_discord_message + ac_target_str = str(params.get('ac_target', 'N/A')) + ac_swing_str = str(params.get('ac_swing', 'N/A')) + heater_target_str = str(params.get('heater_target', 'N/A')) + heater_swing_str = str(params.get('heater_swing', 'N/A')) + + message = "Settings Updated - AC: {}F +/- {}F | Heater: {}F +/- {}F".format( + ac_target_str, ac_swing_str, heater_target_str, heater_swing_str + ) + send_discord_message(message) + + except Exception as e: + print("Error updating settings: {}".format(e)) + + # Return updated page + return self._get_status_page(sensors, ac_monitor, heater_monitor, show_success=True) + + def _get_status_page(self, sensors, ac_monitor, heater_monitor, show_success=False): """Generate HTML status page.""" # Get current temperatures inside_temps = sensors['inside'].read_all_temps(unit='F') @@ -60,13 +112,20 @@ class TempWebServer: current_time = time.localtime() time_str = f"{current_time[0]}-{current_time[1]:02d}-{current_time[2]:02d} {current_time[3]:02d}:{current_time[4]:02d}:{current_time[5]:02d}" + # Success message + success_html = """ +
+ ✅ Settings updated successfully! +
+ """ if show_success else "" + html = """ 🌱 Auto Garden - +

🌱 Auto Garden Dashboard

+ {success_message} +
🏠
@@ -242,15 +369,48 @@ class TempWebServer:
Target: {heater_target}°F ± {heater_swing}°F
+ +
+

⚙️ Adjust Settings

+ +
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+ +
+ +
+
""".format( + success_message=success_html, inside_temp=f"{inside_temp:.1f}" if isinstance(inside_temp, float) else inside_temp, outside_temp=f"{outside_temp:.1f}" if isinstance(outside_temp, float) else outside_temp, ac_status=ac_status,