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; charset=utf-8\r\n') conn.send('Connection: close\r\n\r\n') conn.sendall(response.encode('utf-8')) 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

🌱 Auto Garden Dashboard

🏠
Indoor Climate
{inside_temp}°F
🌤️
Outdoor Climate
{outside_temp}°F
❄️
Air Conditioning
{ac_status}
Target: {ac_target}°F ± {ac_swing}°F
🔥
Heating System
{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