v0.8.5
This commit is contained in:
+27
-1
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user