This commit is contained in:
Mateusz Gruszczyński committed 2026-09-23 09:44:23 +02:00
1 parent f08613a254
commit 3b71b057cd
15 files changed
+75 -47

No files matched your search

Generated
+1 -1
View File
@@ -719,7 +719,7 @@ dependencies = [
[[package]]
name = "gree-controller"
version = "0.15.18"
version = "0.15.19"
dependencies = [
"aes",
"aes-gcm",
+1 -1
View File
@@ -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"
+14 -14
View File
@@ -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
+2 -2
View File
@@ -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`.
+13 -13
View File
@@ -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
+3 -3
View File
@@ -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,
+1 -1
View File
@@ -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.
+2 -2
View File
@@ -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",
@@ -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",
@@ -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.
@@ -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)
@@ -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/"
+3 -3
View File
@@ -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))
+15 -4
View File
@@ -909,6 +909,14 @@ fn flow_condition_kind_runtime(kind: &str) -> bool {
)
}
fn apply_flow_zone_power_enabled_state(zone: &mut Zone, power: Option<bool>) {
// 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<bool, AppError> {
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(
+11
View File
@@ -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");