From 3b71b057cdae401e168e932a20cf88f7b431dbb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 23 Sep 2026 09:44:23 +0200 Subject: [PATCH] 0.15.19 --- Cargo.lock | 2 +- Cargo.toml | 2 +- FILE_MANIFEST.sha256 | 28 +++++++++---------- README.md | 4 +-- SOURCE_MANIFEST.sha256 | 26 ++++++++--------- docs/API.md | 6 ++-- docs/FLOW.md | 2 +- docs/openapi.json | 4 +-- .../gree_controller/manifest.json | 2 +- .../repository/gree-controller/CHANGELOG.md | 6 ++++ ha-addon/repository/gree-controller/README.md | 2 +- .../repository/gree-controller/config.yaml | 2 +- scripts/api_dev_test.py | 6 ++-- src/engine/automations.rs | 19 ++++++++++--- src/engine/tests.rs | 11 ++++++++ 15 files changed, 75 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5bc221..e2b9700 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -719,7 +719,7 @@ dependencies = [ [[package]] name = "gree-controller" -version = "0.15.18" +version = "0.15.19" dependencies = [ "aes", "aes-gcm", diff --git a/Cargo.toml b/Cargo.toml index 76933de..b9d6432 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gree-controller" -version = "0.15.18" +version = "0.15.19" edition = "2021" authors = ["GREE Controller contributors"] description = "Standalone local GREE HVAC controller with Web UI, SQLite and Home Assistant sensor support" diff --git a/FILE_MANIFEST.sha256 b/FILE_MANIFEST.sha256 index 89c9913..9906928 100644 --- a/FILE_MANIFEST.sha256 +++ b/FILE_MANIFEST.sha256 @@ -1,14 +1,14 @@ de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -dfac61e5ea474221798f0a72d6cb4d6b5a31bcd853573e14c172087c2f7e98c5 ./Cargo.lock -f8e6fa48a584d6446e6360185b0ca320379b325d62afc062e7d2efedc2b14af1 ./Cargo.toml +3b388654ec7089465c8d45a8e8a638f237955e742d8145563a617ac7fc673584 ./Cargo.lock +ab2b0e10ea3a02b56d689f994bd89fa71a61eff49306995e725f7104c122b53d ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -591cf7e1fc98bbcdf4854c28ffc22df92b47ac7cd6e81bfa07ae4f99a9baaa3c ./README.md -7da5e80fea6c3ba99fc7d66224d377dcaa15c287a2a4a16acef847aeb1e0aa44 ./SOURCE_MANIFEST.sha256 +98217f563d7ed22f8e36a8092cfb3fdba7efe217fea543f7edae4a836a38baab ./README.md +728f6fcd1b76c4125252ed17e2cc3bef21b4e8d4939879e2fd9744fbcdbeceeb ./SOURCE_MANIFEST.sha256 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs -312ca0de508126a473cad4a06d35eb5b44086de37f6d0f5f4d9f5fa85e5992fe ./docs/API.md -43af7941ec4d427f9db7ab3cc6baf3d182a72dba7a6791f14094fee138324d8d ./docs/FLOW.md -d3702f852b4427c67043d16d3edab40be23a1ebf9a3baf44902ef764241643dd ./docs/openapi.json +41e1b38bb5378e1fbcf59e2a956008eea2b3141cfef102c72cf88d28f5f4cf65 ./docs/API.md +94585aab43325a139f6c291f2293d93206d382c25a095b46930b924aaf336765 ./docs/FLOW.md +a273744fab39afc79defa0957d8f4a404abb222f32f35316075521cb3a6cc4b0 ./docs/openapi.json 77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example 0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile 0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md @@ -22,7 +22,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom 6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py 5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png -813f932b99eda416330688504c67872148b6aeae27042f93505085cbfe06a3ed ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +8cf9ced849dae67f6e9eb2cac0ede74232256562d9c2cbf6e144de0a540fb2ba ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py 39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py @@ -30,10 +30,10 @@ 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 -e8b1f335c9c7c5e3510aad8961f8f3e67d9fdd711d5407f1adb9db1746fd2407 ./ha-addon/repository/gree-controller/CHANGELOG.md +5f394912d8891101722e968af47f8c2a82e17287d01cd3987952b3c7311a0d23 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md -cf3e7106bb516598ca7d635be3d00807af024a9448632d89ee1a60d139c1c573 ./ha-addon/repository/gree-controller/README.md -0733d428c986e22c0300c3d8a82971dc1d6cadc88d38c928667c74c93638b5df ./ha-addon/repository/gree-controller/config.yaml +aa4f0fea858a37cb5d0611cfe7791a09ba6dafed44fbd725f0236e6b9a9da086 ./ha-addon/repository/gree-controller/README.md +539c6da3413640b4f468ae1f9884d4781342ed0bf3b75dd8342c6c8c4df6c406 ./ha-addon/repository/gree-controller/config.yaml 3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png 0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png 2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml @@ -85,7 +85,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -ff01f3a4b69bbd58e824eb6dfb8d36568c189cbc38bea21417b91ae81c4c43dc ./scripts/api_dev_test.py +c9fbd7e49d4a866bf085a1fe5d18df294f63a0698962a1ffb956f96fa7b3c500 ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -136,7 +136,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs -8c8d45fa9f37c724a758128726403cf64a2af2ab4e063f1b3e74e4986082de79 ./src/engine/automations.rs +969e4079cb9990c15b3366a99b68975de6466a5e11bbc54ab0405a863049f6b4 ./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 -0d4f2df3c3881aceb41b9f8d78adde7ecbb5b39d2f8aea444b865166a0670dec ./src/engine/tests.rs +9f15d890cb8fc0ccceba4d59b411a355503fcc269cfe6315e6bb0cc287759038 ./src/engine/tests.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs 87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs diff --git a/README.md b/README.md index 90a5756..8cddce6 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ Self-hosted controller for GREE-compatible air conditioners with a local Web UI, thermostat zones, schedules, Home Assistant integration, history, notifications and a documented HTTP/WebSocket API. -**Version: 0.15.18** +**Version: 0.15.19** -Version 0.15.18 records the exact Flow condition trace at execution time and shows the evaluated Flow variables and gates directly under Recently triggered automations in Control plan. +Version 0.15.19 fixes Flow thermostat OFF semantics: `zone_thermostat power=false` powers the assigned unit off without disabling the Zone, so Flow and thermostat evaluation remain active. > [Full API reference](docs/API.md) — authentication, every endpoint, request bodies, response models, WebSocket events and examples. > Built-in API: `/api/*` and `/ws`; interactive Swagger docs: `/api-docs`; OpenAPI JSON: `/api-docs/openapi.json`. diff --git a/SOURCE_MANIFEST.sha256 b/SOURCE_MANIFEST.sha256 index 49e88a6..143cbd5 100644 --- a/SOURCE_MANIFEST.sha256 +++ b/SOURCE_MANIFEST.sha256 @@ -1,13 +1,13 @@ de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -dfac61e5ea474221798f0a72d6cb4d6b5a31bcd853573e14c172087c2f7e98c5 ./Cargo.lock -f8e6fa48a584d6446e6360185b0ca320379b325d62afc062e7d2efedc2b14af1 ./Cargo.toml +3b388654ec7089465c8d45a8e8a638f237955e742d8145563a617ac7fc673584 ./Cargo.lock +ab2b0e10ea3a02b56d689f994bd89fa71a61eff49306995e725f7104c122b53d ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -591cf7e1fc98bbcdf4854c28ffc22df92b47ac7cd6e81bfa07ae4f99a9baaa3c ./README.md +98217f563d7ed22f8e36a8092cfb3fdba7efe217fea543f7edae4a836a38baab ./README.md 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs -312ca0de508126a473cad4a06d35eb5b44086de37f6d0f5f4d9f5fa85e5992fe ./docs/API.md -43af7941ec4d427f9db7ab3cc6baf3d182a72dba7a6791f14094fee138324d8d ./docs/FLOW.md -d3702f852b4427c67043d16d3edab40be23a1ebf9a3baf44902ef764241643dd ./docs/openapi.json +41e1b38bb5378e1fbcf59e2a956008eea2b3141cfef102c72cf88d28f5f4cf65 ./docs/API.md +94585aab43325a139f6c291f2293d93206d382c25a095b46930b924aaf336765 ./docs/FLOW.md +a273744fab39afc79defa0957d8f4a404abb222f32f35316075521cb3a6cc4b0 ./docs/openapi.json 77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example 0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile 0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md @@ -21,7 +21,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom 6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py 5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png -813f932b99eda416330688504c67872148b6aeae27042f93505085cbfe06a3ed ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +8cf9ced849dae67f6e9eb2cac0ede74232256562d9c2cbf6e144de0a540fb2ba ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py 39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py @@ -29,10 +29,10 @@ 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 -e8b1f335c9c7c5e3510aad8961f8f3e67d9fdd711d5407f1adb9db1746fd2407 ./ha-addon/repository/gree-controller/CHANGELOG.md +5f394912d8891101722e968af47f8c2a82e17287d01cd3987952b3c7311a0d23 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md -cf3e7106bb516598ca7d635be3d00807af024a9448632d89ee1a60d139c1c573 ./ha-addon/repository/gree-controller/README.md -0733d428c986e22c0300c3d8a82971dc1d6cadc88d38c928667c74c93638b5df ./ha-addon/repository/gree-controller/config.yaml +aa4f0fea858a37cb5d0611cfe7791a09ba6dafed44fbd725f0236e6b9a9da086 ./ha-addon/repository/gree-controller/README.md +539c6da3413640b4f468ae1f9884d4781342ed0bf3b75dd8342c6c8c4df6c406 ./ha-addon/repository/gree-controller/config.yaml 3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png 0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png 2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml @@ -84,7 +84,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -ff01f3a4b69bbd58e824eb6dfb8d36568c189cbc38bea21417b91ae81c4c43dc ./scripts/api_dev_test.py +c9fbd7e49d4a866bf085a1fe5d18df294f63a0698962a1ffb956f96fa7b3c500 ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -135,7 +135,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs -8c8d45fa9f37c724a758128726403cf64a2af2ab4e063f1b3e74e4986082de79 ./src/engine/automations.rs +969e4079cb9990c15b3366a99b68975de6466a5e11bbc54ab0405a863049f6b4 ./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 -0d4f2df3c3881aceb41b9f8d78adde7ecbb5b39d2f8aea444b865166a0670dec ./src/engine/tests.rs +9f15d890cb8fc0ccceba4d59b411a355503fcc269cfe6315e6bb0cc287759038 ./src/engine/tests.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs 87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs diff --git a/docs/API.md b/docs/API.md index 551da2d..3034424 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,6 +1,6 @@ # GREE Controller API reference -HTTP and WebSocket API for GREE Controller **0.15.18**. +HTTP and WebSocket API for GREE Controller **0.15.19**. [← Main documentation](../README.md) @@ -243,7 +243,7 @@ Response: { "status": "ok", "name": "gree-controller", - "version": "0.15.18", + "version": "0.15.19", "uptime_seconds": 1234, "control_ready": true, "time": "2026-08-30T06:54:00Z" @@ -306,7 +306,7 @@ Returns the initial Web UI snapshot: "control_plan": {"generated_at": "2026-09-04T08:00:00Z", "zones": [], "rules": []}, "control_plan_revision": 42, "system": { - "version": "0.15.18", + "version": "0.15.19", "uptime_seconds": 1234, "auth_required": false, "control_ready": true, diff --git a/docs/FLOW.md b/docs/FLOW.md index 8d06f46..024bc46 100644 --- a/docs/FLOW.md +++ b/docs/FLOW.md @@ -14,7 +14,7 @@ Flow is an authoring/orchestration layer. It does not replace the thermostat, sc ## Existing control domains remain authoritative -- `zone_thermostat` writes the existing persistent Zone intent and wakes the normal thermostat cycle. It can also issue one-shot granular vertical/horizontal louver commands to the assigned unit; these auxiliary fields do not take over thermostat ownership. +- `zone_thermostat` writes the existing persistent Zone intent and wakes the normal thermostat cycle. `power=false` sends an explicit physical OFF to the assigned unit but does **not** change the persistent Zone `enabled` flag; Zone enable/disable remains an administrative control gate. It can also issue one-shot granular vertical/horizontal louver commands to the assigned unit; these auxiliary fields do not take over thermostat ownership. - `group_action` calls the existing `control_group` path, including custom group targets. - `device_action` uses the existing `DeviceCommand` / automatic-device path. - `device_feature_action` uses the same path but compiles exactly one selected `DeviceCommand` field, leaving all other unit settings untouched. diff --git a/docs/openapi.json b/docs/openapi.json index 0969706..71613c2 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "GREE Controller API", - "version": "0.15.18", + "version": "0.15.19", "summary": "Local HTTP/WebSocket API for GREE Controller", "description": "Local API used by the GREE Controller Web UI and Home Assistant integration.", "license": { @@ -6079,7 +6079,7 @@ }, "version": { "type": "string", - "example": "0.15.18" + "example": "0.15.19" }, "uptime_seconds": { "type": "integer", diff --git a/ha-addon/home-assistant/custom_components/gree_controller/manifest.json b/ha-addon/home-assistant/custom_components/gree_controller/manifest.json index 213a75e..de35e07 100644 --- a/ha-addon/home-assistant/custom_components/gree_controller/manifest.json +++ b/ha-addon/home-assistant/custom_components/gree_controller/manifest.json @@ -1,7 +1,7 @@ { "domain": "gree_controller", "name": "GREE Controller", - "version": "0.15.18", + "version": "0.15.19", "config_flow": true, "integration_type": "hub", "iot_class": "local_polling", diff --git a/ha-addon/repository/gree-controller/CHANGELOG.md b/ha-addon/repository/gree-controller/CHANGELOG.md index 0f355fa..f365d2f 100644 --- a/ha-addon/repository/gree-controller/CHANGELOG.md +++ b/ha-addon/repository/gree-controller/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.15.19 + +- 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 - Persists the evaluated Flow trigger trace whenever a Flow-generated automation executes or reaches a failed execution attempt, so the trigger context reflects the values from that exact moment instead of current live readings. diff --git a/ha-addon/repository/gree-controller/README.md b/ha-addon/repository/gree-controller/README.md index d453a02..8d48340 100644 --- a/ha-addon/repository/gree-controller/README.md +++ b/ha-addon/repository/gree-controller/README.md @@ -2,7 +2,7 @@ Local GREE HVAC controller packaged as a Home Assistant add-on, with Web UI, HTTP/WebSocket API, built-in Swagger API documentation, UDP discovery/control, `amd64` and `aarch64` support, ingress, and database backup from `/data/gree-controller.db`. -Version 0.15.18 records the exact Flow condition trace at execution time and shows the evaluated Flow variables and gates directly under Recently triggered automations in Control plan. +Version 0.15.19 fixes Flow thermostat OFF semantics: `zone_thermostat power=false` powers the assigned unit off without disabling the Zone, so Flow and thermostat evaluation remain active. ![Home Assistant OS + GREE + VLAN topology](https://git.linuxiarz.pl/gru/gree-controller-ha-addon/raw/branch/master/gree-controller/topology-ha-vlan-gree-en.png) diff --git a/ha-addon/repository/gree-controller/config.yaml b/ha-addon/repository/gree-controller/config.yaml index 7d83dcd..6e3742d 100644 --- a/ha-addon/repository/gree-controller/config.yaml +++ b/ha-addon/repository/gree-controller/config.yaml @@ -1,5 +1,5 @@ name: "GREE Controller" -version: "0.15.18" +version: "0.15.19" slug: "gree_controller" description: "Local GREE HVAC controller with Web UI, API, and Home Assistant integration" url: "https://git.linuxiarz.pl/gru/gree-controller-ha-addon/" diff --git a/scripts/api_dev_test.py b/scripts/api_dev_test.py index 88ec200..4c03127 100644 --- a/scripts/api_dev_test.py +++ b/scripts/api_dev_test.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Developer smoke/integration tests for GREE Controller API 0.15.18. +"""Developer smoke/integration tests for GREE Controller API 0.15.19. Default mode is read-only and safe to run against a real controller. Use --settings-write to additionally round-trip all split settings resources and @@ -26,7 +26,7 @@ from typing import Any, Callable, Iterable, Optional DEFAULT_BASE_URL = os.environ.get("GREE_API_URL", "http://127.0.0.1:8787") DEFAULT_TOKEN = os.environ.get("GREE_API_TOKEN", "") -DEFAULT_EXPECTED_VERSION = "0.15.18" +DEFAULT_EXPECTED_VERSION = "0.15.19" SETTINGS_PATHS: dict[str, set[str]] = { "/api/settings/application": {"simulator_enabled"}, @@ -599,7 +599,7 @@ def run_suite(args: argparse.Namespace) -> int: print(f"Settings write tests: {'ENABLED' if args.settings_write else 'disabled'}\n") runner.run("public health", lambda: test_health(client, args.expected_version)) - runner.run("OpenAPI 0.15.18 contract", lambda: test_openapi(client, args.expected_version)) + runner.run("OpenAPI 0.15.19 contract", lambda: test_openapi(client, args.expected_version)) runner.run("bootstrap snapshot contract", lambda: test_bootstrap_contract(client)) runner.run("protected API requires auth", lambda: test_protected_auth(client)) diff --git a/src/engine/automations.rs b/src/engine/automations.rs index 28fd1e6..52b45d1 100644 --- a/src/engine/automations.rs +++ b/src/engine/automations.rs @@ -909,6 +909,14 @@ 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 @@ -921,7 +929,10 @@ async fn apply_flow_zone_action(state: &AppState, zone_id: &str, preset: Option< // remains an explicit gate unless this Flow action is the actor re-enabling it. if !zone.enabled && action.power != Some(true) { return Ok(false); } let device_id = zone.device_id.clone(); - if let Some(power) = action.power { zone.enabled = power; } + // 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())) } } @@ -967,9 +978,9 @@ async fn apply_flow_zone_action(state: &AppState, zone_id: &str, preset: Option< ..Default::default() }; if action.power == Some(false) { - // Disabled zones are intentionally skipped by the normal thermostat cycle. Perform the - // physical OFF under the canonical zone -> device lock order so the durable Flow intent - // cannot leave a unit running and polling/manual control cannot interleave with the frame. + // OFF remains an explicit physical command once the Flow action fires, but it must not + // disable the Zone itself. Send it under the canonical zone -> device lock order so the + // persisted thermostat hand-back and the device frame cannot race polling/manual control. // Swing can safely share this explicit frame because it is outside thermostat regulation. let _device_guard = state.lock_device_operation(&device_id).await; send_command_locked_forced( diff --git a/src/engine/tests.rs b/src/engine/tests.rs index 6d59cae..3f49321 100644 --- a/src/engine/tests.rs +++ b/src/engine/tests.rs @@ -525,6 +525,17 @@ 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");