# GREE Controller v0.4.5 - build and validation report ## v0.4.5 compile fix - Fixed Rust borrow-checker error `E0502` in `GreeProtocol::poll`. - The bound device key is now cloned into an owned `String` before mutating the `Device` with `apply_status`. - Subsequent full/core/`OutEnvTem` status requests borrow that owned key, so no immutable borrow of `device.key` survives across the mutable device update. ## Scope Version 0.4.4 fixes empty/under-populated history views and expands climate telemetry across GREE devices, zones and Home Assistant sensors. It also adds URL-addressable UI pages, History sub-pages, a saved/shareable custom chart composer, redesigned toasts and optimistic Quick Thermostat controls that no longer clear the active preset. ## History and chart changes - `readings` remains the independent history source for every GREE device, whether or not the device belongs to a zone. - Added bucketed device-history queries for indoor temperature, available GREE `OutEnvTem`, target and power. - Added `ha_readings` for configured HA room/outdoor sensors. - Existing `zone_readings` remains the rich thermostat timeline with GREE temperature, HA room temperature, control temperature, target, actual device setpoint, outdoor temperature, power, mode, fan, demand, source and preset. - `/api/history?scope=overview` returns device, zone and HA streams together plus row counts. - If a zone has no `zone_readings` yet, the API reconstructs a compatibility timeline from its existing device `readings` instead of returning an empty chart. - Older rich zone samples can be exposed as compatibility HA history when the dedicated HA table has not accumulated samples yet. - GREE polling now probes `OutEnvTem` separately after a core-property fallback so models that expose outdoor temperature can contribute that series without making the main poll fail. - History UI is split into Overview, Zones, GREE devices, HA sensors and Custom chart sub-pages. - Overview includes common charts for all GREE indoor temperatures, available outdoor temperatures and all zone control temperatures. - The custom chart composer can mix GREE device, zone and HA sensor series, save chart definitions in browser storage and serialize them into a shareable URL. ## Browser navigation and feedback - Main application views use stable paths such as `/dashboard`, `/devices`, `/zones`, `/schedules`, `/automations`, `/settings` and `/events`. - History uses `/history/overview`, `/history/zones`, `/history/devices`, `/history/sensors` and `/history/custom`. - Browser Back/Forward and direct page refresh are handled by History API routing plus the server-side index fallback. - Toasts are now stacked, theme-aware success/error cards with close controls and progress indicators. ## Quick Thermostat fix - `+/-` updates the displayed target immediately and batches rapid taps with a short debounce. - Stale HTTP responses cannot overwrite a newer tap. - Added `manual_setpoint` separately from `manual_preset`. - A temperature nudge no longer changes Auto/Comfort/Sleep/Away to `custom` or clears the active preset. - Manual temperature correction still expires at the next schedule boundary. ## SQLite / compatibility - Added `ha_readings` and indexes through idempotent `CREATE TABLE IF NOT EXISTS` schema initialization. - All SQL remains centralized in `src/queries.rs`. - Existing `readings`, devices, zones, schedules, automations and settings are preserved. - No database reset is required. ## Validation performed in packaging environment - JavaScript syntax: `node --check web/app.js`. - JSON validation for EN/PL language packs, PWA manifest and HA manifest. - Shell syntax validation for every `scripts/*.sh` file. - Python syntax validation for helper scripts. - SQLite execution tests for the schema, device bucket queries, zone bucket queries, HA bucket queries and history counts. - EN/PL translation-key parity check. - Verified project SQL statements remain centralized in `src/queries.rs`. - Verified no Node/npm/Tailwind runtime or build dependency exists. - ZIP integrity and SHA-256 manifest verification. A Rust toolchain is not installed in the packaging environment. The authoritative Rust compile/tests are therefore intentionally performed on the target LXC by `scripts/update.sh` before it replaces the running binary: ```bash cargo test --all-targets cargo build --release ```