From abfbf0dd68abd7ff0f223531de384010fd8d9784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 23 Sep 2026 10:12:46 +0200 Subject: [PATCH] v0.15.19 --- FILE_MANIFEST.sha256 | 8 ++++---- SOURCE_MANIFEST.sha256 | 6 +++--- .../repository/gree-controller/CHANGELOG.md | 1 - src/engine/automations.rs | 18 +++--------------- src/engine/tests.rs | 11 ----------- 5 files changed, 10 insertions(+), 34 deletions(-) diff --git a/FILE_MANIFEST.sha256 b/FILE_MANIFEST.sha256 index 9906928..a8e785e 100644 --- a/FILE_MANIFEST.sha256 +++ b/FILE_MANIFEST.sha256 @@ -4,7 +4,7 @@ a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore ab2b0e10ea3a02b56d689f994bd89fa71a61eff49306995e725f7104c122b53d ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE 98217f563d7ed22f8e36a8092cfb3fdba7efe217fea543f7edae4a836a38baab ./README.md -728f6fcd1b76c4125252ed17e2cc3bef21b4e8d4939879e2fd9744fbcdbeceeb ./SOURCE_MANIFEST.sha256 +135b04a5acf661be25afe52c7a6a7826cf24a892398e3a28d9c77503272562d5 ./SOURCE_MANIFEST.sha256 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs 41e1b38bb5378e1fbcf59e2a956008eea2b3141cfef102c72cf88d28f5f4cf65 ./docs/API.md 94585aab43325a139f6c291f2293d93206d382c25a095b46930b924aaf336765 ./docs/FLOW.md @@ -30,7 +30,7 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json 50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json -5f394912d8891101722e968af47f8c2a82e17287d01cd3987952b3c7311a0d23 ./ha-addon/repository/gree-controller/CHANGELOG.md +fb9543f96b5f2cc6d464f102209c2fc1953e90f42a70ddf9610f70f0cea66b16 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md aa4f0fea858a37cb5d0611cfe7791a09ba6dafed44fbd725f0236e6b9a9da086 ./ha-addon/repository/gree-controller/README.md 539c6da3413640b4f468ae1f9884d4781342ed0bf3b75dd8342c6c8c4df6c406 ./ha-addon/repository/gree-controller/config.yaml @@ -136,7 +136,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs -969e4079cb9990c15b3366a99b68975de6466a5e11bbc54ab0405a863049f6b4 ./src/engine/automations.rs +e39d0bbc4c1dda7c5538b2c2abdbad7923e56f40ad7a9788c8dbd338244f2c41 ./src/engine/automations.rs 1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs 357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs 828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs @@ -152,7 +152,7 @@ c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/r b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs 682c8b3956c657b655746cbd19ee97ee2f4cf953bc9de67d6d70a1b14f3dd746 ./src/engine/temperature.rs 833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs -9f15d890cb8fc0ccceba4d59b411a355503fcc269cfe6315e6bb0cc287759038 ./src/engine/tests.rs +0d4f2df3c3881aceb41b9f8d78adde7ecbb5b39d2f8aea444b865166a0670dec ./src/engine/tests.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs 87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs diff --git a/SOURCE_MANIFEST.sha256 b/SOURCE_MANIFEST.sha256 index 143cbd5..9d1b0e1 100644 --- a/SOURCE_MANIFEST.sha256 +++ b/SOURCE_MANIFEST.sha256 @@ -29,7 +29,7 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json 50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json -5f394912d8891101722e968af47f8c2a82e17287d01cd3987952b3c7311a0d23 ./ha-addon/repository/gree-controller/CHANGELOG.md +fb9543f96b5f2cc6d464f102209c2fc1953e90f42a70ddf9610f70f0cea66b16 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md aa4f0fea858a37cb5d0611cfe7791a09ba6dafed44fbd725f0236e6b9a9da086 ./ha-addon/repository/gree-controller/README.md 539c6da3413640b4f468ae1f9884d4781342ed0bf3b75dd8342c6c8c4df6c406 ./ha-addon/repository/gree-controller/config.yaml @@ -135,7 +135,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs -969e4079cb9990c15b3366a99b68975de6466a5e11bbc54ab0405a863049f6b4 ./src/engine/automations.rs +e39d0bbc4c1dda7c5538b2c2abdbad7923e56f40ad7a9788c8dbd338244f2c41 ./src/engine/automations.rs 1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs 357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs 828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs @@ -151,7 +151,7 @@ c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/r b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs 682c8b3956c657b655746cbd19ee97ee2f4cf953bc9de67d6d70a1b14f3dd746 ./src/engine/temperature.rs 833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs -9f15d890cb8fc0ccceba4d59b411a355503fcc269cfe6315e6bb0cc287759038 ./src/engine/tests.rs +0d4f2df3c3881aceb41b9f8d78adde7ecbb5b39d2f8aea444b865166a0670dec ./src/engine/tests.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs 87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs diff --git a/ha-addon/repository/gree-controller/CHANGELOG.md b/ha-addon/repository/gree-controller/CHANGELOG.md index f365d2f..045f661 100644 --- a/ha-addon/repository/gree-controller/CHANGELOG.md +++ b/ha-addon/repository/gree-controller/CHANGELOG.md @@ -4,7 +4,6 @@ - Fixes Visual Flow `zone_thermostat` OFF semantics: `power=false` now powers the assigned unit off without setting the persistent Zone `enabled` flag to false. - Keeps the Zone available for subsequent Flow/schedule evaluation after an OFF action while preserving the existing explicit physical OFF command and ownership checks. -- Preserves backward-compatible `power=true` recovery of Zones left disabled by older Flow executions. ## 0.15.18 diff --git a/src/engine/automations.rs b/src/engine/automations.rs index 52b45d1..1f539cf 100644 --- a/src/engine/automations.rs +++ b/src/engine/automations.rs @@ -909,14 +909,6 @@ fn flow_condition_kind_runtime(kind: &str) -> bool { ) } -fn apply_flow_zone_power_enabled_state(zone: &mut Zone, power: Option) { - // OFF controls the thermostat/unit runtime only. It must not disable the administrative Zone. - // Keep the historical ON recovery so installations affected by the old OFF behavior can heal. - if power == Some(true) { - zone.enabled = true; - } -} - async fn apply_flow_zone_action(state: &AppState, zone_id: &str, preset: Option<&str>, action: &DeviceCommand) -> Result { let _schedule_guard = state.lock_schedule_operation().await; // Match the canonical thermostat ordering used by Web/HA zone control. This prevents @@ -925,14 +917,10 @@ async fn apply_flow_zone_action(state: &AppState, zone_id: &str, preset: Option< let _zone_guard = state.lock_zone_operation(zone_id).await; let Some(mut zone) = state.db.get_zone(zone_id)? else { return Err(AppError::NotFound(format!("zone {zone_id}"))); }; if zone.device_manual_override || zone.local_thermostat_power.is_some() || temporary_quick_thermostat_is_active(&zone, Utc::now()) { return Ok(false); } - // Match the existing automatic-device ownership semantics: a disabled thermostat zone - // remains an explicit gate unless this Flow action is the actor re-enabling it. - if !zone.enabled && action.power != Some(true) { return Ok(false); } + // A disabled Zone is an administrative gate for every Flow thermostat action. + // Flow power commands control only the assigned unit runtime; they never change zone.enabled. + if !zone.enabled { return Ok(false); } let device_id = zone.device_id.clone(); - // Flow thermostat OFF is a runtime climate command, not the persistent administrative - // Zone enabled/disabled switch. Keep the zone enabled so later Flow/schedule evaluation can - // continue normally. - apply_flow_zone_power_enabled_state(&mut zone, action.power); if let Some(mode) = action.mode.as_deref() { match mode { "auto" => zone.inherit_house_mode = true, "heat" | "cool" => { zone.mode = mode.to_string(); zone.inherit_house_mode = false; }, _ => return Err(AppError::BadRequest("unsupported Flow thermostat mode".into())) } } diff --git a/src/engine/tests.rs b/src/engine/tests.rs index 3f49321..6d59cae 100644 --- a/src/engine/tests.rs +++ b/src/engine/tests.rs @@ -525,17 +525,6 @@ mod tests { } } - #[test] - fn flow_thermostat_off_keeps_zone_enabled() { - let mut zone = test_zone("device"); - apply_flow_zone_power_enabled_state(&mut zone, Some(false)); - assert!(zone.enabled); - - zone.enabled = false; - apply_flow_zone_power_enabled_state(&mut zone, Some(true)); - assert!(zone.enabled); - } - #[test] fn regulator_zone_event_dedup_ignores_only_updated_at_heartbeat() { let zone = test_zone("device");