# GREE Controller v0.3.5 - build and validation report ## Scope Version 0.3.5 focuses on mixed-generation GREE networks and mobile day-to-day control. ### GREE protocol fixes - corrected the standard AES-128-ECB generic key, - corrected the standard AES-128-GCM generic key, - GCM now uses the fixed 12-byte nonce and `qualcomm-test` AAD used by EWPE/GREE Wi-Fi modules, - discovery detects GCM by the response `tag` and decrypts it with the GCM generic key, - discovery supports Auto/V1/V2 filtering and 1-10 repeated scan passes, - protocol packets use `cid="app"`, `i=1` for bind and `i=0` for status/commands, - Celsius commands follow the standard command payload and use whole-degree `SetTem`; `TemRec` is not misused as a Celsius half-degree flag, - bind refreshes the device with a direct scan and falls back between ECB/GCM, - discovery attempts an immediate bind and persists the successful protocol/key, - status falls back to a smaller core property list if a model rejects the extended list, - command failure triggers one fresh-bind retry before returning an error, - polling also performs a one-time rebind/retry before increasing the communication failure counter. ### Availability behavior - one UDP timeout no longer immediately marks a device offline, - a device is marked offline after 3 consecutive communication failures, - successful bind/poll/command resets the failure counter. ### Web UI - newly discovered units open a friendly-name step, and they can also be renamed later from the Devices view, - unnamed units receive a model/MAC-based fallback name instead of `Klimatyzator GREE`, - discovery dialog exposes Auto/V1/V2, scan passes and total scan time, - zone cards have direct +/- 0.5 C controller setpoint controls; physical GREE setpoints are normalized to whole Celsius degrees, - zone cards have direct Heat/Cool buttons without opening the edit dialog. ## Validation performed | Check | Result | |---|---| | JavaScript syntax (`node --check web/app.js`) | PASS | | JSON parsing for EN/PL language packs | PASS | | Shell syntax (`bash -n scripts/*.sh`) | PASS | | Python syntax for scripts and HA integration | PASS | | SQL remains centralized in `src/queries.rs` | PASS | | Package naming remains `gree_controller` / `GREE_CONTROLLER_*` | PASS | A full `./scripts/dev.sh --check` was attempted in the packaging environment, but Rust is not preinstalled and DNS access to `sh.rustup.rs` is blocked there. Final Rust type-check, tests and release build are therefore performed by `scripts/update.sh` or `scripts/install.sh` inside the target LXC. Recommended LXC update: ```bash sudo ./scripts/update.sh ./scripts/service.sh health journalctl -u gree-controller -n 150 --no-pager ``` For the reported mixed-model network, start discovery with **Auto (V1 + V2)**, 3 passes and 6000 ms. If fewer units appear, run V1-only and V2-only scans separately and inspect the service log.