This commit is contained in:
Mateusz Gruszczyński committed 2026-10-11 17:02:19 +02:00
1 parent 8a7501e4ab
commit 8e8559939a
19 files changed
+144 -55

No files matched your search

+1
View File
@@ -44,3 +44,4 @@ Thumbs.db
/coverage/ /coverage/
*.profraw *.profraw
*.profdata *.profdata
flows
Generated
+1 -1
View File
@@ -719,7 +719,7 @@ dependencies = [
[[package]] [[package]]
name = "gree-controller" name = "gree-controller"
version = "0.15.21" version = "0.16.0"
dependencies = [ dependencies = [
"aes", "aes",
"aes-gcm", "aes-gcm",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "gree-controller" name = "gree-controller"
version = "0.15.21" version = "0.16.0"
edition = "2021" edition = "2021"
authors = ["GREE Controller contributors"] authors = ["GREE Controller contributors"]
description = "Standalone local GREE HVAC controller with Web UI, SQLite and Home Assistant sensor support" description = "Standalone local GREE HVAC controller with Web UI, SQLite and Home Assistant sensor support"
+20 -17
View File
@@ -1,14 +1,17 @@
de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example
a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore
9c5b11e08d0ba943d28d8523cc28da4f96fc82fd5a9b33379db6f8cb11559c52 ./Cargo.lock 3c92ae20c070a1db66390a8ec95ed87bc0fed9ec82188e5348fc862ddcbff06e ./Cargo.lock
37714bcb89253514dbe5f5c60db51320884dbd7e8b72e0a3716746ec48906eaf ./Cargo.toml 5a7d380c42118a8ab57939bfc99fe15dcf4ad4c1f4bfd5fd808164012ca2c0df ./Cargo.toml
19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE
993a7cc4670f28ba5a07de387cb1af7914e65530e5ba385d3f6b3d176a1a3ea1 ./README.md 8f2573aeec2240fa85c090b616575a9f5f79acc06ccfe8a98bf216ab13d3176a ./README.md
ea169f0015ebed8e9ccda7623b68990fb44aa160d09434f15e9a895d7513e7c1 ./SOURCE_MANIFEST.sha256 43cc9dbec1deb5c9f2fdddf03c4f19e745014a0f5ef44de556ca75b312b3acd8 ./SOURCE_MANIFEST.sha256
29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs
8f4a11ee2abc781da91821bd35053b510ce96694715f446eabee680be05bac88 ./docs/API.md dcbfdc5a281adb94c3e4186f88248d48d6e995b45591cdba7183f28e658698e5 ./docs/API.md
1b4f9b1f5b06aec9ba08176ccc9730fb8827ff93ef8a31bfdd5e60a2169084ef ./docs/FLOW.md 4c2a0ea22061c39ae4ff534134392edfb31264c9ccaa453e8448b60b881c3847 ./docs/FLOW.md
cdf6bbc5c1bec268fcd89be5179d5ca150785a475d92cbab5d98a1b2bbb3d31e ./docs/openapi.json 1a675292d181edb313850b26fa264b6a9daa3ccc4a632fb86828a04b3803ea36 ./docs/openapi.json
26130f86bc8bd020f0a1668d11bb0220f577779cbe2b008fb194d62dbb385ddd ./flows/stability/igor---heating-ha-stable.flow.json
63553ab25775d332b8aae0bf7715c37a3d2a19b12ebabbbf09335534f369c29a ./flows/stability/jan---heating-ha-stable.flow.json
8ffec14bd7ad358134e25cb901906494186a8a73788111fd4ced450f87cf3b6f ./flows/stability/sypialnia---heating-ha-stable.flow.json
77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example 77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example
0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile 0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile
0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md 0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md
@@ -22,7 +25,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom
6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py 6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py
5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py 5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py
c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png
ea5ad1d3caa6a9f565d8ee432c3010f72f46c3aca44f4501627ba8dd63aa3e58 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json 002170e041762ba17d2a082722a5c23fe13d126281e04aa5438a835ce98542a0 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json
c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py
39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py 39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py
cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py
@@ -30,10 +33,10 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom
a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json
50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json 50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json
c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json
c39535dc96c7cbb8b23d9a724b6a3ad927419cba06be39913a05dd6ddbf434a9 ./ha-addon/repository/gree-controller/CHANGELOG.md bfce426a0151c5616122446ded457bdefb20d691afa64003fd57e8b67b26ff85 ./ha-addon/repository/gree-controller/CHANGELOG.md
50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md
849d2123d1de2901425ceb1654662f0a320bf5d0ebf60706beb806e4a0b05bd4 ./ha-addon/repository/gree-controller/README.md 40036e3de45a68322e26d970eca50d3f17b57572f00fb13b0d4939d4a0fb36e0 ./ha-addon/repository/gree-controller/README.md
a14199621f683d28e2b465f0d1a8eac1d3a30d565dd63262016e6ac5a1cc9a47 ./ha-addon/repository/gree-controller/config.yaml 94cd29892fe53337bf5cf20ddd5317da514f311be14e056652ecfc3c45c7d45a ./ha-addon/repository/gree-controller/config.yaml
3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png 3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png
0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png 0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png
2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml 2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml
@@ -85,7 +88,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind
804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json
fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh
c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md
0f94af93d556821d566a6251a9f6601071bce7f74d8f4ad0d813dbeac529cc9d ./scripts/api_dev_test.py 0636d1f517e866ea5d92960dd16a37eb848715e0f5b6c5e4e5a2f7fd550e2e4e ./scripts/api_dev_test.py
5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh
6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh
1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh
@@ -136,7 +139,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched
28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs
f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs
0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs
7e584307145cae0056f894a659529d3fddc3d81cf766fbc78194881b477be2e2 ./src/engine/automations.rs fbd0c387f48133cf7b1119bdd2830c3e3bb9238d94bcb3b76133b98ab657b601 ./src/engine/automations.rs
1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs 1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs
357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs 357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs
828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs 828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs
@@ -145,16 +148,16 @@ f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_
e350aa63f3bb14ca887eaaa7555edbeae00fb584cbcaf552cc972f0c8918f5d8 ./src/engine/groups.rs e350aa63f3bb14ca887eaaa7555edbeae00fb584cbcaf552cc972f0c8918f5d8 ./src/engine/groups.rs
4ec11426ef860811348f2bf1b458bc5713fe8a7794fb4c8045dd637652e8e696 ./src/engine/history.rs 4ec11426ef860811348f2bf1b458bc5713fe8a7794fb4c8045dd637652e8e696 ./src/engine/history.rs
41b7045877771b7c352328998cb45ce2433e7f9631fad3eb1a882ab4897dc31f ./src/engine/local_thermostat.rs 41b7045877771b7c352328998cb45ce2433e7f9631fad3eb1a882ab4897dc31f ./src/engine/local_thermostat.rs
f684e6755d023478882d1689833f307f3b4cd2c66abf45f8af8315cee94d36ef ./src/engine/ownership.rs e61d7dea4b60e06fd8d08daaceecf53bd71b13ea2b0ad462692049f3cdaa5cef ./src/engine/ownership.rs
76c1594f31af64c9a34e2555ac015e8719d42273c687b4c85b9c8f306b3c69a2 ./src/engine/polling.rs 76c1594f31af64c9a34e2555ac015e8719d42273c687b4c85b9c8f306b3c69a2 ./src/engine/polling.rs
c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/runtime.rs c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/runtime.rs
48a496c3935f886a90b90461c38a7aa31ebc40c6482d6feaeb2be47bc2387625 ./src/engine/schedules.rs 48a496c3935f886a90b90461c38a7aa31ebc40c6482d6feaeb2be47bc2387625 ./src/engine/schedules.rs
b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs
682c8b3956c657b655746cbd19ee97ee2f4cf953bc9de67d6d70a1b14f3dd746 ./src/engine/temperature.rs 975298f6dec43bd962de67a1fdd2d6d9466bb0b16cc5dc46d04c2b23229e7a27 ./src/engine/temperature.rs
833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs 833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs
2c169af5e182fb338d97612326f4c6da6e594989f15b6e00337034474c0314f0 ./src/engine/tests.rs bb7758192868f6e7589e70a3d2962fe7d05357821609f4e1eb8237cfb56af597 ./src/engine/tests.rs
c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs
87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs 08cb170ab73152720dbcf137bf8f3190e18ea2d498a49df128790fa59c2f3416 ./src/engine/zone_control.rs
bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs
d681f2aa53c39f37411834c300e9200299f94ee4ea021f44f70a3ea1774bd698 ./src/home_assistant.rs d681f2aa53c39f37411834c300e9200299f94ee4ea021f44f70a3ea1774bd698 ./src/home_assistant.rs
bcd14e4d1af3ca580f3b95bcd86164c40f762511e1b8e2501cb8a598a6d8adf4 ./src/influxdb.rs bcd14e4d1af3ca580f3b95bcd86164c40f762511e1b8e2501cb8a598a6d8adf4 ./src/influxdb.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. 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.20** **Version: 0.16.0**
Version 0.15.20 adds the Visual Flow heating-curve block with graphical X/Y points, selectable temperature sources, linear interpolation and dynamic setpoint binding for thermostats, GREE targets and Home Assistant service actions. Version 0.16.0 improves heating stability with Home Assistant room-temperature sensor control, reliable Flow ownership, and safer shutdown behavior.
> [Full API reference](docs/API.md) — authentication, every endpoint, request bodies, response models, WebSocket events and examples. > [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`. > Built-in API: `/api/*` and `/ws`; interactive Swagger docs: `/api-docs`; OpenAPI JSON: `/api-docs/openapi.json`.
+19 -16
View File
@@ -1,13 +1,16 @@
de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example
a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore
9c5b11e08d0ba943d28d8523cc28da4f96fc82fd5a9b33379db6f8cb11559c52 ./Cargo.lock 3c92ae20c070a1db66390a8ec95ed87bc0fed9ec82188e5348fc862ddcbff06e ./Cargo.lock
37714bcb89253514dbe5f5c60db51320884dbd7e8b72e0a3716746ec48906eaf ./Cargo.toml 5a7d380c42118a8ab57939bfc99fe15dcf4ad4c1f4bfd5fd808164012ca2c0df ./Cargo.toml
19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE
993a7cc4670f28ba5a07de387cb1af7914e65530e5ba385d3f6b3d176a1a3ea1 ./README.md 8f2573aeec2240fa85c090b616575a9f5f79acc06ccfe8a98bf216ab13d3176a ./README.md
29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs
8f4a11ee2abc781da91821bd35053b510ce96694715f446eabee680be05bac88 ./docs/API.md dcbfdc5a281adb94c3e4186f88248d48d6e995b45591cdba7183f28e658698e5 ./docs/API.md
1b4f9b1f5b06aec9ba08176ccc9730fb8827ff93ef8a31bfdd5e60a2169084ef ./docs/FLOW.md 4c2a0ea22061c39ae4ff534134392edfb31264c9ccaa453e8448b60b881c3847 ./docs/FLOW.md
cdf6bbc5c1bec268fcd89be5179d5ca150785a475d92cbab5d98a1b2bbb3d31e ./docs/openapi.json 1a675292d181edb313850b26fa264b6a9daa3ccc4a632fb86828a04b3803ea36 ./docs/openapi.json
26130f86bc8bd020f0a1668d11bb0220f577779cbe2b008fb194d62dbb385ddd ./flows/stability/igor---heating-ha-stable.flow.json
63553ab25775d332b8aae0bf7715c37a3d2a19b12ebabbbf09335534f369c29a ./flows/stability/jan---heating-ha-stable.flow.json
8ffec14bd7ad358134e25cb901906494186a8a73788111fd4ced450f87cf3b6f ./flows/stability/sypialnia---heating-ha-stable.flow.json
77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example 77b8becf7a2c16a384ea85721d878b76e2d520549cb4455d9aa806e57e5a2ecd ./ha-addon/.env.example
0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile 0ca6e58170c2b8925194431ebbdb55f0c8b377fec5cd422cd2bd257e2d9328e3 ./ha-addon/Dockerfile
0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md 0951696a2c2e66d4d969f8e7f8641184e3012f261583b31074bc38a7a1c0cc1a ./ha-addon/README.md
@@ -21,7 +24,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom
6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py 6509286c7b7de638dcc5d40ce53181e65d1eddc5dc36a13306dc6d87220fedbb ./ha-addon/home-assistant/custom_components/gree_controller/coordinator.py
5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py 5a96fe8f5c035c34f1339370270cd078056202d09e236dec75735be11de92a7d ./ha-addon/home-assistant/custom_components/gree_controller/entity_map.py
c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png c4fb75c246db651087900ebfc2291ff41ac87652cd6194fc0b776b0005c1cbcf ./ha-addon/home-assistant/custom_components/gree_controller/icon.png
ea5ad1d3caa6a9f565d8ee432c3010f72f46c3aca44f4501627ba8dd63aa3e58 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json 002170e041762ba17d2a082722a5c23fe13d126281e04aa5438a835ce98542a0 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json
c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py c52a484b671ce738ecc00228a1db19a5d703f69ab27530c2896a5c2ae3b4a96f ./ha-addon/home-assistant/custom_components/gree_controller/number.py
39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py 39c4309001b75abb56234f05662bc06e077054986876f1927937edbce528ec95 ./ha-addon/home-assistant/custom_components/gree_controller/select.py
cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/home-assistant/custom_components/gree_controller/sensor.py
@@ -29,10 +32,10 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom
a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json a745cc458c235158d5d70b6a33d8000fd8b40ff93bfe2f2796af0f4b3a9eef9b ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json
50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json 50b7d6fe6329ad4ea6bee9612ab141c2f73f8382fcc2af0bb076a8e8d4dd4465 ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json
c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json
c39535dc96c7cbb8b23d9a724b6a3ad927419cba06be39913a05dd6ddbf434a9 ./ha-addon/repository/gree-controller/CHANGELOG.md bfce426a0151c5616122446ded457bdefb20d691afa64003fd57e8b67b26ff85 ./ha-addon/repository/gree-controller/CHANGELOG.md
50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md
849d2123d1de2901425ceb1654662f0a320bf5d0ebf60706beb806e4a0b05bd4 ./ha-addon/repository/gree-controller/README.md 40036e3de45a68322e26d970eca50d3f17b57572f00fb13b0d4939d4a0fb36e0 ./ha-addon/repository/gree-controller/README.md
a14199621f683d28e2b465f0d1a8eac1d3a30d565dd63262016e6ac5a1cc9a47 ./ha-addon/repository/gree-controller/config.yaml 94cd29892fe53337bf5cf20ddd5317da514f311be14e056652ecfc3c45c7d45a ./ha-addon/repository/gree-controller/config.yaml
3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png 3aae6cdae4c3aaab7786a9575e7093b7e2c5b69288167075f4b7475611691a6b ./ha-addon/repository/gree-controller/topologia-ha-vlan-gree-pl.png
0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png 0d0b42a7639b128946eec379175436fa1f150294f39d2dfd169077bfa87fd14d ./ha-addon/repository/gree-controller/topology-ha-vlan-gree-en.png
2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml 2272740b185e9520e948f74b8f45cf98b8b5fd28c93bdee760da626f91fe5c2a ./ha-addon/repository/gree-controller/translations/en.yaml
@@ -84,7 +87,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind
804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json
fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh
c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md
0f94af93d556821d566a6251a9f6601071bce7f74d8f4ad0d813dbeac529cc9d ./scripts/api_dev_test.py 0636d1f517e866ea5d92960dd16a37eb848715e0f5b6c5e4e5a2f7fd550e2e4e ./scripts/api_dev_test.py
5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh
6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh
1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh
@@ -135,7 +138,7 @@ d6b9b70a04c774173c97f7426487d5e2932d7713e12ae3fb7f64cf2b4e0b3c10 ./src/db/sched
28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs 28ee42d08147b0f154af818065d7d014d74ee8ddd59fdef98115f5c5368056cc ./src/db/tests.rs
f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_history.rs
0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs 0e49ea4a52017b0a8501d5101b1906a7a1e8d5158acb0bb65caa43cde2836ec0 ./src/engine.rs
7e584307145cae0056f894a659529d3fddc3d81cf766fbc78194881b477be2e2 ./src/engine/automations.rs fbd0c387f48133cf7b1119bdd2830c3e3bb9238d94bcb3b76133b98ab657b601 ./src/engine/automations.rs
1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs 1dccb8779f87dfdbd4ccda3f02ec51273e7be2e34e85166861668685528eca79 ./src/engine/commands.rs
357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs 357ef92c3cc42b243af4da31ac52bb360d7444ae423f58d7a13bdee79bf0a748 ./src/engine/connectivity.rs
828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs 828657b3c13b68792991b5ca2a26ae0b1d5c417191c83c4e5f650f62b6440096 ./src/engine/control_plan.rs
@@ -144,16 +147,16 @@ f90fbb14f29a20b799b3856bdaa22812a9f0d9dfa46693f1341c160dccda8a97 ./src/db/zone_
e350aa63f3bb14ca887eaaa7555edbeae00fb584cbcaf552cc972f0c8918f5d8 ./src/engine/groups.rs e350aa63f3bb14ca887eaaa7555edbeae00fb584cbcaf552cc972f0c8918f5d8 ./src/engine/groups.rs
4ec11426ef860811348f2bf1b458bc5713fe8a7794fb4c8045dd637652e8e696 ./src/engine/history.rs 4ec11426ef860811348f2bf1b458bc5713fe8a7794fb4c8045dd637652e8e696 ./src/engine/history.rs
41b7045877771b7c352328998cb45ce2433e7f9631fad3eb1a882ab4897dc31f ./src/engine/local_thermostat.rs 41b7045877771b7c352328998cb45ce2433e7f9631fad3eb1a882ab4897dc31f ./src/engine/local_thermostat.rs
f684e6755d023478882d1689833f307f3b4cd2c66abf45f8af8315cee94d36ef ./src/engine/ownership.rs e61d7dea4b60e06fd8d08daaceecf53bd71b13ea2b0ad462692049f3cdaa5cef ./src/engine/ownership.rs
76c1594f31af64c9a34e2555ac015e8719d42273c687b4c85b9c8f306b3c69a2 ./src/engine/polling.rs 76c1594f31af64c9a34e2555ac015e8719d42273c687b4c85b9c8f306b3c69a2 ./src/engine/polling.rs
c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/runtime.rs c73691c3637465ab0f79aecf7f5428d0317799a8ab5329ed564cf57963bbe86e ./src/engine/runtime.rs
48a496c3935f886a90b90461c38a7aa31ebc40c6482d6feaeb2be47bc2387625 ./src/engine/schedules.rs 48a496c3935f886a90b90461c38a7aa31ebc40c6482d6feaeb2be47bc2387625 ./src/engine/schedules.rs
b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs b0189f28d0f337dfd3ce0934da7a565e4a5535afc1c242214c26ed584b3b7840 ./src/engine/targets.rs
682c8b3956c657b655746cbd19ee97ee2f4cf953bc9de67d6d70a1b14f3dd746 ./src/engine/temperature.rs 975298f6dec43bd962de67a1fdd2d6d9466bb0b16cc5dc46d04c2b23229e7a27 ./src/engine/temperature.rs
833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs 833b72907375e75c3f42b3921ad70a8e298f5a93743bf0d0c19059aa272462d1 ./src/engine/temporary_thermostat.rs
2c169af5e182fb338d97612326f4c6da6e594989f15b6e00337034474c0314f0 ./src/engine/tests.rs bb7758192868f6e7589e70a3d2962fe7d05357821609f4e1eb8237cfb56af597 ./src/engine/tests.rs
c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs c89ff36c6a67bf4fbf68c43e18aa0a556de2dc69263fd79db376363afc741a4f ./src/engine/zone_actions.rs
87ab87d434a6462a2c3f25249b42c59ecb2bca6ed700ec73e95e4613349cf16f ./src/engine/zone_control.rs 08cb170ab73152720dbcf137bf8f3190e18ea2d498a49df128790fa59c2f3416 ./src/engine/zone_control.rs
bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs bfac95cec87f0df6ce562153cd3cfe6731359d703e6c592d2c2f7ba01ea62d99 ./src/error.rs
d681f2aa53c39f37411834c300e9200299f94ee4ea021f44f70a3ea1774bd698 ./src/home_assistant.rs d681f2aa53c39f37411834c300e9200299f94ee4ea021f44f70a3ea1774bd698 ./src/home_assistant.rs
bcd14e4d1af3ca580f3b95bcd86164c40f762511e1b8e2501cb8a598a6d8adf4 ./src/influxdb.rs bcd14e4d1af3ca580f3b95bcd86164c40f762511e1b8e2501cb8a598a6d8adf4 ./src/influxdb.rs
+3 -3
View File
@@ -1,6 +1,6 @@
# GREE Controller API reference # GREE Controller API reference
HTTP and WebSocket API for GREE Controller **0.15.20**. HTTP and WebSocket API for GREE Controller **0.16.0**.
[← Main documentation](../README.md) [← Main documentation](../README.md)
@@ -243,7 +243,7 @@ Response:
{ {
"status": "ok", "status": "ok",
"name": "gree-controller", "name": "gree-controller",
"version": "0.15.20", "version": "0.16.0",
"uptime_seconds": 1234, "uptime_seconds": 1234,
"control_ready": true, "control_ready": true,
"time": "2026-08-30T06:54:00Z" "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": {"generated_at": "2026-09-04T08:00:00Z", "zones": [], "rules": []},
"control_plan_revision": 42, "control_plan_revision": 42,
"system": { "system": {
"version": "0.15.20", "version": "0.16.0",
"uptime_seconds": 1234, "uptime_seconds": 1234,
"auth_required": false, "auth_required": false,
"control_ready": true, "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 ## Existing control domains remain authoritative
- `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. - `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. A concrete Flow mode (`heat`/`cool`) is also written with the OFF frame so a stale device `dry`/`fan` mode is not retained; Flow `auto` remains an ownership policy and is never mapped to physical GREE Auto on OFF. While a zone is owned by `automation.flow`, the global outdoor-assist bias is suppressed so the Flow's own room-temperature thresholds remain authoritative. 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. - `group_action` calls the existing `control_group` path, including custom group targets.
- `device_action` uses the existing `DeviceCommand` / automatic-device path. - `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. - `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", "openapi": "3.1.0",
"info": { "info": {
"title": "GREE Controller API", "title": "GREE Controller API",
"version": "0.15.20", "version": "0.16.0",
"summary": "Local HTTP/WebSocket API for GREE Controller", "summary": "Local HTTP/WebSocket API for GREE Controller",
"description": "Local API used by the GREE Controller Web UI and Home Assistant integration.", "description": "Local API used by the GREE Controller Web UI and Home Assistant integration.",
"license": { "license": {
@@ -6079,7 +6079,7 @@
}, },
"version": { "version": {
"type": "string", "type": "string",
"example": "0.15.20" "example": "0.16.0"
}, },
"uptime_seconds": { "uptime_seconds": {
"type": "integer", "type": "integer",
@@ -1,7 +1,7 @@
{ {
"domain": "gree_controller", "domain": "gree_controller",
"name": "GREE Controller", "name": "GREE Controller",
"version": "0.15.21", "version": "0.16.0",
"config_flow": true, "config_flow": true,
"integration_type": "hub", "integration_type": "hub",
"iot_class": "local_polling", "iot_class": "local_polling",
@@ -1,5 +1,15 @@
# Changelog # Changelog
## 0.16.0
- Improves heating stability when Visual Flow automations use Home Assistant room-temperature sensors; the updated Igor, Jan, and Sypialnia Flow definitions use HA room readings directly for ON/OFF thresholds rather than relying only on zone temperature.
- Shortens temperature-reached shutdown stabilization in the updated heating flows from 30 minutes to 30 seconds to reduce overshoot; keeps start stabilization and separate ON/OFF thresholds.
- Preserves `automation.flow` ownership across thermostat control cycles so the internal controller does not apply conflicting adjustments.
- Prevents the global outdoor-temperature assist from boosting targets for zones currently controlled by Flow; standalone thermostat control retains its existing behavior.
- Makes heating OFF commands set `power=false` with `heat` mode explicitly to avoid retaining an unintended dry/fan mode.
- Removes humidity-driven/Turbo activation paths from the updated heating flows and adds guarded Turbo shutdown and missing-sensor safeguards.
- Synchronizes core, Home Assistant add-on, and custom integration versions to 0.16.0.
## 0.15.20 ## 0.15.20
- Adds a new Visual Flow **Heating curve** block to the Sensors / values palette. - Adds a new Visual Flow **Heating curve** block to the Sensors / values palette.
@@ -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`. 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.20 adds the Visual Flow heating-curve block with graphical X/Y points, selectable temperature sources, linear interpolation and dynamic setpoint binding for thermostats, GREE targets and Home Assistant service actions. Version 0.16.0 improves heating stability with Home Assistant room-temperature sensor control, reliable Flow ownership, and safer shutdown behavior.
![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) ![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" name: "GREE Controller"
version: "0.15.21" version: "0.16.0"
slug: "gree_controller" slug: "gree_controller"
description: "Local GREE HVAC controller with Web UI, API, and Home Assistant integration" description: "Local GREE HVAC controller with Web UI, API, and Home Assistant integration"
url: "https://git.linuxiarz.pl/gru/gree-controller-ha-addon/" url: "https://git.linuxiarz.pl/gru/gree-controller-ha-addon/"
+3 -3
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Developer smoke/integration tests for GREE Controller API 0.15.20. """Developer smoke/integration tests for GREE Controller API 0.16.0.
Default mode is read-only and safe to run against a real controller. 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 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_BASE_URL = os.environ.get("GREE_API_URL", "http://127.0.0.1:8787")
DEFAULT_TOKEN = os.environ.get("GREE_API_TOKEN", "") DEFAULT_TOKEN = os.environ.get("GREE_API_TOKEN", "")
DEFAULT_EXPECTED_VERSION = "0.15.20" DEFAULT_EXPECTED_VERSION = "0.16.0"
SETTINGS_PATHS: dict[str, set[str]] = { SETTINGS_PATHS: dict[str, set[str]] = {
"/api/settings/application": {"simulator_enabled"}, "/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") 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("public health", lambda: test_health(client, args.expected_version))
runner.run("OpenAPI 0.15.20 contract", lambda: test_openapi(client, args.expected_version)) runner.run("OpenAPI 0.16.0 contract", lambda: test_openapi(client, args.expected_version))
runner.run("bootstrap snapshot contract", lambda: test_bootstrap_contract(client)) runner.run("bootstrap snapshot contract", lambda: test_bootstrap_contract(client))
runner.run("protected API requires auth", lambda: test_protected_auth(client)) runner.run("protected API requires auth", lambda: test_protected_auth(client))
+13
View File
@@ -12,6 +12,18 @@ fn device_has_thermostat_zone(device_id: &str, zones: &[Zone]) -> bool {
zones.iter().any(|zone| zone.device_id == device_id) zones.iter().any(|zone| zone.device_id == device_id)
} }
fn flow_off_physical_mode(action: &DeviceCommand) -> Option<String> {
// A thermostat Flow uses `auto` as an ownership policy (inherit house mode), not as
// the physical GREE Auto mode. Only concrete heat/cool modes are safe to persist on
// the unit while powering it off. This also clears a stale Dry/Fan mode before the
// next automated heating/cooling start.
action
.mode
.as_deref()
.filter(|mode| matches!(*mode, "heat" | "cool"))
.map(str::to_string)
}
fn flow_zone_action_already_satisfied( fn flow_zone_action_already_satisfied(
zone: &Zone, zone: &Zone,
device_power: bool, device_power: bool,
@@ -1160,6 +1172,7 @@ async fn apply_flow_zone_action(state: &AppState, zone_id: &str, preset: Option<
&device_id, &device_id,
DeviceCommand { DeviceCommand {
power: Some(false), power: Some(false),
mode: flow_off_physical_mode(action),
swing_vertical: swing_command.swing_vertical, swing_vertical: swing_command.swing_vertical,
swing_horizontal: swing_command.swing_horizontal, swing_horizontal: swing_command.swing_horizontal,
..Default::default() ..Default::default()
+1 -1
View File
@@ -33,7 +33,7 @@ pub fn refresh_control_ownership(zone: &mut Zone) {
let source = if zone.control_source.starts_with("group:") let source = if zone.control_source.starts_with("group:")
|| matches!( || matches!(
zone.control_source.as_str(), zone.control_source.as_str(),
"automation.device" | "house_power" "automation.device" | "automation.flow" | "house_power"
) { ) {
zone.control_source.clone() zone.control_source.clone()
} else { } else {
+15
View File
@@ -70,6 +70,21 @@ fn round_device_setpoint(mode: &str, demand: bool, value: f64) -> f64 {
} }
} }
fn thermostat_outdoor_assist_temperature(
enabled: bool,
control_source: &str,
outdoor_temperature: Option<f64>,
) -> Option<f64> {
// Flow thermostat graphs can define their own temperature hysteresis and guards.
// Do not silently bias their device target from the global outdoor-assist setting;
// otherwise a room-only Flow can heat more aggressively than its graph implies.
if enabled && control_source != "automation.flow" {
outdoor_temperature
} else {
None
}
}
fn outdoor_assist_offset(mode: &str, outdoor: Option<f64>, room: f64, target: f64) -> f64 { fn outdoor_assist_offset(mode: &str, outdoor: Option<f64>, room: f64, target: f64) -> f64 {
let Some(outdoor) = outdoor else { let Some(outdoor) = outdoor else {
return 0.0; return 0.0;
+44
View File
@@ -286,6 +286,44 @@ mod tests {
)); ));
} }
#[test]
fn flow_off_normalizes_concrete_hvac_mode_without_mapping_auto_to_device_auto() {
let heat = DeviceCommand {
power: Some(false),
mode: Some("heat".into()),
..Default::default()
};
let cool = DeviceCommand {
power: Some(false),
mode: Some("cool".into()),
..Default::default()
};
let auto = DeviceCommand {
power: Some(false),
mode: Some("auto".into()),
..Default::default()
};
assert_eq!(flow_off_physical_mode(&heat).as_deref(), Some("heat"));
assert_eq!(flow_off_physical_mode(&cool).as_deref(), Some("cool"));
assert_eq!(flow_off_physical_mode(&auto), None);
}
#[test]
fn flow_owned_thermostat_does_not_receive_global_outdoor_assist() {
assert_eq!(
thermostat_outdoor_assist_temperature(true, "automation.flow", Some(-5.0)),
None
);
assert_eq!(
thermostat_outdoor_assist_temperature(true, "schedule", Some(-5.0)),
Some(-5.0)
);
assert_eq!(
thermostat_outdoor_assist_temperature(false, "schedule", Some(-5.0)),
None
);
}
#[test] #[test]
fn flow_timed_gate_requires_continuity_and_resets_on_false() { fn flow_timed_gate_requires_continuity_and_resets_on_false() {
let mut state = crate::models::FlowRuntimeNodeState::default(); let mut state = crate::models::FlowRuntimeNodeState::default();
@@ -1342,6 +1380,12 @@ mod tests {
assert_eq!(zone.control_owner, "automation"); assert_eq!(zone.control_owner, "automation");
assert_eq!(zone.control_source, "automation.device"); assert_eq!(zone.control_source, "automation.device");
assert!(zone_has_active_thermostat_intent(&zone, None, Utc::now())); assert!(zone_has_active_thermostat_intent(&zone, None, Utc::now()));
zone.control_source = "automation.flow".into();
refresh_control_ownership(&mut zone);
assert_eq!(zone.control_owner, "automation");
assert_eq!(zone.control_source, "automation.flow");
assert!(!zone_has_active_thermostat_intent(&zone, None, Utc::now()));
} }
#[test] #[test]
+5 -5
View File
@@ -580,11 +580,11 @@ async fn control_zones(state: &AppState) -> Result<()> {
.remove(&zone.id) .remove(&zone.id)
.flatten() .flatten()
.or(global_outdoor_temperature); .or(global_outdoor_temperature);
let outdoor_assist_temperature = if settings.outdoor_assist_enabled { let outdoor_assist_temperature = thermostat_outdoor_assist_temperature(
outdoor_temperature settings.outdoor_assist_enabled,
} else { &zone.control_source,
None outdoor_temperature,
}; );
if zone if zone
.manual_override_until .manual_override_until
.map(|until| until <= Utc::now()) .map(|until| until <= Utc::now())