From e5013ea819a6d74f3eb70a779ba11d40160fa86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Mon, 21 Sep 2026 10:28:28 +0200 Subject: [PATCH] v0.15.13 --- Cargo.lock | 2 +- Cargo.toml | 2 +- FILE_MANIFEST.sha256 | 30 +++++----- README.md | 4 +- SOURCE_MANIFEST.sha256 | 28 ++++----- docs/API.md | 6 +- 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 +- lang/en.json | 7 +++ lang/pl.json | 7 +++ scripts/api_dev_test.py | 6 +- web/css/styles.css | 57 +++++++++++++------ web/js-dynamic/flows.js | 29 +++++++--- 16 files changed, 124 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 158a3a1..90a9e59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -719,7 +719,7 @@ dependencies = [ [[package]] name = "gree-controller" -version = "0.15.12" +version = "0.15.13" dependencies = [ "aes", "aes-gcm", diff --git a/Cargo.toml b/Cargo.toml index 10ce1f3..0ea701d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gree-controller" -version = "0.15.12" +version = "0.15.13" 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 21a73b1..c98a292 100644 --- a/FILE_MANIFEST.sha256 +++ b/FILE_MANIFEST.sha256 @@ -1,14 +1,14 @@ de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -fe38ab5ecf7e55633da8da754161d6e91ed089517010592dc69b39dd65600475 ./Cargo.lock -074e24db6677b4390a5e11e8340fa69c98a264f2506ffaf9500f3f5196051250 ./Cargo.toml +814d089f903ccb4a7c73da9330dd712ac6c61930e6e04d46a2e7d17a42df0170 ./Cargo.lock +06aee8c1c6877d77f6442ae801018c6d6ad1eafc39f183caf64c8f70c38485f8 ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -1020631c965ab87428c272bc4df202848cecf3b214e2c93fe1c1978eb1153345 ./README.md -fd9dcd01ade48fd8df4ff6cd7142d1aefd9a018222fb0fa1dde76cb7abb5e8db ./SOURCE_MANIFEST.sha256 +6b7e376e25e6917c458e0633ea853cae9935240aeb2b18e9d1712925c3e37c72 ./README.md +a52695fdd3e444626d0b966871b052b2c0011bf2c35693b90aa496afef56bd17 ./SOURCE_MANIFEST.sha256 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs -19de46a570f96954c39cfd70663f217f96c6948ac81323a7660e39a387f8dad4 ./docs/API.md +6a0847edcc5a165d2ecba857a5528abf69499e4d2b2f5b3c18d07212e6830134 ./docs/API.md 43af7941ec4d427f9db7ab3cc6baf3d182a72dba7a6791f14094fee138324d8d ./docs/FLOW.md -9c8e35060b37f1cc3a0d6e6f57d7227fd37234efd9722cd73d041a33b0cad0b3 ./docs/openapi.json +cdd337e3daa56176a939389064f620364fa1f04dd48f7d2d3879dc130c95d31c ./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 -69cdb6e2f4a5d0114be0c45d53f7c4796fa93007e2d11c2384debf47f4e53847 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +b2af634cee9e2221caca3f6eeaf4bb21ec679ce1e69178bd96c5ce45d3921957 ./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 -3cf1d09992ad73435644c1d2f9d81fa6a65e5165ae8cbcd389a1721a18f34a51 ./ha-addon/repository/gree-controller/CHANGELOG.md +843d0dc9ac0c2f79abce8fb47359aed3f9eb3b95c7a5fc3a4648cb09a6d8d4b5 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md -674e3d11fcd7366e25ec057cb25cab96523da615d87e06ae00a07c5773d1013c ./ha-addon/repository/gree-controller/README.md -a872cdef7404ad2067e788c31165625b25b3598d00f8134bc23e7f08713cf028 ./ha-addon/repository/gree-controller/config.yaml +1f4cdeb234853a984381631cab6a0a297aae381750b17c9380d5f1ab093b63e4 ./ha-addon/repository/gree-controller/README.md +ed4feee8a3ccf817545de028fc55bec3386b2cb3b3e348d4eac93a49768ec648 ./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 @@ -43,8 +43,8 @@ cea12bc74c066a588a5ef0ef7bad9d4906bdbcea99f2d275429b0eefc94b4b5f ./ha-addon/run 081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md 253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md -e6a37278711ada7aa00f4fefde0d2dbde29fef27ad7cbd90c77fbff0045667b4 ./lang/en.json -9261b3e8850a35317c070ec5f8671a189f0bcb22f5f3ca20bdf18be53cca8b6f ./lang/pl.json +df4b0545d6f522a7f1bdff3b47b8a6fe0f711c0ad2013c0d35cfad7b61d73a92 ./lang/en.json +cfc4ef4a6f6dd26063ed8673d6f74173f193d531f2255cc89e53e9137cf6a09e ./lang/pl.json d8459024f04ca514bd8e9d6bd3af872fb942fd85a7cdd5583f4a9d28aab6faba ./make_zip.py b14233a8987e53bbbdd6770386ba10fa166ec25c1e098275c173c544b37846fc ./presets/bedroom_window_night.json 1960841119c0b673fb2f03621b32237552fd828045304cd221401214b997c910 ./presets/device_resilience.json @@ -85,7 +85,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -2b48874658103715b2434ff22da54c29bf1d1acddac8bc22ed35d9be6a9aeffb ./scripts/api_dev_test.py +bbc7719e29db419d3dad078bc8371d58623695d7d5a9c43ca66a03e6daa5df1b ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -199,7 +199,7 @@ f13f1be3d5789539eba3fc1b59c14835f8c681eca7634e118fa3763a53aeee2b ./src/queries/ 8c34b70fb5f80e3249c2e0c63686e60ce1697cf44a7e6f11b3ad6f689ce17792 ./src/state.rs b92a6cb158b494fe145b43c7641e65f6fafff47201d7d76edbec2cfd8b94835c ./systemd/gree-controller.service 544a31cb2e5374227026afd6abd0d910381f3fca1638154ebd74e3c3d96a35d1 ./web/404.html -223b22c1f025a6d4257dec56901b467c0614a24db7ff13a558f6b8cb1ef2277b ./web/css/styles.css +386be4d9d1949b077872f1b9e4d3da2175166cc3000fe12a878daba9c94dc1f3 ./web/css/styles.css 183d122ba366303d9952ac0e68aff4bced4e0d9a468fbe51316c13f15227402b ./web/custom-chart.html e98bdd7204349cce1ec6f57283509697af0bbc72280622a6c3efa6fed242db4f ./web/favicon.svg 92847143a358e6869ed4f21b156b10bda3f8abfcb9a12fc86256221c93be3b09 ./web/index.html @@ -210,7 +210,7 @@ e74bb06dba646f298a4d118b5c2dca6ba24f1179ce8ea8d53c1acd6000ca332c ./web/js-dynam 752b3c3b59558b42d867d4a15329238f0213f354b76f7011c10e31b4e6dbb311 ./web/js-dynamic/dashboard.js 6b166a9311e30fe948bd3236189436eea769c238f963ba00acec5cdb51ff1dd7 ./web/js-dynamic/entities.js b4204241eecf387256364f4230b23ed50d947a362f4ceb1e528d69494e93d7cf ./web/js-dynamic/events.js -53482b11bab852d0bd19d66fc3c2b2417ea628dde33f449af0f472ae395f1f30 ./web/js-dynamic/flows.js +43c78a3871cfdb0382081ec30b8d48650450c71b44d006414b161349ac1fa659 ./web/js-dynamic/flows.js 3ae714de6b71c068ba665c81a7689f994b1716284e8d937db669ad500f12cf63 ./web/js-dynamic/forms.js 92d013bb5d64f64aa8c55380704540a5f72732bde7ccd16554965e401daf50ea ./web/js-dynamic/history.js 511c4e7cc4c48fbbdab64558a9d1c27e6759c9b6dca255d11f301b9708e955c7 ./web/js-dynamic/main.js diff --git a/README.md b/README.md index adff5d5..c59225c 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.12** +**Version: 0.15.13** -Version 0.15.12 adds fast Flow-list workflows: descriptions can be edited without opening the visual editor, and every saved Flow has a simple non-mutating simulator that shows whether actions will run for the selected time and sensor/state scenario. +Version 0.15.13 makes Flow cards explicit and safer to use: each card shows whether it compiles to a schedule, an automation, both, or neither; opening the editor is now only possible from a dedicated Editor button styled like Simulator, while clicks on counts and card text no longer open the editor. > [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 e65dcec..8f59218 100644 --- a/SOURCE_MANIFEST.sha256 +++ b/SOURCE_MANIFEST.sha256 @@ -1,13 +1,13 @@ de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -fe38ab5ecf7e55633da8da754161d6e91ed089517010592dc69b39dd65600475 ./Cargo.lock -074e24db6677b4390a5e11e8340fa69c98a264f2506ffaf9500f3f5196051250 ./Cargo.toml +814d089f903ccb4a7c73da9330dd712ac6c61930e6e04d46a2e7d17a42df0170 ./Cargo.lock +06aee8c1c6877d77f6442ae801018c6d6ad1eafc39f183caf64c8f70c38485f8 ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -1020631c965ab87428c272bc4df202848cecf3b214e2c93fe1c1978eb1153345 ./README.md +6b7e376e25e6917c458e0633ea853cae9935240aeb2b18e9d1712925c3e37c72 ./README.md 29e9821e5ed216ea3565dd6d8bc0b174ed3cf9fa72c4ccebbfa99e98db3ad8f9 ./build.rs -19de46a570f96954c39cfd70663f217f96c6948ac81323a7660e39a387f8dad4 ./docs/API.md +6a0847edcc5a165d2ecba857a5528abf69499e4d2b2f5b3c18d07212e6830134 ./docs/API.md 43af7941ec4d427f9db7ab3cc6baf3d182a72dba7a6791f14094fee138324d8d ./docs/FLOW.md -9c8e35060b37f1cc3a0d6e6f57d7227fd37234efd9722cd73d041a33b0cad0b3 ./docs/openapi.json +cdd337e3daa56176a939389064f620364fa1f04dd48f7d2d3879dc130c95d31c ./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 -69cdb6e2f4a5d0114be0c45d53f7c4796fa93007e2d11c2384debf47f4e53847 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +b2af634cee9e2221caca3f6eeaf4bb21ec679ce1e69178bd96c5ce45d3921957 ./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 -3cf1d09992ad73435644c1d2f9d81fa6a65e5165ae8cbcd389a1721a18f34a51 ./ha-addon/repository/gree-controller/CHANGELOG.md +843d0dc9ac0c2f79abce8fb47359aed3f9eb3b95c7a5fc3a4648cb09a6d8d4b5 ./ha-addon/repository/gree-controller/CHANGELOG.md 50b8ba050c6b4919e4d057f7b38c1e23d3913b5b7c87552626452e9695d37251 ./ha-addon/repository/gree-controller/DOCS.md -674e3d11fcd7366e25ec057cb25cab96523da615d87e06ae00a07c5773d1013c ./ha-addon/repository/gree-controller/README.md -a872cdef7404ad2067e788c31165625b25b3598d00f8134bc23e7f08713cf028 ./ha-addon/repository/gree-controller/config.yaml +1f4cdeb234853a984381631cab6a0a297aae381750b17c9380d5f1ab093b63e4 ./ha-addon/repository/gree-controller/README.md +ed4feee8a3ccf817545de028fc55bec3386b2cb3b3e348d4eac93a49768ec648 ./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 @@ -42,8 +42,8 @@ cea12bc74c066a588a5ef0ef7bad9d4906bdbcea99f2d275429b0eefc94b4b5f ./ha-addon/run 081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md 253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md -e6a37278711ada7aa00f4fefde0d2dbde29fef27ad7cbd90c77fbff0045667b4 ./lang/en.json -9261b3e8850a35317c070ec5f8671a189f0bcb22f5f3ca20bdf18be53cca8b6f ./lang/pl.json +df4b0545d6f522a7f1bdff3b47b8a6fe0f711c0ad2013c0d35cfad7b61d73a92 ./lang/en.json +cfc4ef4a6f6dd26063ed8673d6f74173f193d531f2255cc89e53e9137cf6a09e ./lang/pl.json d8459024f04ca514bd8e9d6bd3af872fb942fd85a7cdd5583f4a9d28aab6faba ./make_zip.py b14233a8987e53bbbdd6770386ba10fa166ec25c1e098275c173c544b37846fc ./presets/bedroom_window_night.json 1960841119c0b673fb2f03621b32237552fd828045304cd221401214b997c910 ./presets/device_resilience.json @@ -84,7 +84,7 @@ fdcd9a5055d08037278b842e7ab69265345c5811f0a06867136c511d140bb191 ./presets/wind 804f22123cd3e8db0fac791826c8dd9f758fb866c8e3b5655fb6d25d259dccf1 ./presets/workday_comfort.json fd7390d64a2378352c09382accf6efff43903d952d111b22a982f06c5b2a3b4b ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -2b48874658103715b2434ff22da54c29bf1d1acddac8bc22ed35d9be6a9aeffb ./scripts/api_dev_test.py +bbc7719e29db419d3dad078bc8371d58623695d7d5a9c43ca66a03e6daa5df1b ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -198,7 +198,7 @@ f13f1be3d5789539eba3fc1b59c14835f8c681eca7634e118fa3763a53aeee2b ./src/queries/ 8c34b70fb5f80e3249c2e0c63686e60ce1697cf44a7e6f11b3ad6f689ce17792 ./src/state.rs b92a6cb158b494fe145b43c7641e65f6fafff47201d7d76edbec2cfd8b94835c ./systemd/gree-controller.service 544a31cb2e5374227026afd6abd0d910381f3fca1638154ebd74e3c3d96a35d1 ./web/404.html -223b22c1f025a6d4257dec56901b467c0614a24db7ff13a558f6b8cb1ef2277b ./web/css/styles.css +386be4d9d1949b077872f1b9e4d3da2175166cc3000fe12a878daba9c94dc1f3 ./web/css/styles.css 183d122ba366303d9952ac0e68aff4bced4e0d9a468fbe51316c13f15227402b ./web/custom-chart.html e98bdd7204349cce1ec6f57283509697af0bbc72280622a6c3efa6fed242db4f ./web/favicon.svg 92847143a358e6869ed4f21b156b10bda3f8abfcb9a12fc86256221c93be3b09 ./web/index.html @@ -209,7 +209,7 @@ e74bb06dba646f298a4d118b5c2dca6ba24f1179ce8ea8d53c1acd6000ca332c ./web/js-dynam 752b3c3b59558b42d867d4a15329238f0213f354b76f7011c10e31b4e6dbb311 ./web/js-dynamic/dashboard.js 6b166a9311e30fe948bd3236189436eea769c238f963ba00acec5cdb51ff1dd7 ./web/js-dynamic/entities.js b4204241eecf387256364f4230b23ed50d947a362f4ceb1e528d69494e93d7cf ./web/js-dynamic/events.js -53482b11bab852d0bd19d66fc3c2b2417ea628dde33f449af0f472ae395f1f30 ./web/js-dynamic/flows.js +43c78a3871cfdb0382081ec30b8d48650450c71b44d006414b161349ac1fa659 ./web/js-dynamic/flows.js 3ae714de6b71c068ba665c81a7689f994b1716284e8d937db669ad500f12cf63 ./web/js-dynamic/forms.js 92d013bb5d64f64aa8c55380704540a5f72732bde7ccd16554965e401daf50ea ./web/js-dynamic/history.js 511c4e7cc4c48fbbdab64558a9d1c27e6759c9b6dca255d11f301b9708e955c7 ./web/js-dynamic/main.js diff --git a/docs/API.md b/docs/API.md index abd670a..23cc046 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.12**. +HTTP and WebSocket API for GREE Controller **0.15.13**. [← Main documentation](../README.md) @@ -241,7 +241,7 @@ Response: { "status": "ok", "name": "gree-controller", - "version": "0.15.12", + "version": "0.15.13", "uptime_seconds": 1234, "control_ready": true, "time": "2026-08-30T06:54:00Z" @@ -304,7 +304,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.12", + "version": "0.15.13", "uptime_seconds": 1234, "auth_required": false, "control_ready": true, diff --git a/docs/openapi.json b/docs/openapi.json index 5b53704..08479ef 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.12", + "version": "0.15.13", "summary": "Local HTTP/WebSocket API for GREE Controller", "description": "Local API used by the GREE Controller Web UI and Home Assistant integration.", "license": { @@ -5967,7 +5967,7 @@ }, "version": { "type": "string", - "example": "0.15.12" + "example": "0.15.13" }, "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 74c7282..9e15f41 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.12", + "version": "0.15.13", "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 1d2f0df..828c007 100644 --- a/ha-addon/repository/gree-controller/CHANGELOG.md +++ b/ha-addon/repository/gree-controller/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.15.13 + +- Flow cards now show an explicit execution type: Schedule, Automation, Schedule + Automation, Draft, or None, based on the compiled Flow output. +- Removes whole-card navigation to the Flow editor, so clicking statistics, compile counts, descriptions, and other non-action areas no longer opens the editor accidentally. +- Adds a dedicated compact Editor button next to Simulator and gives both actions the same visual treatment. + ## 0.15.12 - Flow cards now allow editing the description directly from the Flow list without opening the visual editor. diff --git a/ha-addon/repository/gree-controller/README.md b/ha-addon/repository/gree-controller/README.md index aeba6a3..30e1085 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.12 adds quick Flow description editing from the Flow list and a simple non-mutating scenario simulator next to the editor button, with clear action outcomes and readable condition checks. +Version 0.15.13 adds an explicit Flow execution type on every Flow card and removes whole-card editor navigation. The editor now opens only from a dedicated Editor button that visually matches Simulator, so counters and descriptive text are safe to click. ![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 62e3af6..e9e449b 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.12" +version: "0.15.13" 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/lang/en.json b/lang/en.json index 8ceeb24..ab00a85 100644 --- a/lang/en.json +++ b/lang/en.json @@ -901,6 +901,13 @@ "flow.defaultDescription": "Visual control logic", "flow.compilesAutomatically": "Automatically translated into schedules and automations", "flow.openEditor": "Open editor", + "flow.editorButton": "Editor", + "flow.executionType": "Execution type:", + "flow.executionSchedule": "Schedule", + "flow.executionAutomation": "Automation", + "flow.executionMixed": "Schedule + automation", + "flow.executionNone": "None", + "flow.executionDraft": "Draft — none", "flow.editDescription": "Edit description", "flow.description": "Description", "flow.descriptionPlaceholder": "Describe what this Flow does…", diff --git a/lang/pl.json b/lang/pl.json index e3e2c9b..be4b991 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -901,6 +901,13 @@ "flow.defaultDescription": "Wizualna logika sterowania", "flow.compilesAutomatically": "Automatycznie tłumaczone na harmonogramy i automatyzacje", "flow.openEditor": "Otwórz edytor", + "flow.editorButton": "Edytor", + "flow.executionType": "Typ wykonania:", + "flow.executionSchedule": "Harmonogram", + "flow.executionAutomation": "Automatyzacja", + "flow.executionMixed": "Harmonogram + automatyzacja", + "flow.executionNone": "Brak", + "flow.executionDraft": "Szkic — brak", "flow.editDescription": "Edytuj opis", "flow.description": "Opis", "flow.descriptionPlaceholder": "Opisz krótko, co robi ten Flow…", diff --git a/scripts/api_dev_test.py b/scripts/api_dev_test.py index 71dde8c..7da6f99 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.12. +"""Developer smoke/integration tests for GREE Controller API 0.15.13. 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.12" +DEFAULT_EXPECTED_VERSION = "0.15.13" 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.12 contract", lambda: test_openapi(client, args.expected_version)) + runner.run("OpenAPI 0.15.13 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/web/css/styles.css b/web/css/styles.css index c817b30..da46e66 100644 --- a/web/css/styles.css +++ b/web/css/styles.css @@ -8495,20 +8495,6 @@ textarea:focus { } } -.flow-card[data-flow-card-id] { - cursor: pointer; -} - -.flow-card[data-flow-card-id]:focus-visible { - outline: 2px solid color-mix(in srgb, var(--accent) 55%, transparent); - outline-offset: 2px; -} - -.flow-card[data-flow-card-id] button, -.flow-card[data-flow-card-id] details { - cursor: pointer; -} - .flow-generated-card { border-left: 3px solid var(--accent-border); } @@ -10573,17 +10559,54 @@ select.select-native-proxy[aria-invalid="true"]+.custom-select .custom-select-tr background: var(--surface-muted); } -.flow-card .flow-simulate-button { +.flow-runtime-summary { + display: flex; + flex-direction: column; + gap: 3px; + min-width: 0; +} + +.flow-execution-type { + display: flex; + align-items: baseline; + gap: 6px; + flex-wrap: wrap; +} + +.flow-execution-type small { + color: var(--muted); +} + +.flow-execution-type strong { + font-size: .82rem; + font-weight: 700; +} + +.flow-execution-schedule strong { + color: var(--teal); +} + +.flow-execution-automation strong, +.flow-execution-mixed strong { + color: var(--accent); +} + +.flow-execution-none strong, +.flow-execution-draft strong { + color: var(--muted); +} + +.flow-card .flow-card-action-button { border: 1px solid var(--line); background: var(--surface-muted); color: var(--text); } -.flow-card .flow-simulate-button:hover:not(:disabled) { +.flow-card .flow-card-action-button:hover:not(:disabled) { border-color: var(--line-strong); } -.flow-card .flow-simulate-button:disabled { +.flow-card .flow-card-action-button:disabled { opacity: .45; cursor: not-allowed; } diff --git a/web/js-dynamic/flows.js b/web/js-dynamic/flows.js index 68c052c..20b0b5f 100644 --- a/web/js-dynamic/flows.js +++ b/web/js-dynamic/flows.js @@ -104,14 +104,29 @@ function flowDefaultConfig(kind) { return {}; } +function flowExecutionType(flow) { + const schedules = flow.compiled_schedule_ids?.length || 0; + const automations = flow.compiled_automation_ids?.length || 0; + if (flow.draft) return { key: 'flow.executionDraft', className: 'draft' }; + if (schedules > 0 && automations > 0) return { key: 'flow.executionMixed', className: 'mixed' }; + if (schedules > 0) return { key: 'flow.executionSchedule', className: 'schedule' }; + if (automations > 0) return { key: 'flow.executionAutomation', className: 'automation' }; + return { key: 'flow.executionNone', className: 'none' }; +} + function renderFlows() { const host = $('#flowList'); if (!host) return; const count = $('#flowListCount'); if (count) count.textContent = tr('flow.listCount', { count: app.flows.length }); - host.innerHTML = app.flows.length ? app.flows.map(flow => `
-

${esc(flow.name)}${flow.draft ? ` ${esc(tr('flow.draft'))}` : ''}

${esc(flow.description || tr('flow.defaultDescription'))}

${flow.draft ? `` : ``}
-
${esc(tr('flow.blocks'))}${flow.nodes?.length || 0}
${esc(tr('nav.schedules'))}${flow.compiled_schedule_ids?.length || 0}
${esc(tr('nav.automations'))}${flow.compiled_automation_ids?.length || 0}
- -
`).join('') : `
${esc(tr('flow.emptyTitle'))}${esc(tr('flow.emptyText'))}
`; + host.innerHTML = app.flows.length ? app.flows.map(flow => { + const schedules = flow.compiled_schedule_ids?.length || 0; + const automations = flow.compiled_automation_ids?.length || 0; + const execution = flowExecutionType(flow); + return `
+

${esc(flow.name)}${flow.draft ? ` ${esc(tr('flow.draft'))}` : ''}

${esc(flow.description || tr('flow.defaultDescription'))}

${flow.draft ? `` : ``}
+
${esc(tr('flow.blocks'))}${flow.nodes?.length || 0}
${esc(tr('nav.schedules'))}${schedules}
${esc(tr('nav.automations'))}${automations}
+ +
`; + }).join('') : `
${esc(tr('flow.emptyTitle'))}${esc(tr('flow.emptyText'))}
`; } let flowDescriptionTargetId = null; @@ -1801,8 +1816,6 @@ document.addEventListener('contextmenu', event => { }); document.addEventListener('keydown', event => { - const flowCard = event.target.closest?.('[data-flow-card-id]'); - if (flowCard && event.target === flowCard && (event.key === 'Enter' || event.key === ' ')) { event.preventDefault(); openFlowEditor(flowCard.dataset.flowCardId); return; } if ($('#flowEditor')?.hidden || !app.flowDraft) return; if (event.target.closest?.('input,select,textarea,[contenteditable="true"]')) return; if (event.target.closest?.('dialog[open]') || document.querySelector('dialog[open]')) return; @@ -1856,8 +1869,6 @@ document.addEventListener('click', event => { return; } if (!event.target.closest?.('#flowContextMenu')) hideFlowContextMenu(); - const flowCard = event.target.closest?.('[data-flow-card-id]'); - if (flowCard && !event.target.closest?.('button,summary,details,input,select,textarea,a,label')) { openFlowEditor(flowCard.dataset.flowCardId); return; } const edge = event.target.closest?.('[data-flow-edge]'); if (edge) { removeFlowEdge(edge.dataset.flowEdge); return; } const add = event.target.closest?.('[data-flow-add]'); if (add) { const dialog = add.closest?.('#flowBlockDialog'); if (!dialog) flowBlockInsertPoint = null; addFlowNode(add.dataset.flowAdd); if (dialog?.open) dialog.close(); return; } const templateCategory = event.target.closest?.('[data-flow-template-category]'); if (templateCategory) { renderFlowPresetBrowser(templateCategory.dataset.flowTemplateCategory); return; }