Skip to content

v0.3.8

Choose a tag to compare

@eXPerience83 eXPerience83 released this 11 Oct 06:17
fcebba5

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 False only 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: idempotent async_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.