You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changelog
[0.3.8] - 2025-10-11
Changed
CI: Run on Python 3.13 (latest patch) with a guard step enforcing >= 3.13.2.
Tooling: Set Black/Ruff target-version to py313; add requires-python = ">=3.13.2".
Tooling: Remove tool.black.required-version from pyproject.toml to align with CI (black==25.*) and prevent version mismatch failures.
Docs: Update README to reflect Python 3.13.2+, HA 2025.5+ compatibility, and 30s request timeout.
Security
Confirmed GitHub CodeQL code scanning is enabled (no duplicate workflow).
CI
Use actions/checkout@v5; keep owner guard in Auto Format push step to avoid failures on forks.
[0.3.8a4] - 2025-10-04
Changed
Switch: use Home Assistant event loop clock (hass.loop.time()) for optimistic TTLs instead of time.monotonic(), aligning with HA schedulers and easing testing.
Switch: cancel the delayed refresh handle to avoid stacked/late callbacks and use conservative idempotency for P1 ON/OFF (skip redundant commands when the requested power state is already active, considering optimistic TTL and backend snapshot).
API (auth/conn):
login() now returns Falseonly for HTTP 401 (invalid credentials) and raises on network errors or 5xx responses. This lets the config flow show the correct message (invalid_auth vs cannot_connect).
Write endpoints (/events, /devices/{id}) now use limited exponential backoff with jitter for HTTP 429/5xx, include a short cooldown after 429 (respecting Retry-After when present), and perform a single re-login on the first 401 before retrying once.
Climate: add conservative idempotency for P1 power commands (skip redundant ON/OFF when optimistic TTL or backend snapshot already match the requested state).
Number/Select: early-return idempotency when the requested value/option already matches the effective state (considering optimistic TTL first).
Added
Optional Number entities for unoccupied limits:
number.min_temp_unoccupied (12–22 °C)
number.max_temp_unoccupied (24–34 °C)
Root-level PUT to /devices/<id> with optimistic/idempotent updates.
[0.3.8a3] - 2025-10-03
Fixed
Climate: cancel scheduled delayed refresh when the entity is removed, and prevent stacked callbacks by cancelling the previous handle before scheduling a new one. This avoids spurious refreshes after teardown.
Added
Diagnostics: new diagnostics.py to provide a sanitized snapshot of the config entry and coordinator state. PII and secrets (email, token, MAC, PIN, GPS, etc.) are redacted via async_redact_data.
Changed
number.py / select.py: use Home Assistant event loop clock (hass.loop.time()) for optimistic TTLs to align with HA schedulers and simplify testing.
sensor.py: introduce internal _is_pii marker and strengthen opt-out cleanup:
remove PII sensors by exact unique_id (computed as device_id + '_' + attribute)
and keep a legacy suffix-based fallback for pre-existing entries.
[0.3.8a2] - 2025-10-01
Changed
HTTP timeout raised to 30s (from 15s) to better align with HA defaults and slow links.
Coordinator is now a small typed subclass, exposing api: AirzoneAPI without ad-hoc attributes.
Fixed
Climate: idempotentasync_set_hvac_mode — if the requested mode is already active and power is ON, skip sending redundant P2.
Docs
README/info: updated networking section to reflect the 30s timeout.
Pre-release version formatted as 0.3.8a2 to ensure proper ordering in HACS.
[0.3.8a1] - Unreleased
Changed
HTTP: Centralized browser-like User-Agent and endpoint-specific minimal headers.
GET /devices: only User-Agent (matches cURL usage).
POST /events: User-Agent, X-Requested-With, Content-Type, Accept.
Internals: Default request headers are now minimal; endpoint-specific headers are injected where required.