From 143ff0d2720d2eba7f1bf282a93f8282ea68ae2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 16 Sep 2026 15:28:06 +0200 Subject: [PATCH] v0.14.14 --- Cargo.lock | 2 +- Cargo.toml | 2 +- FILE_MANIFEST.sha256 | 30 +++++------ README.md | 4 +- SOURCE_MANIFEST.sha256 | 28 +++++----- docs/API.md | 6 +-- docs/openapi.json | 6 +-- .../gree_controller/manifest.json | 2 +- .../repository/gree-controller/CHANGELOG.md | 6 +++ .../repository/gree-controller/config.yaml | 2 +- lang/en.json | 6 ++- lang/pl.json | 6 ++- scripts/api_dev_test.py | 8 +-- src/api/configuration.rs | 2 +- web/js/settings-ui.js | 52 +++++++++++++------ web/styles.css | 5 ++ 16 files changed, 104 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5399f97..8968848 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "gree-controller" -version = "0.14.13" +version = "0.14.14" dependencies = [ "aes", "aes-gcm", diff --git a/Cargo.toml b/Cargo.toml index 0b908f7..544a93b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gree-controller" -version = "0.14.13" +version = "0.14.14" 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 393a5d2..2ad8657 100644 --- a/FILE_MANIFEST.sha256 +++ b/FILE_MANIFEST.sha256 @@ -1,14 +1,14 @@ d67af429e4da9ce08e9d2f2a8472849ffbd70d135b1c5da535a076026794d04c ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -47f3cc18f7d2bce04f9a7ff91d6f7b9b3ada4e26ad7ed5b98231677eb899d30b ./Cargo.lock -a8a415ba2c06cbd13177ba3330768db37a4c93e2dc2235c08bbdec4a1267efc8 ./Cargo.toml +6c60703633b9d6a696c22beca15e2bbc0c90424a1b98a5dd53cdc0d670dffffd ./Cargo.lock +b19e576628872d7344786c71a65de6b30f67f384b9306930b1aaa6018bf2caaa ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -3a2c5067a74ef5c1b9deee3217ce4724d4308818fa60f9c9a73ec1ea12574124 ./README.md -802c26ed11653a236c1d2fde8a4ede333a923442b6358563fcf426cc93e2e9de ./SOURCE_MANIFEST.sha256 +1066639d1459320dabdf0942fd050d55da3111ebe14216359e1c727501cdc852 ./README.md +1e25e25a50eb82291506420fe0f349a93e6e51df4a75e630bf186dacf46e8163 ./SOURCE_MANIFEST.sha256 5302570299af2c2650bada12e123f598c5db8009949c75761385f73ed57343c5 ./build.rs -10df37af947b8b94f90cab1e50bae0ab15abd893fef4bbc8c5fee76b7b978abb ./docs/API.md +41e8871195d9a65a2e999d9155f7a8491b6877818245d99968a13e8f0f154e67 ./docs/API.md f21d732eb1147f8f3167d2172cdf0b57e61edabdfecbaf97811d46c5bff7e47a ./docs/FLOW.md -af1609a1aaf518b1343b186cf9348ff7c45a920127407958702ef571523e2a9a ./docs/openapi.json +bff7a4df8138a4f7e5b7fbe94b498fde7f9785c93f7b66821650095acafea90e ./docs/openapi.json c65aa543d2e99f8f7d52736307b07ebd182597d80124661d53a16bb23f6f1118 ./ha-addon/.env.example a18d2460340264d34c267fa704ee51a42e59bcc1783ee4c0dbb2a8ef42fa0f16 ./ha-addon/Dockerfile 0417c88a990c72aecf071fba64d5d9da65dcda4d396cd7565477f7a4532c8c5e ./ha-addon/README.md @@ -22,7 +22,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom 41a8958a6fe6d10e5679c95ac34832583a2a15ecfd67d09b4e094a83d06f5c47 ./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 -41f991682cc01a1e4e1212e8f865f3b92a4a059aa22d42c7e202a42f69e8a2f8 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +2348f11fcbadc83258cdd63ec81a946a38163a7729dbcf531d93cbdd51faea9d ./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 6bddb7b4620021ecd2099a86a77ef5c7f2c2dcd3d07d5db4e7b4c4ce6d3e8c03 ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json 13f30e2dcdcedbd1b6c3f99c2335e0487108fd72c8e86922368b84f2fa2038ae ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json -871886c02492c51883ee6aabe1ef14ac917cdb131e284e2bfd159662f28ea271 ./ha-addon/repository/gree-controller/CHANGELOG.md +034cab1bb5b34c076fe1b6ddb0cb5a2b4ae896ae830f1c054a90de58f798c749 ./ha-addon/repository/gree-controller/CHANGELOG.md cdf3c5d60a86651353e06aad76b8fb5f8c6e0a28473b78d56334bb27fe5e1593 ./ha-addon/repository/gree-controller/DOCS.md c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md -2cd7a8c8dfb998041f8bd48c33d3fd0a9db1ab63b23dcc2db9a168f80235f012 ./ha-addon/repository/gree-controller/config.yaml +40f4f7156a882ef390011915fe38ee8299633e8b51ab554cd67a7b1e4c99f4ea ./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 d13e4c2b993d209078342c0c86d852b300692089b377aa044f811308dd188a1e ./ha-addon/repository/gree-controller/translations/en.yaml @@ -43,8 +43,8 @@ e8a77dbdb98c6ebcfbe6a08b0b5546178d965f25496c19f7aebaff287630838e ./ha-addon/run 081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md 253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md -3c362ffba7cc2edf683847cc320b8038dcfde5d598cf1c87db14eb56d419a4eb ./lang/en.json -dbe4e6a67d44f9ed24279b436abe4bedd9212dac9afdcb05c3d411edcd610c46 ./lang/pl.json +ec091f3cf6745995b1a677df5b064e9ed70e67b61f2c300e146ac8d64d6af570 ./lang/en.json +b14581a982441986df693849feccfcdfe4769b245a2adac0558fc86420d17f82 ./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 01952aa92b217f8eae2493b88870e2dec595100cd15c4d561ff11ae2b936c46f ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -4e1067274f3e7cbbde8d341e585292780bd8cae5f00c1942552ddce51994376f ./scripts/api_dev_test.py +0d2fd90f690d00a1f21aa4e3810a3dce976b55583df752c1cb7a90bc3742e7d3 ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -102,7 +102,7 @@ b50782b3742dfbf8a319c60571c968e93fdf8547db747c759edcffae68cb98bf ./scripts/upda 3dfd1e053cbfa0d684dd88cf99b244a96a36e2ff23d2a0715b8327ab62258254 ./src/api/assets.rs 05c255919f7b3d81188fc5f1410be6a0037471dfc44e93bffb009f29a1e6a3fc ./src/api/auth.rs 9e4fc675306e111ed3db7af9822e2925d88109c31b9e309851665a975c0bd83c ./src/api/automations.rs -269ba6c91539962ef2730badf9a2f466d9d5ca52f7ca522322bac12c63bcce7c ./src/api/configuration.rs +5d1cbc16bcdf0e048c9ec554bfb3a8c26068f3a99fc947ae195221015b90834c ./src/api/configuration.rs 19bc141286a336ad67e99079496eb0ae5126f986ab28be62b5f97758e5f6969c ./src/api/debug_tokens.rs 32ade46ec45d6faf7852242b9f5ba1be6eacbacbeb33d2deabfab59bf1610ce0 ./src/api/device_groups.rs fcbb3da0538aab451f71810f829cc248d6bb67e586dc418d71a572980583823d ./src/api/devices.rs @@ -217,10 +217,10 @@ b08b0fe301642d1daa084b322a02e351d284d2465231505d45079a52ccb4028f ./web/js/flows 799613c6d465cb2f92ecb57cb082d0c33729a03d88ab4ca7fa12a3cbd7e38e75 ./web/js/realtime.js 9546ca5c5566994aff3c33d92295be46b65d51d874681764abe77470dc9c9c73 ./web/js/router.js c2710fd9c1f2b31878c1e25ceb02d74ae30456c1bbb400e69fcf7619ecc72bc2 ./web/js/select-ui.js -9b6554703f0a152c58a09d9dac0238de5e0c13805454d25a26544da24f9a1b69 ./web/js/settings-ui.js +420cc44008d739ece4031093db772cc2bd6cdc0573b971b04ccce2aedb5762dd ./web/js/settings-ui.js 9f50794a92059357301b4c920b066bdb20ce1f64fbccea42effcd196d0a00cc4 ./web/js/settings.js 3815fea7ae1694568c2f249bc8460e0563ced6bde89214f74f21b41fe8cad9a6 ./web/lang-init.js 6b653e4fe2d4db4ffae6ff8f39b8ce57a10a990dc0000ee4aae51d949afadd52 ./web/manifest.webmanifest -84cb1c81280435b4ed42516f9bae5171b4e12d11a997dcb9fd087ab83c4c508e ./web/styles.css +de5fadd167f860d12c458d75c2385fca4efe8c40ab26b1e97adae455598cde16 ./web/styles.css fefdf12cbbb0a5d8a2cb89275cae28455aa42aaf179542305cc8f5e0f4825898 ./web/sw.js d505d793ce7cc9485b45b78bba1c0d51887adc7451ab59a42702946e5b991382 ./web/theme-init.js diff --git a/README.md b/README.md index 969d5c5..cb0786e 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.14.13** +**Version: 0.14.14** -Version 0.14.13 improves Home Assistant add-on authorization UX: Supervisor authentication is shown as automatic and manual URL/token fields stay hidden unless the HA test fails. The HA test now reports a live sample entity reading, and Shared Flow input Home Assistant sources include a searchable live entity picker. Standalone Home Assistant configuration remains unchanged. +Version 0.14.14 makes Home Assistant entity selection in Reusable data -> Shared Flow input explicit: a separate search field filters the live HA entity catalog by name, entity_id and current state, while the selected entity_id remains a separate editable value. It keeps the automatic Supervisor authentication and manual fallback behavior introduced in 0.14.13. Standalone Home Assistant configuration remains unchanged. > [Full API reference](docs/API.md) — authentication, every endpoint, request bodies, response models, WebSocket events and examples. diff --git a/SOURCE_MANIFEST.sha256 b/SOURCE_MANIFEST.sha256 index 264298a..dd04ee7 100644 --- a/SOURCE_MANIFEST.sha256 +++ b/SOURCE_MANIFEST.sha256 @@ -1,13 +1,13 @@ d67af429e4da9ce08e9d2f2a8472849ffbd70d135b1c5da535a076026794d04c ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -47f3cc18f7d2bce04f9a7ff91d6f7b9b3ada4e26ad7ed5b98231677eb899d30b ./Cargo.lock -a8a415ba2c06cbd13177ba3330768db37a4c93e2dc2235c08bbdec4a1267efc8 ./Cargo.toml +6c60703633b9d6a696c22beca15e2bbc0c90424a1b98a5dd53cdc0d670dffffd ./Cargo.lock +b19e576628872d7344786c71a65de6b30f67f384b9306930b1aaa6018bf2caaa ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -3a2c5067a74ef5c1b9deee3217ce4724d4308818fa60f9c9a73ec1ea12574124 ./README.md +1066639d1459320dabdf0942fd050d55da3111ebe14216359e1c727501cdc852 ./README.md 5302570299af2c2650bada12e123f598c5db8009949c75761385f73ed57343c5 ./build.rs -10df37af947b8b94f90cab1e50bae0ab15abd893fef4bbc8c5fee76b7b978abb ./docs/API.md +41e8871195d9a65a2e999d9155f7a8491b6877818245d99968a13e8f0f154e67 ./docs/API.md f21d732eb1147f8f3167d2172cdf0b57e61edabdfecbaf97811d46c5bff7e47a ./docs/FLOW.md -af1609a1aaf518b1343b186cf9348ff7c45a920127407958702ef571523e2a9a ./docs/openapi.json +bff7a4df8138a4f7e5b7fbe94b498fde7f9785c93f7b66821650095acafea90e ./docs/openapi.json c65aa543d2e99f8f7d52736307b07ebd182597d80124661d53a16bb23f6f1118 ./ha-addon/.env.example a18d2460340264d34c267fa704ee51a42e59bcc1783ee4c0dbb2a8ef42fa0f16 ./ha-addon/Dockerfile 0417c88a990c72aecf071fba64d5d9da65dcda4d396cd7565477f7a4532c8c5e ./ha-addon/README.md @@ -21,7 +21,7 @@ b7f0873109c52be9d7f09bea3dffc416103c50085e1f0680d11661a969479898 ./ha-addon/hom 41a8958a6fe6d10e5679c95ac34832583a2a15ecfd67d09b4e094a83d06f5c47 ./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 -41f991682cc01a1e4e1212e8f865f3b92a4a059aa22d42c7e202a42f69e8a2f8 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +2348f11fcbadc83258cdd63ec81a946a38163a7729dbcf531d93cbdd51faea9d ./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 6bddb7b4620021ecd2099a86a77ef5c7f2c2dcd3d07d5db4e7b4c4ce6d3e8c03 ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json 13f30e2dcdcedbd1b6c3f99c2335e0487108fd72c8e86922368b84f2fa2038ae ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json -871886c02492c51883ee6aabe1ef14ac917cdb131e284e2bfd159662f28ea271 ./ha-addon/repository/gree-controller/CHANGELOG.md +034cab1bb5b34c076fe1b6ddb0cb5a2b4ae896ae830f1c054a90de58f798c749 ./ha-addon/repository/gree-controller/CHANGELOG.md cdf3c5d60a86651353e06aad76b8fb5f8c6e0a28473b78d56334bb27fe5e1593 ./ha-addon/repository/gree-controller/DOCS.md c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md -2cd7a8c8dfb998041f8bd48c33d3fd0a9db1ab63b23dcc2db9a168f80235f012 ./ha-addon/repository/gree-controller/config.yaml +40f4f7156a882ef390011915fe38ee8299633e8b51ab554cd67a7b1e4c99f4ea ./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 d13e4c2b993d209078342c0c86d852b300692089b377aa044f811308dd188a1e ./ha-addon/repository/gree-controller/translations/en.yaml @@ -42,8 +42,8 @@ e8a77dbdb98c6ebcfbe6a08b0b5546178d965f25496c19f7aebaff287630838e ./ha-addon/run 081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md 253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md -3c362ffba7cc2edf683847cc320b8038dcfde5d598cf1c87db14eb56d419a4eb ./lang/en.json -dbe4e6a67d44f9ed24279b436abe4bedd9212dac9afdcb05c3d411edcd610c46 ./lang/pl.json +ec091f3cf6745995b1a677df5b064e9ed70e67b61f2c300e146ac8d64d6af570 ./lang/en.json +b14581a982441986df693849feccfcdfe4769b245a2adac0558fc86420d17f82 ./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 01952aa92b217f8eae2493b88870e2dec595100cd15c4d561ff11ae2b936c46f ./regenerate-sha.sh c64b1c6deeb24f20af662bfce7fa3683703914987241107ce664fa2f6d1a9dcb ./scripts/README.md -4e1067274f3e7cbbde8d341e585292780bd8cae5f00c1942552ddce51994376f ./scripts/api_dev_test.py +0d2fd90f690d00a1f21aa4e3810a3dce976b55583df752c1cb7a90bc3742e7d3 ./scripts/api_dev_test.py 5bc736c7bc76ca80aaa406bb171d2aa91baf4c3aa8695dce0e09b888b6ab3146 ./scripts/common.sh 6403786610ee6d2f628193c25aee0dd058d62e904aa1a31d5f62fdaae0e94b4f ./scripts/configure-gree-network.sh 1d6e14e26e49aa9d3527f30a23668bf8d9c48b67e6628ef686c3155c012155de ./scripts/dev.sh @@ -101,7 +101,7 @@ b50782b3742dfbf8a319c60571c968e93fdf8547db747c759edcffae68cb98bf ./scripts/upda 3dfd1e053cbfa0d684dd88cf99b244a96a36e2ff23d2a0715b8327ab62258254 ./src/api/assets.rs 05c255919f7b3d81188fc5f1410be6a0037471dfc44e93bffb009f29a1e6a3fc ./src/api/auth.rs 9e4fc675306e111ed3db7af9822e2925d88109c31b9e309851665a975c0bd83c ./src/api/automations.rs -269ba6c91539962ef2730badf9a2f466d9d5ca52f7ca522322bac12c63bcce7c ./src/api/configuration.rs +5d1cbc16bcdf0e048c9ec554bfb3a8c26068f3a99fc947ae195221015b90834c ./src/api/configuration.rs 19bc141286a336ad67e99079496eb0ae5126f986ab28be62b5f97758e5f6969c ./src/api/debug_tokens.rs 32ade46ec45d6faf7852242b9f5ba1be6eacbacbeb33d2deabfab59bf1610ce0 ./src/api/device_groups.rs fcbb3da0538aab451f71810f829cc248d6bb67e586dc418d71a572980583823d ./src/api/devices.rs @@ -216,10 +216,10 @@ b08b0fe301642d1daa084b322a02e351d284d2465231505d45079a52ccb4028f ./web/js/flows 799613c6d465cb2f92ecb57cb082d0c33729a03d88ab4ca7fa12a3cbd7e38e75 ./web/js/realtime.js 9546ca5c5566994aff3c33d92295be46b65d51d874681764abe77470dc9c9c73 ./web/js/router.js c2710fd9c1f2b31878c1e25ceb02d74ae30456c1bbb400e69fcf7619ecc72bc2 ./web/js/select-ui.js -9b6554703f0a152c58a09d9dac0238de5e0c13805454d25a26544da24f9a1b69 ./web/js/settings-ui.js +420cc44008d739ece4031093db772cc2bd6cdc0573b971b04ccce2aedb5762dd ./web/js/settings-ui.js 9f50794a92059357301b4c920b066bdb20ce1f64fbccea42effcd196d0a00cc4 ./web/js/settings.js 3815fea7ae1694568c2f249bc8460e0563ced6bde89214f74f21b41fe8cad9a6 ./web/lang-init.js 6b653e4fe2d4db4ffae6ff8f39b8ce57a10a990dc0000ee4aae51d949afadd52 ./web/manifest.webmanifest -84cb1c81280435b4ed42516f9bae5171b4e12d11a997dcb9fd087ab83c4c508e ./web/styles.css +de5fadd167f860d12c458d75c2385fca4efe8c40ab26b1e97adae455598cde16 ./web/styles.css fefdf12cbbb0a5d8a2cb89275cae28455aa42aaf179542305cc8f5e0f4825898 ./web/sw.js d505d793ce7cc9485b45b78bba1c0d51887adc7451ab59a42702946e5b991382 ./web/theme-init.js diff --git a/docs/API.md b/docs/API.md index 170598a..7b7ff67 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.14.13**. +HTTP and WebSocket API for GREE Controller **0.14.14**. [← Main documentation](../README.md) @@ -234,7 +234,7 @@ Response: { "status": "ok", "name": "gree-controller", - "version": "0.14.13", + "version": "0.14.14", "uptime_seconds": 1234, "control_ready": true, "time": "2026-08-30T06:54:00Z" @@ -297,7 +297,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.14.13", + "version": "0.14.14", "uptime_seconds": 1234, "auth_required": false, "control_ready": true, diff --git a/docs/openapi.json b/docs/openapi.json index 14132d9..d4fcbb4 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,9 +2,9 @@ "openapi": "3.1.0", "info": { "title": "GREE Controller API", - "version": "0.14.13", + "version": "0.14.14", "summary": "Local HTTP/WebSocket API for GREE HVAC control", - "description": "Self-hosted API used by the GREE Controller Web UI and Home Assistant integration.\n\n### Authentication\nAdministrator endpoints accept `Authorization: Bearer ` or `x-api-token: ` when configured. Restricted Home Assistant control endpoints also accept generated integration tokens.\n\n### Local and GREE Cloud\nDevices use one API model and one command surface. `connection_type=local` is dispatched only to the existing LAN/UDP provider; `connection_type=gree_cloud` is dispatched only to the GREE Cloud provider. No automatic transport fallback is performed.\n\n### GREE Cloud security\nCloud passwords, REST/MQTT tokens, Authorization values and device cipher keys are never returned in normal API responses or Cloud diagnostics. MQTT uses TLS with certificate and hostname validation.\n\n### Energy\nGREE Cloud `ElcAll` and selected Home Assistant cumulative energy sensors are normalized to kWh and converted to consumption deltas before aggregation. Raw cumulative values are retained only as meter samples/baselines.\n\n### 0.14.13\nHome Assistant add-on authentication is now hidden behind an automatic Supervisor status, manual URL/token fallback is unlocked only after a failed HA test, connection tests return a live sample entity reading, and Shared Flow input HA sources include searchable live entity suggestions.\n\n### 0.14.12\nThe Home Assistant add-on now uses the Supervisor Core API proxy and runtime SUPERVISOR_TOKEN automatically; standalone Home Assistant URL/token configuration is unchanged.\n\n### 0.14.11\nWeb UI icons now use a shared inline SVG set instead of font-dependent Unicode glyphs across navigation, dialogs, Flow, charts, controls and event categories for consistent cross-platform rendering.\n\n\n### 0.14.10\nNight mode and Home Assistant / Sensors standalone settings now use the full available page width, matching the other Web UI sections.\n\n### 0.14.9\nPower controls use an embedded SVG icon instead of a font-dependent Unicode glyph. Home Assistant room-sensor stale/error events identify the affected entity and zone, and historical event rows can recover that context from metadata.\n\n### 0.14.8\nRemaining Home Assistant and notification diagnostic errors no longer use device-transport 502 responses. Missing/invalid integration configuration returns 400, configured external dependency failures return 424, and 502 is reserved for Local/LAN GREE device communication.\n\n### 0.14.7\nHome Assistant energy-sensor discovery now returns an empty optional result when HA is not configured, uses 424 for configured external-dependency failures, and custom select popovers use their rendered height when positioning above a field.\n\n\n### 0.14.6\nFixes dynamic custom-select duplication in History → Energy and hides Energy history controls when no energy source is configured.\n\n### 0.14.5\nWeb UI single-choice controls now use one consistent custom dropdown, language packs are loaded on demand, and the dashboard outdoor temperature opens a 24-hour history modal.\n\n### 0.14.4\nHome Assistant connection tests validate only the configured server/API token and require no entity. `outdoor_entity_id` is the global Home Assistant outdoor-temperature sensor; zones can override it with `ha_outdoor_entity_id`. Room-temperature Home Assistant sensors remain configured per zone with `ha_entity_id`. Global/per-zone outdoor sensors are integrated with aliases, metrics/history and Visual Flow entity suggestions.\n\n### 0.14.2\nAdds independent vertical/horizontal swing controls across manual device control, thermostat zones, legacy automations, Visual Flow and Home Assistant zone climates. Swing is treated as an auxiliary one-shot unit setting and does not replace thermostat ownership.\n\n### 0.14.1\nAdds split/multisplit installation groups with shared energy and outdoor-temperature sources, multi-target energy charts with period comparison, cleaner Cloud status/alerts and safe MQTT cleanup after the last Cloud device is removed.\n\n### 0.14.0\nAdds first-class GREE Cloud MQTT status/control, reconnect/resubscribe lifecycle, Cloud diagnostics, per-device capabilities, Cloud/HA energy sources and energy-history aggregation while preserving the LAN transport contract.", + "description": "Self-hosted API used by the GREE Controller Web UI and Home Assistant integration.\n\n### Authentication\nAdministrator endpoints accept `Authorization: Bearer ` or `x-api-token: ` when configured. Restricted Home Assistant control endpoints also accept generated integration tokens.\n\n### Local and GREE Cloud\nDevices use one API model and one command surface. `connection_type=local` is dispatched only to the existing LAN/UDP provider; `connection_type=gree_cloud` is dispatched only to the GREE Cloud provider. No automatic transport fallback is performed.\n\n### GREE Cloud security\nCloud passwords, REST/MQTT tokens, Authorization values and device cipher keys are never returned in normal API responses or Cloud diagnostics. MQTT uses TLS with certificate and hostname validation.\n\n### Energy\nGREE Cloud `ElcAll` and selected Home Assistant cumulative energy sensors are normalized to kWh and converted to consumption deltas before aggregation. Raw cumulative values are retained only as meter samples/baselines.\n\n### 0.14.14\nShared Flow input Home Assistant sources now expose a dedicated entity search box separate from the selected entity_id, making large live entity catalogs easy to filter by name, ID and state.\n\n### 0.14.13\nHome Assistant add-on authentication is now hidden behind an automatic Supervisor status, manual URL/token fallback is unlocked only after a failed HA test, connection tests return a live sample entity reading, and Shared Flow input HA sources include searchable live entity suggestions.\n\n### 0.14.12\nThe Home Assistant add-on now uses the Supervisor Core API proxy and runtime SUPERVISOR_TOKEN automatically; standalone Home Assistant URL/token configuration is unchanged.\n\n### 0.14.11\nWeb UI icons now use a shared inline SVG set instead of font-dependent Unicode glyphs across navigation, dialogs, Flow, charts, controls and event categories for consistent cross-platform rendering.\n\n\n### 0.14.10\nNight mode and Home Assistant / Sensors standalone settings now use the full available page width, matching the other Web UI sections.\n\n### 0.14.9\nPower controls use an embedded SVG icon instead of a font-dependent Unicode glyph. Home Assistant room-sensor stale/error events identify the affected entity and zone, and historical event rows can recover that context from metadata.\n\n### 0.14.8\nRemaining Home Assistant and notification diagnostic errors no longer use device-transport 502 responses. Missing/invalid integration configuration returns 400, configured external dependency failures return 424, and 502 is reserved for Local/LAN GREE device communication.\n\n### 0.14.7\nHome Assistant energy-sensor discovery now returns an empty optional result when HA is not configured, uses 424 for configured external-dependency failures, and custom select popovers use their rendered height when positioning above a field.\n\n\n### 0.14.6\nFixes dynamic custom-select duplication in History → Energy and hides Energy history controls when no energy source is configured.\n\n### 0.14.5\nWeb UI single-choice controls now use one consistent custom dropdown, language packs are loaded on demand, and the dashboard outdoor temperature opens a 24-hour history modal.\n\n### 0.14.4\nHome Assistant connection tests validate only the configured server/API token and require no entity. `outdoor_entity_id` is the global Home Assistant outdoor-temperature sensor; zones can override it with `ha_outdoor_entity_id`. Room-temperature Home Assistant sensors remain configured per zone with `ha_entity_id`. Global/per-zone outdoor sensors are integrated with aliases, metrics/history and Visual Flow entity suggestions.\n\n### 0.14.2\nAdds independent vertical/horizontal swing controls across manual device control, thermostat zones, legacy automations, Visual Flow and Home Assistant zone climates. Swing is treated as an auxiliary one-shot unit setting and does not replace thermostat ownership.\n\n### 0.14.1\nAdds split/multisplit installation groups with shared energy and outdoor-temperature sources, multi-target energy charts with period comparison, cleaner Cloud status/alerts and safe MQTT cleanup after the last Cloud device is removed.\n\n### 0.14.0\nAdds first-class GREE Cloud MQTT status/control, reconnect/resubscribe lifecycle, Cloud diagnostics, per-device capabilities, Cloud/HA energy sources and energy-history aggregation while preserving the LAN transport contract.", "license": { "name": "MIT" } @@ -5646,7 +5646,7 @@ }, "version": { "type": "string", - "example": "0.14.13" + "example": "0.14.14" }, "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 59fd7f3..c588fd9 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.14.13", + "version": "0.14.14", "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 341fa2d..825d238 100644 --- a/ha-addon/repository/gree-controller/CHANGELOG.md +++ b/ha-addon/repository/gree-controller/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.14.14 + +- Makes the Home Assistant entity picker in `Reusable data -> Shared Flow input` explicit with a separate search box and selected `entity_id` field. +- Filters the live Home Assistant entity catalog by friendly name, `entity_id`, current state, unit and device class while typing. +- Keeps automatic Supervisor authentication, failed-test manual fallback and standalone Home Assistant behavior unchanged. + ## 0.14.13 - Shows Home Assistant Supervisor authentication as automatic in the add-on and hides manual URL/token/TLS fields by default. diff --git a/ha-addon/repository/gree-controller/config.yaml b/ha-addon/repository/gree-controller/config.yaml index 5a9a46b..cb3d855 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.14.13" +version: "0.14.14" slug: "gree_controller" description: "Local GREE HVAC controller with Web UI 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 29cea95..4f8c26a 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1350,6 +1350,10 @@ "settings.cloudConnectivityHistoryHint": "REST and MQTT measurements are stored in History → Pings together with Local/LAN measurements.", "history.networkJitterOn": "Jitter: on", "history.networkJitterOff": "Jitter: off", - "history.networkJitterToggleHint": "Show or hide jitter on the latency chart." + "history.networkJitterToggleHint": "Show or hide jitter on the latency chart.", + "flow.haEntitySearchLabel": "Search Home Assistant entities", + "flow.haEntitySearchPlaceholder": "Type a name, entity_id or state…", + "flow.haEntitySelectedLabel": "Selected entity (entity_id)", + "flow.haEntitySearchMatches": "{count} of {total} Home Assistant entities match" } } diff --git a/lang/pl.json b/lang/pl.json index d14adcc..4878cf0 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1350,6 +1350,10 @@ "settings.cloudConnectivityHistoryHint": "Pomiary REST i MQTT są zapisywane w Historia → Pingi razem z pomiarami Local/LAN.", "history.networkJitterOn": "Jitter: włączony", "history.networkJitterOff": "Jitter: wyłączony", - "history.networkJitterToggleHint": "Pokaż lub ukryj jitter na wykresie opóźnienia." + "history.networkJitterToggleHint": "Pokaż lub ukryj jitter na wykresie opóźnienia.", + "flow.haEntitySearchLabel": "Szukaj encji Home Assistant", + "flow.haEntitySearchPlaceholder": "Wpisz nazwę, entity_id lub stan…", + "flow.haEntitySelectedLabel": "Wybrana encja (entity_id)", + "flow.haEntitySearchMatches": "Pasujących: {count} z {total} encji Home Assistant" } } diff --git a/scripts/api_dev_test.py b/scripts/api_dev_test.py index 083af8a..3fbdc46 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.14.13. +"""Developer smoke/integration tests for GREE Controller API 0.14.14. 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.14.13" +DEFAULT_EXPECTED_VERSION = "0.14.14" SETTINGS_PATHS: dict[str, set[str]] = { "/api/settings/application": {"simulator_enabled"}, @@ -593,7 +593,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.14.13 contract", lambda: test_openapi(client, args.expected_version)) + runner.run("OpenAPI 0.14.14 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)) @@ -662,7 +662,7 @@ def run_suite(args: argparse.Namespace) -> int: def parse_args(argv: Optional[Iterable[str]] = None) -> argparse.Namespace: parser = argparse.ArgumentParser( - description="Developer smoke/integration tests for GREE Controller API 0.14.13.", + description="Developer smoke/integration tests for GREE Controller API 0.14.14.", formatter_class=argparse.RawDescriptionHelpFormatter, epilog="""Examples: python3 scripts/api_dev_test.py diff --git a/src/api/configuration.rs b/src/api/configuration.rs index 4c6e707..bd517aa 100644 --- a/src/api/configuration.rs +++ b/src/api/configuration.rs @@ -27,7 +27,7 @@ async fn export_configuration( fn validate_configuration_header(export: &ConfigurationExport) -> Result<(), AppError> { if export.format_version != 3 { - return Err(AppError::BadRequest("unsupported configuration export version; version 3 is required by GREE Controller 0.14.13".into())); + return Err(AppError::BadRequest("unsupported configuration export version; version 3 is required by GREE Controller 0.14.14".into())); } if export.settings.control_strategy != "setpoint" { return Err(AppError::BadRequest( diff --git a/web/js/settings-ui.js b/web/js/settings-ui.js index 5ff704a..aa7a262 100644 --- a/web/js/settings-ui.js +++ b/web/js/settings-ui.js @@ -139,8 +139,8 @@ function haEntityPickerResults(kind, query = '') { .slice(0, 12); } -function renderHaEntityPickerResults(input, kind) { - const picker = input?.closest?.('[data-ha-entity-picker]'); +function renderHaEntityPickerResults(queryInput, kind) { + const picker = queryInput?.closest?.('[data-ha-entity-picker]'); const host = picker?.querySelector?.('[data-ha-entity-results]'); const note = picker?.querySelector?.('[data-ha-entity-note]'); if (!host || !note) return; @@ -156,12 +156,23 @@ function renderHaEntityPickerResults(input, kind) { return; } - const items = haEntityPickerResults(kind, input.value); - note.textContent = tr('flow.haEntitySearchCount', { count: app.haEntityCatalog.length }); + const query = String(queryInput.value || '').trim(); + const matchingCount = (app.haEntityCatalog || []) + .filter(entity => haEntityMatchesSharedKind(entity, kind)) + .filter(entity => { + if (!query) return true; + const needle = query.toLocaleLowerCase(); + return [entity.entity_id, entity.name, entity.state, entity.unit, entity.device_class] + .some(value => String(value || '').toLocaleLowerCase().includes(needle)); + }).length; + const items = haEntityPickerResults(kind, query); + note.textContent = query + ? tr('flow.haEntitySearchMatches', { count: matchingCount, total: app.haEntityCatalog.length }) + : tr('flow.haEntitySearchCount', { count: app.haEntityCatalog.length }); host.innerHTML = items.length ? items.map(entity => { const title = entity.name || entity.entity_id; const state = `${entity.state || '—'}${entity.unit ? ` ${entity.unit}` : ''}`; - return ``; + return ``; }).join('') : `
${esc(tr('flow.haEntitySearchEmpty'))}
`; host.hidden = false; } @@ -171,7 +182,7 @@ async function loadHaEntityCatalog(force = false) { if (!force && fresh) return app.haEntityCatalog; if (app.haEntityCatalogLoading) return app.haEntityCatalog; app.haEntityCatalogLoading = true; - const activeInput = $('#flowSharedInputFields [data-ha-entity-search]'); + const activeInput = $('#flowSharedInputFields [data-ha-entity-query]'); if (activeInput) renderHaEntityPickerResults(activeInput, $('#flowSharedInputKind')?.value || 'ha_state'); try { const response = await api('/api/integrations/home-assistant/entities'); @@ -185,28 +196,39 @@ async function loadHaEntityCatalog(force = false) { app.haEntityCatalogLoadedAt = Date.now(); } finally { app.haEntityCatalogLoading = false; - const input = $('#flowSharedInputFields [data-ha-entity-search]'); + const input = $('#flowSharedInputFields [data-ha-entity-query]'); if (input) renderHaEntityPickerResults(input, $('#flowSharedInputKind')?.value || 'ha_state'); } return app.haEntityCatalog; } function haEntityPickerMarkup(kind, value, placeholder) { - return `
${esc(tr('flow.haEntitySearchHint'))}
`; + return `
+ + ${esc(tr('flow.haEntitySearchHint'))} + + +
`; } function bindHaEntityPicker(kind) { - const input = $('#flowSharedInputFields [data-ha-entity-search]'); + const queryInput = $('#flowSharedInputFields [data-ha-entity-query]'); + const selectedInput = $('#flowSharedInputFields [data-ha-entity-selected]'); const results = $('#flowSharedInputFields [data-ha-entity-results]'); - if (!input || !results) return; - const refresh = () => renderHaEntityPickerResults(input, kind); - input.addEventListener('input', refresh); - input.addEventListener('focus', refresh); + if (!queryInput || !selectedInput || !results) return; + const refresh = () => renderHaEntityPickerResults(queryInput, kind); + queryInput.addEventListener('input', refresh); + queryInput.addEventListener('focus', refresh); + queryInput.addEventListener('keydown', event => { + if (event.key === 'Escape') results.hidden = true; + }); results.addEventListener('click', event => { const option = event.target.closest?.('[data-ha-entity-value]'); if (!option) return; - input.value = option.dataset.haEntityValue || ''; - input.dispatchEvent(new Event('change', { bubbles: true })); + selectedInput.value = option.dataset.haEntityValue || ''; + selectedInput.dispatchEvent(new Event('input', { bubbles: true })); + selectedInput.dispatchEvent(new Event('change', { bubbles: true })); + queryInput.value = option.dataset.haEntityLabel || option.dataset.haEntityValue || ''; results.hidden = true; }); loadHaEntityCatalog().then(refresh); diff --git a/web/styles.css b/web/styles.css index 4f61ded..257eec4 100644 --- a/web/styles.css +++ b/web/styles.css @@ -9973,3 +9973,8 @@ select.select-native-proxy[aria-invalid="true"] + .custom-select .custom-select- .ha-entity-option small { flex: 0 0 auto; } .ha-entity-empty { padding: 9px 10px; } + +/* Shared Flow HA entity picker: keep search and selected entity visually distinct. */ +.ha-entity-search-field input[type="search"] { width: 100%; } +.ha-entity-selected-field { margin-top: 2px; } +.ha-entity-selected-field input { font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace); }