diff --git a/Scripts/web_server.py b/Scripts/web_server.py index dd0e01e..b17829b 100644 --- a/Scripts/web_server.py +++ b/Scripts/web_server.py @@ -349,7 +349,11 @@ class TempWebServer: # Just fall through to schedule parsing below pass # ===== END: Handle mode actions ===== - + + # Load previous schedules to compute deltas + prev = self._load_config() + prev_schedules = prev.get('schedules', []) + # ===== START: Handle schedule configuration save ===== # DEBUG: Print what we received print("DEBUG: Received POST body parameters:") @@ -427,11 +431,34 @@ class TempWebServer: "Schedule {}: Temperature values must be numbers".format(i+1), sensors, ac_monitor, heater_monitor ) - # Auto-sync both ways - if heater_target > ac_target: - ac_target = heater_target - elif ac_target < heater_target: - heater_target = ac_target + # Sync using direction of change (no dependency on last_changed) + prev_h = None + prev_a = None + if i < len(prev_schedules): + try: + prev_h = float(prev_schedules[i].get('heater_target', heater_target)) + except: + prev_h = None + try: + prev_a = float(prev_schedules[i].get('ac_target', ac_target)) + except: + prev_a = None + delta_h = (heater_target - prev_h) if prev_h is not None else None + delta_a = (ac_target - prev_a) if prev_a is not None else None + + if ac_target < heater_target: + # AC moved down -> lower heater + if delta_a is not None and delta_a < 0 and (delta_h is None or abs(delta_h) < 1e-9): + heater_target = ac_target + # Heater moved up -> raise AC + elif delta_h is not None and delta_h > 0 and (delta_a is None or abs(delta_a) < 1e-9): + ac_target = heater_target + else: + # Fallback preference: if AC decreased more, lower heater; else raise AC + if delta_a is not None and delta_h is not None and abs(delta_a) > abs(delta_h): + heater_target = ac_target + else: + ac_target = heater_target # Create schedule entry schedule = { 'time': schedule_time, @@ -554,13 +581,28 @@ class TempWebServer: 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)) - # Auto-sync both ways - if new_heater_target > new_ac_target: - new_ac_target = new_heater_target - params['ac_target'] = new_ac_target - elif new_ac_target < new_heater_target: - new_heater_target = new_ac_target - params['heater_target'] = new_heater_target + # Use previous values to detect direction of change + old_heater = float(config.get('heater_target', new_heater_target)) + old_ac = float(config.get('ac_target', new_ac_target)) + + # If AC is below heater, sync based on the field that moved + if new_ac_target < new_heater_target: + # AC moved down: lower heater to AC + if new_ac_target < old_ac and new_heater_target == old_heater: + new_heater_target = new_ac_target + # Heater moved up: raise AC to heater + elif new_heater_target > old_heater and new_ac_target == old_ac: + new_ac_target = new_heater_target + else: + # Fallback: prefer AC drop rule, else heater raise + if new_ac_target < old_ac: + new_heater_target = new_ac_target + else: + new_ac_target = new_heater_target + + # Reflect adjusted values back to params + params['ac_target'] = new_ac_target + params['heater_target'] = new_heater_target # ===== END: Validate Heat <= AC ===== # ===== START: Update AC Settings ===== @@ -1336,7 +1378,9 @@ document.addEventListener('DOMContentLoaded', function() {{ # Hidden input to mark this schedule exists (always sent) schedule_inputs += '\n' - + # Hidden marker to record which input was changed last for this row + schedule_inputs += '\n' + schedule_inputs += '\n' schedule_inputs += '\n' schedule_inputs += '\n' @@ -1463,32 +1507,33 @@ document.addEventListener('DOMContentLoaded', function() {{ + """.format(