diff --git a/Scripts/web_server.py b/Scripts/web_server.py index 8775830..12d69d9 100644 --- a/Scripts/web_server.py +++ b/Scripts/web_server.py @@ -184,6 +184,24 @@ class TempWebServer: config['schedules'] = schedules + # ===== START: Validate all schedules ===== + for i, schedule in enumerate(schedules): + heater_temp = schedule.get('heater_target', 80.0) + ac_temp = schedule.get('ac_target', 77.0) + + if heater_temp > ac_temp: + print("❌ Schedule validation failed: Schedule {} has heater ({}) > AC ({})".format( + i+1, heater_temp, ac_temp + )) + return self._get_error_page( + "Invalid Schedule", + "Schedule {} ({}): Heater target ({:.1f}°F) cannot be greater than AC target ({:.1f}°F)".format( + i+1, schedule.get('name', 'Unnamed'), heater_temp, ac_temp + ), + sensors, ac_monitor, heater_monitor + ) + # ===== END: Validate all schedules ===== + # Save to file if self._save_config_to_file(config): print("Schedule configuration saved") @@ -224,6 +242,26 @@ class TempWebServer: # Load current config config = self._load_config() + # ===== START: Validate Heat <= AC ===== + # Get the values that will be set + new_heater_target = params.get('heater_target', config.get('heater_target', 80.0)) + new_ac_target = params.get('ac_target', config.get('ac_target', 77.0)) + + # Validation: Heater must be <= AC + if new_heater_target > new_ac_target: + print("❌ Validation failed: Heater target ({}) cannot be greater than AC target ({})".format( + new_heater_target, new_ac_target + )) + # Return error page + return self._get_error_page( + "Invalid Settings", + "Heater target ({:.1f}°F) cannot be greater than AC target ({:.1f}°F)".format( + new_heater_target, new_ac_target + ), + sensors, ac_monitor, heater_monitor + ) + # ===== END: Validate Heat <= AC ===== + # ===== START: Update AC Settings ===== if 'ac_target' in params and ac_monitor: ac_monitor.target_temp = params['ac_target'] # Update monitor @@ -630,35 +668,26 @@ class TempWebServer:
-
-
❄️
-
Air Conditioning
-
{ac_status}
-
Target: {ac_target}°F ± {ac_swing}°F
-
+
🔥
Heating System
{heater_status}
Target: {heater_target}°F ± {heater_swing}°F
+ +
+
❄️
+
Air Conditioning
+
{ac_status}
+
Target: {ac_target}°F ± {ac_swing}°F
+

⚙️ Adjust Settings

-
-
-
- - -
-
- - -
-
- +
@@ -669,6 +698,18 @@ class TempWebServer:
+ + +
+
+ + +
+
+ + +
+
@@ -724,6 +765,134 @@ class TempWebServer: import sys sys.print_exception(e) return "

Error loading page

{}
".format(str(e)) + + def _get_error_page(self, error_title, error_message, sensors, ac_monitor, heater_monitor): + """Generate error page with message.""" + # Get current temps + 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" + + inside_temp_str = "{:.1f}".format(inside_temp) if isinstance(inside_temp, float) else str(inside_temp) + outside_temp_str = "{:.1f}".format(outside_temp) if isinstance(outside_temp, float) else str(outside_temp) + + # Get current statuses + 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" + + html = """ + + + + Error - Climate Control + + + + +
+
+
❌ {error_title}
+
{error_message}
+
+ +
+
+
🏠 Inside
+
{inside_temp}°F
+
+
+
🌡️ Outside
+
{outside_temp}°F
+
+
+
🔥 Heater
+
{heater_status}
+
+
+
❄️ AC
+
{ac_status}
+
+
+ +
+ ⬅️ Go Back +
+
+ + + """.format( + error_title=error_title, + error_message=error_message, + inside_temp=inside_temp_str, + outside_temp=outside_temp_str, + heater_status=heater_status, + ac_status=ac_status + ) + + return html def _build_schedule_form(self, config): """Build the schedule editing form."""