diff --git a/Cargo.lock b/Cargo.lock index 275f651..1bf5040 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "gree-controller" -version = "0.14.19" +version = "0.14.20" dependencies = [ "aes", "aes-gcm", diff --git a/Cargo.toml b/Cargo.toml index 3f7f94e..dce7779 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gree-controller" -version = "0.14.19" +version = "0.14.20" 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 9f05e19..530cb21 100644 --- a/FILE_MANIFEST.sha256 +++ b/FILE_MANIFEST.sha256 @@ -1,17 +1,17 @@ 8c09c8a2203e7b42ba62cbf7a354e57cb70941a5ecc77949368770e65fe9c8f7 ./.dockerignore de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -dedaf21f819781eec228f2c0157763cede750924702188a0364c8ebb9883fd5c ./Cargo.lock -8d55d4634d79e78441cfbc4ffb7b4670b72e3db5479635b1c00c1a8b457c0c11 ./Cargo.toml +1cef28b62ca6f6a01736fc67d9639c909274b2a244c9276ebaacb51ffc662a3a ./Cargo.lock +6e563ec8c215326660c9e63ec7f079e5b892cfb58abd72cf55ac127f02ae3938 ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -31e586f1b862749e1b84b9377e84a4c7782b926b8750a32288c450b8f585e0b8 ./README.md -261aaaca41949e089df4a9534a81963f773e30f34e19969c1c0ca1ca6a8af13f ./SOURCE_MANIFEST.sha256 +046205c6a991bca9b514e507a35cebb875d3152d09a7cb02dfb69b5ac16eb640 ./README.md +7f9303a802cd5a7e23fdbe95b4625c39878f0331f3eb7b5f196255af46d0a2c5 ./SOURCE_MANIFEST.sha256 5302570299af2c2650bada12e123f598c5db8009949c75761385f73ed57343c5 ./build.rs -5dfcac9595844437fbc8f0bc18919cfced53b3d54983cddaa0cad6668614dd7b ./docs/API.md +5a673f26300c50aa393690332aed3ff6c8266a119d6a24dd4908ca6b19aa12a0 ./docs/API.md f21d732eb1147f8f3167d2172cdf0b57e61edabdfecbaf97811d46c5bff7e47a ./docs/FLOW.md -46530da47203469fd6212fe6d77381204a8d3d6947e8c0554245a90c4206c824 ./docs/openapi.json +8350a8466a1a9fec13cfc925ed8ecc3f441e4408c091aef2b820b53e1fa0e408 ./docs/openapi.json c65aa543d2e99f8f7d52736307b07ebd182597d80124661d53a16bb23f6f1118 ./ha-addon/.env.example -8e500c57acbd92551c503cb010ae992c1aac524b3720b1d40043d1c8a22ccac5 ./ha-addon/Dockerfile +ef8ee116505962c7e32c269c5131a99ed58da24e529246ed7e7118614fdbded8 ./ha-addon/Dockerfile adf7ff248d782a3b1cba82b8789c57b6849ddaaaf5fbc108af75e18b1534a885 ./ha-addon/README.md dd9291b12afade6fc20d66e80a5513251270e18e4c265260b2bbbe393a5a94c4 ./ha-addon/build.sh 082dfeb6326f3e1b9841ccf7f2954117ecdf0aa1a90b0aef1e6a1960dacdecbf ./ha-addon/home-assistant/README.md @@ -23,7 +23,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 -55d35c83df15e87c1e8a44120dc4bf8187b29cc880d8817d857bc15976114c51 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +e5ae5e7c1659ba7555801a35e8542f4b8b89d00e4b3d14eae2794fc731a226c5 ./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 @@ -31,10 +31,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 -88e6f4f911b3454fbdfc7d5cb9ea405d850f476f95f261e2fce03f45d4e4d6e7 ./ha-addon/repository/gree-controller/CHANGELOG.md +a256854c7b0200b3458e9ebdbc56c3f61c0dd8c62cc61a442ff038a6bdf40af8 ./ha-addon/repository/gree-controller/CHANGELOG.md 1b5599195329cc3e643c23aa1caadcec80f133e8e515eec7d92b9f3cbda5b80b ./ha-addon/repository/gree-controller/DOCS.md c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md -78898b62a10a4929fee6f1ccd1778620397a2aa55eb639d99e2061a7b58a57d6 ./ha-addon/repository/gree-controller/config.yaml +756a47c16ff9e52daa5ae6c539c8eba6b3bdb31aa932ac677c1c721d24c9dc09 ./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 diff --git a/README.md b/README.md index eafa034..29fe3d3 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.19** +**Version: 0.14.20** -Version 0.14.19 speeds up amd64/arm64 Home Assistant image builds by cross-compiling Rust on the build host with persistent Cargo caches while preserving the selected Alpine or Debian Trixie target runtime. It also deduplicates the GREE Cloud runtime-status request during the initial HTTP/WebSocket bootstrap. +Version 0.14.20 fixes the ARM cross-build bootstrap and improves Docker cache reuse: target Rust stdlib/toolchain setup is cached before source changes, dependency fetching is shared across architectures, and compiled target caches are separated per target architecture. Alpine/musl and Debian Trixie/glibc remain selected through `DISTRO` in the existing `build.sh` workflow. > [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 4618fff..86e661a 100644 --- a/SOURCE_MANIFEST.sha256 +++ b/SOURCE_MANIFEST.sha256 @@ -1,16 +1,16 @@ 8c09c8a2203e7b42ba62cbf7a354e57cb70941a5ecc77949368770e65fe9c8f7 ./.dockerignore de0793949cf01d27d903653226ecc9b5f72523d8711f20bcab022cf42c4c4ed0 ./.env.example a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore -dedaf21f819781eec228f2c0157763cede750924702188a0364c8ebb9883fd5c ./Cargo.lock -8d55d4634d79e78441cfbc4ffb7b4670b72e3db5479635b1c00c1a8b457c0c11 ./Cargo.toml +1cef28b62ca6f6a01736fc67d9639c909274b2a244c9276ebaacb51ffc662a3a ./Cargo.lock +6e563ec8c215326660c9e63ec7f079e5b892cfb58abd72cf55ac127f02ae3938 ./Cargo.toml 19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE -31e586f1b862749e1b84b9377e84a4c7782b926b8750a32288c450b8f585e0b8 ./README.md +046205c6a991bca9b514e507a35cebb875d3152d09a7cb02dfb69b5ac16eb640 ./README.md 5302570299af2c2650bada12e123f598c5db8009949c75761385f73ed57343c5 ./build.rs -5dfcac9595844437fbc8f0bc18919cfced53b3d54983cddaa0cad6668614dd7b ./docs/API.md +5a673f26300c50aa393690332aed3ff6c8266a119d6a24dd4908ca6b19aa12a0 ./docs/API.md f21d732eb1147f8f3167d2172cdf0b57e61edabdfecbaf97811d46c5bff7e47a ./docs/FLOW.md -46530da47203469fd6212fe6d77381204a8d3d6947e8c0554245a90c4206c824 ./docs/openapi.json +8350a8466a1a9fec13cfc925ed8ecc3f441e4408c091aef2b820b53e1fa0e408 ./docs/openapi.json c65aa543d2e99f8f7d52736307b07ebd182597d80124661d53a16bb23f6f1118 ./ha-addon/.env.example -8e500c57acbd92551c503cb010ae992c1aac524b3720b1d40043d1c8a22ccac5 ./ha-addon/Dockerfile +ef8ee116505962c7e32c269c5131a99ed58da24e529246ed7e7118614fdbded8 ./ha-addon/Dockerfile adf7ff248d782a3b1cba82b8789c57b6849ddaaaf5fbc108af75e18b1534a885 ./ha-addon/README.md dd9291b12afade6fc20d66e80a5513251270e18e4c265260b2bbbe393a5a94c4 ./ha-addon/build.sh 082dfeb6326f3e1b9841ccf7f2954117ecdf0aa1a90b0aef1e6a1960dacdecbf ./ha-addon/home-assistant/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 -55d35c83df15e87c1e8a44120dc4bf8187b29cc880d8817d857bc15976114c51 ./ha-addon/home-assistant/custom_components/gree_controller/manifest.json +e5ae5e7c1659ba7555801a35e8542f4b8b89d00e4b3d14eae2794fc731a226c5 ./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 -88e6f4f911b3454fbdfc7d5cb9ea405d850f476f95f261e2fce03f45d4e4d6e7 ./ha-addon/repository/gree-controller/CHANGELOG.md +a256854c7b0200b3458e9ebdbc56c3f61c0dd8c62cc61a442ff038a6bdf40af8 ./ha-addon/repository/gree-controller/CHANGELOG.md 1b5599195329cc3e643c23aa1caadcec80f133e8e515eec7d92b9f3cbda5b80b ./ha-addon/repository/gree-controller/DOCS.md c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md -78898b62a10a4929fee6f1ccd1778620397a2aa55eb639d99e2061a7b58a57d6 ./ha-addon/repository/gree-controller/config.yaml +756a47c16ff9e52daa5ae6c539c8eba6b3bdb31aa932ac677c1c721d24c9dc09 ./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 diff --git a/docs/API.md b/docs/API.md index b6a6925..6f1ec6c 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.19**. +HTTP and WebSocket API for GREE Controller **0.14.20**. [← Main documentation](../README.md) @@ -239,7 +239,7 @@ Response: { "status": "ok", "name": "gree-controller", - "version": "0.14.19", + "version": "0.14.20", "uptime_seconds": 1234, "control_ready": true, "time": "2026-08-30T06:54:00Z" @@ -302,7 +302,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.19", + "version": "0.14.20", "uptime_seconds": 1234, "auth_required": false, "control_ready": true, diff --git a/docs/openapi.json b/docs/openapi.json index 873f8fe..4d6ca45 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.19", + "version": "0.14.20", "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.19\nHome Assistant OCI builds now compile Rust for amd64/arm64 on the native build platform through xx cross-compilation, keep Cargo registry/target caches between builds, and send a smaller Docker context while preserving the selected Alpine (musl) or Debian Trixie (glibc) runtime. The Web UI also deduplicates the initial GREE Cloud runtime-status GET across the HTTP and WebSocket bootstrap renders.\n\n### 0.14.18\nShared Web UI CSS now uses generic reusable class names for segmented tabs, configuration layouts, chart cards, enable toggles, diagram primitives and Flow block categories; behavior and visual styling are unchanged.\n\n### 0.14.17\nHistory navigation now reuses the same segmented tab component as Flow / Schedules / Automations, with redundant History-specific tab CSS removed.\n\n### 0.14.16\nCustom Charts now expose saved-chart editing in the Web UI, public chart pages can switch history range through an optional hours override, and the standalone chart layout fits the viewport without vertical page scrolling.\n\n### 0.14.15\nHome Assistant add-on Custom Chart links now resolve the primary HA host IPv4 through Supervisor, support an explicit public_chart_base_url override, and enforce the fixed 8787 ingress/application port contract at startup and build time. Standalone bind/port behavior remains configurable.\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.", + "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.20\nFixes the ARM cross-build bootstrap by removing the invalid xx-cargo version probe, prepares the target Rust standard library in a cacheable pre-source layer, shares dependency fetching across target architectures, and isolates compiled target caches per architecture while preserving DISTRO-selected Alpine/musl and Debian Trixie/glibc runtimes.\n\n### 0.14.19\nHome Assistant OCI builds now compile Rust for amd64/arm64 on the native build platform through xx cross-compilation, keep Cargo registry/target caches between builds, and send a smaller Docker context while preserving the selected Alpine (musl) or Debian Trixie (glibc) runtime. The Web UI also deduplicates the initial GREE Cloud runtime-status GET across the HTTP and WebSocket bootstrap renders.\n\n### 0.14.18\nShared Web UI CSS now uses generic reusable class names for segmented tabs, configuration layouts, chart cards, enable toggles, diagram primitives and Flow block categories; behavior and visual styling are unchanged.\n\n### 0.14.17\nHistory navigation now reuses the same segmented tab component as Flow / Schedules / Automations, with redundant History-specific tab CSS removed.\n\n### 0.14.16\nCustom Charts now expose saved-chart editing in the Web UI, public chart pages can switch history range through an optional hours override, and the standalone chart layout fits the viewport without vertical page scrolling.\n\n### 0.14.15\nHome Assistant add-on Custom Chart links now resolve the primary HA host IPv4 through Supervisor, support an explicit public_chart_base_url override, and enforce the fixed 8787 ingress/application port contract at startup and build time. Standalone bind/port behavior remains configurable.\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" } @@ -5830,7 +5830,7 @@ }, "version": { "type": "string", - "example": "0.14.19" + "example": "0.14.20" }, "uptime_seconds": { "type": "integer", diff --git a/ha-addon/Dockerfile b/ha-addon/Dockerfile index bd7cd76..f8cf8b2 100644 --- a/ha-addon/Dockerfile +++ b/ha-addon/Dockerfile @@ -9,17 +9,28 @@ FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx FROM --platform=$BUILDPLATFORM rust:${RUST_VERSION}-trixie AS builder-trixie COPY --from=xx / / WORKDIR /src +ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ - && apt-get install -y --no-install-recommends clang lld llvm file pkg-config -ARG TARGETPLATFORM -RUN xx-apt-get update \ - && xx-apt-get install -y --no-install-recommends xx-c-essentials \ - && rm -rf /var/lib/apt/lists/* \ - && xx-cargo --version >/dev/null + && apt-get install -y --no-install-recommends clang lld llvm file pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# Fetch Rust dependencies before TARGETPLATFORM enters the cache chain, so the +# same registry/git cache is reused by amd64 and arm64 builds. COPY Cargo.toml Cargo.lock ./ RUN --mount=type=cache,id=gree-controller-cargo-registry,target=/usr/local/cargo/registry \ --mount=type=cache,id=gree-controller-cargo-git,target=/usr/local/cargo/git \ cargo fetch --locked + +ARG TARGETPLATFORM +ARG TARGETARCH +# Prepare the target C sysroot and Rust stdlib in a stable layer. Do not call +# the xx-cargo version probe: xx-cargo is a build wrapper and that invocation +# makes Cargo receive a target option without a subcommand. +RUN xx-apt-get update \ + && xx-apt-get install -y --no-install-recommends xx-c-essentials \ + && rm -rf /var/lib/apt/lists/* \ + && rustup target add "$(xx-cargo --print-target-triple)" + COPY build.rs ./ COPY src ./src COPY web ./web @@ -28,7 +39,7 @@ COPY presets ./presets COPY docs/openapi.json ./docs/openapi.json RUN --mount=type=cache,id=gree-controller-cargo-registry,target=/usr/local/cargo/registry \ --mount=type=cache,id=gree-controller-cargo-git,target=/usr/local/cargo/git \ - --mount=type=cache,id=gree-controller-target-trixie,target=/src/target \ + --mount=type=cache,id=gree-controller-target-trixie-${TARGETARCH},target=/src/target \ set -eux; \ xx-cargo build --locked --release --target-dir /src/target; \ binary="/src/target/$(xx-cargo --print-target-triple)/release/gree-controller"; \ @@ -40,13 +51,18 @@ FROM --platform=$BUILDPLATFORM rust:${RUST_VERSION}-alpine AS builder-alpine COPY --from=xx / / WORKDIR /src RUN apk add --no-cache clang lld llvm file pkgconf -ARG TARGETPLATFORM -RUN xx-apk add --no-cache xx-c-essentials \ - && xx-cargo --version >/dev/null + +# Keep dependency fetching architecture-independent here as well. COPY Cargo.toml Cargo.lock ./ RUN --mount=type=cache,id=gree-controller-cargo-registry,target=/usr/local/cargo/registry \ --mount=type=cache,id=gree-controller-cargo-git,target=/usr/local/cargo/git \ cargo fetch --locked + +ARG TARGETPLATFORM +ARG TARGETARCH +RUN xx-apk add --no-cache xx-c-essentials \ + && rustup target add "$(xx-cargo --print-target-triple)" + COPY build.rs ./ COPY src ./src COPY web ./web @@ -55,7 +71,7 @@ COPY presets ./presets COPY docs/openapi.json ./docs/openapi.json RUN --mount=type=cache,id=gree-controller-cargo-registry,target=/usr/local/cargo/registry \ --mount=type=cache,id=gree-controller-cargo-git,target=/usr/local/cargo/git \ - --mount=type=cache,id=gree-controller-target-alpine,target=/src/target \ + --mount=type=cache,id=gree-controller-target-alpine-${TARGETARCH},target=/src/target \ set -eux; \ xx-cargo build --locked --release --target-dir /src/target; \ binary="/src/target/$(xx-cargo --print-target-triple)/release/gree-controller"; \ 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 18af4e6..5275fbf 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.19", + "version": "0.14.20", "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 6143841..6427998 100644 --- a/ha-addon/repository/gree-controller/CHANGELOG.md +++ b/ha-addon/repository/gree-controller/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.14.20 + +- Fixes ARM cross-build startup by removing the invalid `xx-cargo --version` probe; `xx-cargo build` remains the cross-compilation entry point. +- Installs the Rust target standard library in a cacheable layer before project sources are copied, so source-only changes do not redownload/reinstall it. +- Fetches Cargo dependencies before target-specific setup so amd64/arm64 reuse the same registry/git cache. +- Separates compiled `target/` caches by target architecture to avoid multi-platform build contention while retaining incremental dependency reuse. +- Keeps the existing `build.sh` workflow and `DISTRO=alpine` (musl/Alpine) versus `DISTRO=trixie` (GNU/glibc Debian Trixie) runtime selection unchanged. + ## 0.14.19 - Speeds up multi-architecture OCI builds by running Rust/Cargo on `BUILDPLATFORM` and cross-compiling to amd64/arm64 instead of compiling ARM under QEMU. diff --git a/ha-addon/repository/gree-controller/config.yaml b/ha-addon/repository/gree-controller/config.yaml index 80568e7..d7e0e75 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.19" +version: "0.14.20" 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/"