diff --git a/Scripts/web_server.py b/Scripts/web_server.py new file mode 100644 index 0000000..a8a144a --- /dev/null +++ b/Scripts/web_server.py @@ -0,0 +1,188 @@ +import socket +import time + +class TempWebServer: + """Simple web server for viewing temperatures.""" + def __init__(self, port=80): + self.port = port + self.socket = None + self.sensors = {} + + def start(self): + """Start the web server (non-blocking).""" + try: + self.socket = socket.socket() + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.socket.bind(('0.0.0.0', self.port)) + self.socket.listen(1) + self.socket.setblocking(False) # Non-blocking mode + print(f"Web server started on port {self.port}") + except Exception as e: + print(f"Failed to start web server: {e}") + + def check_requests(self, sensors, ac_monitor=None, heater_monitor=None): + """Check for incoming requests (call in main loop).""" + if not self.socket: + return + + try: + conn, addr = self.socket.accept() + conn.settimeout(3.0) + request = conn.recv(1024).decode('utf-8') + + # Generate response + 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\r\n') + conn.send('Connection: close\r\n\r\n') + conn.sendall(response) + conn.close() + except OSError: + pass # No connection, continue + except Exception as e: + print(f"Web server error: {e}") + + def _get_status_page(self, sensors, ac_monitor, heater_monitor): + """Generate HTML status page.""" + # Get current temperatures + inside_temps = sensors['inside'].read_all_temps(unit='F') + outside_temps = sensors['outside'].read_all_temps(unit='F') + + inside_temp = list(inside_temps.values())[0] if inside_temps else "N/A" + outside_temp = list(outside_temps.values())[0] if outside_temps else "N/A" + + # Get AC/Heater status + ac_status = "ON" if ac_monitor and ac_monitor.ac.get_state() else "OFF" + heater_status = "ON" if heater_monitor and heater_monitor.heater.get_state() else "OFF" + + # Get current time + 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}" + + html = """ + + + + Auto Garden Status + + + + + +

🌱 Auto Garden Status

+ +
+
Inside Temperature
+
{inside_temp}°F
+
+ +
+
Outside Temperature
+
{outside_temp}°F
+
+ +
+
+
+
❄️ Air Conditioning
+
{ac_status}
+
Target: {ac_target}°F ± {ac_swing}°F
+
+
+
🔥 Heater
+
{heater_status}
+
Target: {heater_target}°F ± {heater_swing}°F
+
+
+
+ + + + + """.format( + 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, + ac_class="on" if ac_status == "ON" else "off", + heater_status=heater_status, + heater_class="on" if heater_status == "ON" else "off", + ac_target=ac_monitor.target_temp if ac_monitor else "N/A", + ac_swing=ac_monitor.temp_swing if ac_monitor else "N/A", + heater_target=heater_monitor.target_temp if heater_monitor else "N/A", + heater_swing=heater_monitor.temp_swing if heater_monitor else "N/A", + time=time_str + ) + return html \ No newline at end of file