This commit is contained in:
Mateusz Gruszczyński
2026-08-28 10:12:48 +02:00
parent eb325cc0c8
commit 556a031358
8 changed files with 65 additions and 56 deletions
+27 -1
View File
@@ -762,7 +762,16 @@ fn temporary_temperature_condition_met(zone: &Zone, session: &TemporaryQuickTher
/// Update a temperature-based temporary session from the freshly selected room sensor.
/// Returns a completion reason when ownership should be handed back immediately.
fn evaluate_temporary_quick_thermostat_condition(zone: &mut Zone, now: DateTime<Utc>) -> Option<String> {
if zone.local_thermostat_power != Some(true) { return None; }
// `activated_at` is the primary marker that a scheduled Temporary Quick Thermostat
// actually started. `local_thermostat_power == Some(true)` is retained as a legacy/
// recovery marker for sessions persisted before `activated_at` existed. A future
// scheduled session must never start or finish a temperature condition early.
let session_active = zone.temporary_quick_thermostat.as_ref().map(|session| {
session.activated_at.as_ref().map(|at| at <= &now).unwrap_or(false)
|| (zone.local_thermostat_power == Some(true) && session.started_at <= now)
}).unwrap_or(false);
if !session_active { return None; }
let met = zone.temporary_quick_thermostat.as_ref()
.filter(|session| matches!(session.finish_kind.as_str(), "temperature_reached" | "temperature_stable"))
.map(|session| temporary_temperature_condition_met(zone, session))?;
@@ -2901,6 +2910,23 @@ mod tests {
assert!(zone.temporary_quick_thermostat.as_ref().unwrap().condition_started_at.is_none());
}
#[test]
fn legacy_active_temporary_session_without_activated_at_still_evaluates_condition() {
let now = Utc::now();
let mut zone = test_zone("device");
zone.current_temperature = Some(23.0);
zone.local_thermostat_power = Some(true);
let mut session = temporary_session(now.clone());
session.activated_at = None;
session.condition_started_at = Some(now.clone() - chrono::Duration::hours(1));
zone.temporary_quick_thermostat = Some(session);
assert_eq!(
evaluate_temporary_quick_thermostat_condition(&mut zone, now),
Some("temperature_stable".into())
);
}
#[test]
fn temporary_setpoint_keeps_priority_over_active_schedule() {
let mut zone = test_zone("device");