# GREE Controller v0.7.2 - build and validation report ## Scope Version 0.6.7 includes the previous climate-group and whole-house changes plus a reorganized main dashboard. Global controls are consolidated, group control stays immediately below them, and lower-priority dashboard sections are collapsed on demand. ## Implemented changes - Night-mode settings moved out of application Settings into a dedicated **Night mode** page. - Home Assistant connection, sensor aliases and integration access tokens moved to a dedicated **Home Assistant / Sensors** page. - Settings now contains application/technical settings only. - Unit-feature controls on device cards are smaller, centered and visually aligned with the other compact device controls. - Disabled thermostat zones continue refreshing and showing room temperature while control commands remain disabled. - Home Assistant sensor aliases are now presentation-only end-to-end: backend reads resolve aliases back to the original `entity_id`, settings are canonicalized, and zone/outdoor polling records the real entity ID. - Outdoor temperature now falls back to the median outdoor reading from online GREE units when the configured Home Assistant outdoor sensor is unavailable. - GREE optional capabilities are discovered from status properties (`Lig`, `Quiet`, `Tur`, `Air`, `Blo`, `Health`, `SwhSlp`) and persisted with each device. - Supported unit features are shown in the Web UI and exposed as Home Assistant switches for panel light, Quiet, Turbo, X-FAN, Air, Health and Sleep. - Night mode can use native GREE Sleep in the same command as the standby setpoint, fan limit and Quiet when the unit supports it. - Home Assistant now exposes every controller zone as a full `climate` entity with Off / Auto (follow house mode) / Cool / Heat plus current and target temperature. Existing zone number/switch entities are retained. - Decorative icons were removed from Settings block headers. - Replaced the textual Connected/Disconnected label with a green/amber/red status dot in the top-left brand header. - Fixed History filter layout so Zone/Device/Sensor and time-range controls keep equal heights and do not stretch after changing tabs. - Reworked the Simulator into a Node-RED-style dotted flow board with connected live nodes for sensor input, thermostat target, decision, unit command and next event. - Added configurable night mode (default 22:00-06:00): thermostat fan speed is capped during quiet hours and compatible units can be asked to keep Quiet enabled. - Device cards now use **Name / protocol** instead of Rename and no longer show the fixed UDP port next to the IP address. - Settings are split into visual blocks; the self-signed HA example uses a generic private address instead of an installation-specific address. - Event/debug log retention is configurable and old rows are pruned automatically; the Events page can change retention and prune immediately. - Home Assistant temperature sensors can have UI aliases; aliases replace raw entity IDs in history selectors, legends and custom-chart labels without changing stored entity IDs. - Added a dedicated Web UI simulator page that visualizes thermostat/automation decisions as graphical blocks with hours, targets, demand, standby behavior, rule actions and upcoming events. - Quick Thermostat cards on the dashboard can enable/disable a zone directly; the edit dialog is no longer required for this action. - SQLite history housekeeping is tiered to chart resolution: full recent data, 10-minute buckets after 24 hours and 30-minute buckets after 7 days. - Optional long-term InfluxDB archive supports both InfluxDB 1.x (database/basic auth) and 2.x (org/bucket/token), from persisted settings or environment variables. - New samples are written to SQLite and InfluxDB in parallel when the archive is enabled. - Maintenance backfills compacted legacy SQLite samples older than the configured Influx handoff age. A local row is deleted only after the Influx batch succeeds; archive failures keep the SQLite copy. - History requests crossing the handoff age merge old InfluxDB data with recent SQLite data and fall back to SQLite when the archive query fails. - Device commands are reduced to fields that actually changed. Optional GREE buzzer suppression uses `Buzzer_ON_OFF`/`BuzzerCtrl`; incompatible devices automatically fall back to normal frames and are remembered for the running process. - Smart Fan now uses Low speed (`WdSpd=1`) when a zone is satisfied. The thermostat sends standby setpoint + Low fan + optional `Quiet=1` in one GREE frame. If a unit rejects `Quiet`, the controller retries without it and remembers that capability fallback until restart; when demand resumes, controller-owned Quiet is released on the transition. - Toast progress indicators have horizontal inset so they stay inside rounded toast corners. - Settings can be exported/imported as JSON. Metrics, event logs and generated API-token records are preserved during import. Exported configuration contains configured secrets and must be protected. - Optional on-screen debug overlay is available on every Web UI route, can be changed through `/api/debug`, shows controller events plus live HTTP method/path/status timing and can include sanitized decrypted GREE request/response payloads. - `/api/control-plan` exposes house state, current zone decisions, schedules, upcoming transitions and automation rules/time events. - The dashboard renders the control plan as blocks with current targets/demand and upcoming actions. - Home Assistant integration now also exposes whole-house/per-zone plan sensors, writable per-zone target-temperature `number` entities and per-zone enable `switch` entities via the restricted integration API. ## 0.6.1 compile hotfix - Fixed `u8`/`u32` mismatches in communication-failure threshold handling without changing the persisted `Device.communication_failures` type or notification-settings schema. - Removed the unused `AppState` parameter from Slack/Discord webhook delivery. - Bumped application, Cargo lock root package, Home Assistant custom-component and PWA cache versions to `0.6.1`. ## Validation performed in packaging environment - `node --check web/app.js`. - Python syntax validation for the Home Assistant integration and helper scripts. - Shell syntax validation for all `scripts/*.sh` files. - JSON validation for EN/PL language packs, PWA manifest, Home Assistant manifest and HA translations. - EN/PL UI translation-key parity and literal UI translation-reference validation. - SQLite schema execution plus tiered compaction and event-log retention tests. - SQLite archive-selection query tests for device, zone and Home Assistant histories. - Configuration-clear behavior verified to preserve metric history, event logs and API tokens. - Version consistency checked for Cargo package, Cargo lock root package, README and Home Assistant manifest. - Archive ZIP integrity and SHA-256 manifest are verified during final packaging. ## Rust compiler note The packaging environment does not contain `rustc`, `cargo` or `rustfmt`, so a Rust compile cannot be executed here. Rust unit tests cover unchanged-command filtering, history compaction, HA alias resolution, GREE outdoor fallback, night/native-Sleep decisions and combined standby command payloads; they cannot be executed in this packaging environment. The target LXC update/install scripts remain the authoritative compile gate and run: ```bash cargo test --all-targets cargo build --release ``` The update script must complete those commands before replacing the running binary. ## 2026-08-24 update Implemented from the current source archive: - Decimal thermostat input accepts both `.` and `,` in mobile/desktop UI via locale-independent parser and decimal keyboard hints. - Notifications persisted in runtime settings with Pushover, Slack and Discord providers, test endpoint/button, two modes (`problems`, `important`), per-event cooldown, communication failure threshold and target-not-reached timeout. - Device polling emits one offline anomaly after the configured consecutive-failure threshold and one recovery event when communication returns. - Zone control tracks continuous demand and emits a `zone.target_timeout` anomaly once per demand episode when the target is not reached within the configured time. - Automation dialog includes practical presets for high-temperature cooling, low-temperature heating, morning comfort and night power-off. - Event log page has level/category filters and stronger visual separation by category/severity. - Zone editor can copy thermostat tuning/profile settings from another zone without overwriting the destination zone identity, device assignment or HA entity. - Language selector shows flags; theme selector shows compact theme icons. - Home Assistant custom component includes `icon.png` and `logo.png` based on the existing project mark. - New installs create a minimal environment file, keep `SIMULATE=false` and `AUTO_SEED=false`, and intentionally allow an empty application token. Existing env files remain untouched. - Reverse-proxy support includes base-path routing, `X-Forwarded-Prefix`, prefix-aware UI/API/WebSocket/PWA assets and helper script health URLs. - Removed permissive CORS and added basic browser security headers. Notification webhooks are HTTPS-only, host-restricted and do not follow redirects. - Added `docs/SECURITY.md` and `docs/REVERSE_PROXY.md`. History review: the supplied counts (28,133 GREE, 1,889 zone, 5,626 HA samples) are modest for the existing SQLite design. The current schema already has time/entity indexes, history bucketing, query limits, retention and compaction, so no database migration was added solely for these counts. Validation performed in the build environment: - `node --check web/app.js` - passed. - JSON parsing of language files and web manifest - passed. - `bash -n scripts/install.sh` - passed. - Home Assistant icon files generated and verified as 256x256 RGBA PNG. - Rust compilation was not executed because this execution environment does not contain `cargo`/Rust toolchain. Backend changes were therefore statically reviewed but require the normal project CI/build host to run `cargo test`/`cargo build --release` before deployment. ## 0.6.2 thermostat copy hotfix - The destination zone identity is now stored independently from the form payload while editing. - Copy-source choices exclude the currently edited zone. - Copying thermostat settings explicitly preserves the destination zone ID, name, assigned device, sensor strategy/entity and enabled state. - Zone updates use the independently tracked destination ID, preventing the source profile from being overwritten by a stale or mutated form ID. ## 0.6.3 house climate mode highlight - The selected whole-house climate mode (Cool / Heat / Off) now has a persistent illuminated border, accent fill and glowing status dot. - The active mode is still derived from persisted `settings.house_mode`, so the highlight survives refreshes and reconnects. - Mode buttons now expose `aria-pressed` for an explicit accessible selected state. ## 0.6.4 Home Assistant zone thermostat naming - Zone climate entities now use a descriptive entity name, `Thermostat`. - New zone entities are therefore created as `climate._thermostat` instead of falling back to ambiguous numeric suffixes such as `_2`. - Existing zone climate registry entries are migrated on integration reload to the same scheme based on the zone's current name, fixing stale IDs left after zone renames (for example `climate.jan_2` for a zone currently named Igor). - Migration is collision-safe: if the desired `climate._thermostat` ID is already occupied, the existing entity ID is retained and a warning is logged instead of overwriting another entity. ## 0.6.5 house control, Home Assistant and LAN response time - Whole-house thermostat `off` is presented as **Do not control** and no longer continuously powers units down. Directly operated devices remain untouched, while a zone explicitly overridden to Heat/Cool can continue controlling its own unit. - Added a separate persistent whole-house master-power state. **Turn all off** powers enabled units down and prevents zone/controller automations from restarting them without modifying the selected thermostat mode/profile; **Turn all on** re-enables master power and powers enabled units on. - Whole-house mode and preset buttons use the same normal active fill as other controls; the obsolete activity-dot styling was removed. Uniform whole-house presets remain visibly selected, while mixed zone profiles show no false global selection. - Home Assistant now exposes controller-level **Thermostat mode** and **Work profile** select entities plus an **All air conditioners** master-power switch, backed by dedicated restricted HA endpoints. - Device state stores the latest successful GREE communication round-trip time. **LAN network -> Devices** displays it in milliseconds next to the IP address and protocol. - PWA cache key advanced to `gree-controller-v065`. ## 0.6.6 synchronized whole-house activation - The global power panel is displayed above **House climate mode**. - Selecting whole-house Cooling or Heating clears a previous global power-off and powers on all enabled units. - Selecting Auto, Comfort, Sleep or Away as a whole-house profile does the same. - House mode `off` / **Do not control** remains non-invasive and does not alter master power. - The behavior is implemented in the shared backend endpoints, so Home Assistant house-mode/profile controls follow the same rules. ## 0.6.6 climate groups, HA off-target and standalone simulation - Added persistent named climate groups based on thermostat zones, with independent group power, Heat/Cool/whole-house-follow mode and Auto/Comfort/Sleep/Away profile control. - Added group controls directly below the global **All air conditioners** panel plus a dedicated **Groups** view for membership management. - Whole-house **Turn all on**, Cooling/Heating and whole-house profile activation now re-enable all groups as part of their existing "all units" semantics; global power-off remains the authoritative master block. - Automation actions can target either a direct device or a climate group and can apply group mode/power/profile changes. - The control plan keeps a resolved thermostat target temperature while a zone, group or whole-house inherited mode is off, so Home Assistant zone climate entities no longer expose the configured target as `unknown` solely because control is disabled. - Home Assistant documentation and zone attributes clarify that zone thermostat **Auto** means follow the controller's whole-house Heating/Cooling mode; the direct physical-device climate entity still uses native GREE Auto. - The simulator can be opened as a standalone new-tab view, switched to browser full-screen mode, and filtered by individual unit or climate group. - Configuration backup/import, bootstrap/WebSocket state, SQLite schema and API documentation include groups. Validation performed in this packaging environment: - `node --check web/app.js` and `node --check web/sw.js`. - Home Assistant Python modules compiled with `python3 -m py_compile`. - English/Polish translation packs parsed and checked for key parity and static UI references. - HTML IDs and translation references checked for duplicates/missing keys. - `INIT_SCHEMA` executed against an empty SQLite database and the new `climate_groups` table verified. - Rust compilation cannot be executed here because the environment does not contain `cargo`, `rustc` or `rustfmt`; the backend changes were statically reviewed and still require the normal LXC/CI `cargo test --all-targets` and `cargo build --release` gate before deployment. ## 0.6.7 dashboard hierarchy - Reorganized the main dashboard into three levels: whole-house controls, climate-group controls, and secondary details. - Global master power and whole-house climate mode/profile now share one panel instead of competing for separate dashboard space. - Group controls remain directly below global control, use a compact horizontal strip, and omit duplicate mode/profile/member summary boxes on the dashboard while retaining full details on the Groups page. - Control plan, quick thermostats and direct device controls remain available from the dashboard but are collapsed by default and can be expanded independently. - Dashboard section badges show current group, zone and device counts. - Mobile layout keeps global actions and expandable sections compact without removing any controls. - PWA cache key advanced to `gree-controller-v067-dashboard` so the reorganized web assets replace cached v0.6.6 files after update. ## 0.6.8 compact dashboard without horizontal scrolling - Removed the horizontally scrolling group strip from the main dashboard. - Dashboard group cards now use a responsive wrapped grid and flow into additional rows. - Group mode/profile controls use fixed grids on the dashboard, so they never require horizontal scrolling. - Whole-house profile controls also wrap into a grid on narrow screens. - Kept Control plan, Zones and Devices as collapsed disclosure panels. - Reduced dashboard hero, metric, global-control, group-card and disclosure spacing for a denser layout without removing functionality. - Advanced PWA cache key to `gree-controller-v068-dashboard-wrap`. ## 0.6.9 dashboard fit, compact summary and group-aware control plan - Reworked dashboard Quick Thermostats so the target-temperature control occupies its own row and measured/device-target temperatures sit below it; labels no longer collide or clip in medium-width cards. - Kept the quick-thermostat list as a wrapped responsive grid with no horizontal scrolling. - Compressed the Home / Comfort under control summary into one short card; average temperature and small online/active/demand counters now share the same row instead of consuming a separate large hero plus metrics row. - Reduced dashboard control-plan blocks to compact simulator-style cards. - Added explicit climate-group cards to What happens next, combining member demand and upcoming member-zone events. - Zone plan cards identify their climate group membership, and automation plan rows preserve group targets. - Advanced the PWA cache key to `gree-controller-v069-dashboard-fit`. ## 0.7.0 UI cleanup and scheduler/automation integrity audit - Removed directional arrow glyphs from Swing controls on dashboard and device cards. - Removed the divider above the unit feature block and tightened desktop quick-mode/fan controls so all buttons fit without horizontal scrolling. - Allowed the detailed zone quick-change hint to wrap naturally on desktop. - Added an explicit Mode policy hint: keep Follow house mode when the zone should inherit the global GREE Controller mode; fixed Cooling/Heating are intentional overrides. - Fixed the Always-comfort schedule template to represent a true 24-hour window without a one-minute gap. - Added overlap detection for enabled schedules, including overnight windows, and deterministic handling for legacy overlapping rows. - Fixed the Workday template Sunday-to-Monday handoff so Sunday Sleep ends at 06:30 before Monday Morning starts. - Manual zone/profile overrides now expire at the actual next weekly schedule transition; if none exists, they remain active until explicitly cleared instead of expiring after an arbitrary fallback timeout. - Editing/deleting/applying schedule templates refreshes the active manual-override boundary. - Time automations are limited to one execution per local minute even with the minimum 30-second cooldown; failed actions now also observe cooldown to avoid retry/log storms. - Temperature automations ignore stale readings from disabled/offline trigger devices. - Direct-device automations cannot wake a unit blocked by a disabled climate group. - Group power-on respects other disabled overlapping groups; group power-off remains authoritative. - Automation creation/import validates target/trigger references, empty actions and unsupported group-action fields. - Device/zone deletion now protects automation/group references and removes orphaned schedules. A physical device can be assigned to only one thermostat zone. - Control-plan event timestamps are normalized to minute boundaries; time-event preview covers DST-length local days. - Added Rust unit-test cases for overnight/full-day schedules, overlap detection, weekly boundary lookup, Workday weekend handoff and one-fire-per-minute time automations. Rust compilation/tests still require a host with the Rust toolchain (`cargo`/`rustc`); this build environment does not provide it. Static frontend, JSON, Python/Home Assistant, archive and manifest validation are performed below. Validation for the 0.7.0 package: - `node --check` passed for `web/app.js` and `web/sw.js`. - PL/EN JSON and Home Assistant manifest parsed successfully; PL/EN translation key sets are identical (578 keys each). - Home Assistant Python modules passed `python3 -m py_compile`. - `web/index.html` parsed with Python's HTML parser; CSS braces are balanced. - No Swing arrow glyph remains in web controls, the device feature divider rule is removed, and the detailed-zone quick hint has an explicit wrapping rule. - All built-in schedule templates were exercised against the weekly minute-mask model: no overlaps; Family/Child/Bedroom/Always cover the full week, and Workday's intentional uncovered period falls back to the normal Comfort profile. - SQLite `INIT_SCHEMA` and device-delete orphan-schedule cleanup SQL were executed successfully against temporary in-memory databases. - Rust source delimiter/static checks passed. Rust compile/test execution is unavailable here because no Rust toolchain is installed. ## 0.7.1 quick-control visual consistency - Refactored dashboard-only thermostat/device controls to semantic `quick-control-card` and `quick-control-row-*` classes. - Quick thermostat preset/mode controls and quick manual HVAC/fan/function controls now share the same compact height, spacing, typography and fixed responsive grids. - Removed the superseded `#dashboardDevices` desktop-only size override; full Devices/Zones views remain unchanged. - Changed the compact inherited-mode label from `Dom/House` to `Globalny/Global`, while retaining the internal `house` value for API/backward compatibility. - Changed `Sen teraz/Sleep now` to `Sen/Sleep`. Validation for the 0.7.1 package: - `node --check` passed for `web/app.js` and `web/sw.js`. - PL/EN JSON parsed successfully and translation key sets are identical (574 keys each). - Home Assistant manifest parsed successfully and Home Assistant Python modules passed `python3 -m py_compile`. - `web/index.html` parsed with Python's HTML parser and CSS brace balance passed. - Static assertions confirm the compact classes are attached only to dashboard quick cards (`detailed == false`), while full Zone/Device cards keep their existing classes and sizes. - Quick controls use explicit 3/4/5-column grids with no horizontal overflow behavior; all compact option buttons share the same 28 px minimum height, 9 px typography and 4 px gap. - User-facing inherited-mode labels are `Globalny/Global`; the internal/API value remains `house`, preserving backward compatibility. - No thermostat, schedule, automation, group, database or device-control logic was changed in 0.7.1. ## 0.7.2 zone configuration separation - Reworked the Zones list into read-only status + configuration cards. - Removed live temperature, preset, mode and enable/disable controls from the Zones list. - Added navigation from a zone configuration card to its matching Dashboard quick thermostat. - Kept backend zone-control endpoints and thermostat logic unchanged. - Kept the legacy `setpoint` field in form submission as a hidden compatibility value while profile temperatures remain the explicit configuration surface. ## 0.7.2 packaging hotfix - Corrected an invalid `Cargo.lock` entry that labeled the `tokio-util` package as `0.7.29` while retaining the checksum and dependency resolution for `0.7.19`. - Restored `tokio-util = 0.7.19`, which satisfies `tower-http 0.6.11` (`^0.7`) and is present in the crates.io index used by the target LXC. - No application source, database schema, scheduler, automation, device-control or Web UI logic changed in this hotfix.