Releases: eman/homeassistant-quilt-hp
Releases · eman/homeassistant-quilt-hp
Release list
v6.0.0
Changed
- Upgraded
quilt-hp-pythondependency to>=0.5.6- 0.5.6 resolves
IndoorUnithardware exposure
(quilt-hp-python#19): indoor
units now carryserial_number,firmware_version, andmodel_sku(resolved from
indoor_unit_hardware, previously discarded) - Routine hourly token refresh on unary RPCs is now logged at
INFOinstead of
WARNING(quilt-hp-python#13) - Includes all 0.5.4 fixes: proto3 absence detection (sparse stream diffs no longer
zero room state, IDU controls, sensor readings, or controller temperatures when
merged into the snapshot), the transportUNAUTHENTICATEDretry that never
executed (clients broke permanently about an hour after token expiry), and stream
reconnect backoff/budget reset after a healthy connection (routine server-side
stream recycling no longer escalates to permanent 60-second delays or kills the
stream; non-gRPC failures reconnect instead of dying silently)
- 0.5.6 resolves
- Stream health is now tracked via the library's new
on_connectedcallback instead of
being inferred from incoming entity events - Sensor, binary sensor, and louver angle names now use translation keys
with HA sentence-case naming (e.g. "Wi-Fi signal"); the comms-health
sensor is a properENUMsensor with translated states - Louver angle select options are now lowercase translated keys (
horizontal,
slightly_down,down,mostly_down,straight_down) instead of raw enum names - Entity service actions now raise
HomeAssistantErrorwhen a Quilt API call fails
(previously a silent warning) - The
stream_degradedrepair issue is created as soon as the stream dies for good,
shows the actual configured polling interval, and is removed on unload - Schedule switch writes always trigger an immediate poll (location state is not
carried on the real-time stream) - Energy "today" window and
last_resetnow use local midnight instead of UTC midnight manifest.jsonnow declaresintegration_type: hubandloggersquality_scale.yamlrewritten in the standard machine-readable rules format- Rebuilt developer typing setup: mypy resolves the integration as
custom_components.quilt_hp(no longer shadowing thequilt_hplibrary, which had
silently degraded all library types toAny), and theattr-defined/unused-ignore
error codes are re-enabled
Added
- Indoor unit device cards now show the serial number and firmware version
(fromquilt-hp-python0.5.6), matching the outdoor unit and controller. - Climate Away preset (
PRESET_AWAY). Reflects Quilt's occupancy away state — set
automatically when a room is unoccupied or from the Quilt app — and can now be toggled
from the HA thermostat. Selecting Away activates the room's Away comfort setting;
clearing it restores the room's Active (normal occupied) setting (Quilt may re-enter
away automatically while the room stays unoccupied). - Per-space Active comfort setting diagnostic sensor (
ENUM: active/sleep/away/
standby/custom) reporting which comfort profile Quilt's scheduler is currently applying
to a room; the profile's configured name is exposed as thecomfort_setting_name
attribute. This replaces the removed climate preset control with a read-only,
non-misleading view of the same state. - Indoor unit fan speed is now a
selectentity (Auto / Quiet / Low / Medium / High /
Blast). Quilt's fan is always in one of these modes — there is no "off" — so a select
models it correctly, unlike a fan entity's on/off toggle. - Exception translations: entity action failures and re-authentication errors now use
translatable messages (exceptionssection instrings.json) - README: use cases and automation examples (presence-based setback, schedule
pausing, energy budgets, LED notifications) validated against a live system - Dynamic device support: indoor units, spaces, controllers, remote sensors, and
locations added to the Quilt account after setup now appear without a reload, and
devices removed from the account are cleaned from the HA registry at setup - Climate entities support
climate.turn_on/climate.turn_off
(ClimateEntityFeature.TURN_ON | TURN_OFF) - Config flow:
data_descriptionhelp text for all input fields; reconfigure now
validates that the entry's home exists on the new account and keeps the entry's
unique ID consistent when the email changes - Cached authentication tokens are deleted from HA storage when the last config entry
for an account is removed - Removal instructions in the README
Removed
- The
fanplatform / fan entity. The indoor unit fan cannot be turned off, so an HA fan
entity (which forces on/off semantics and previously faked "off" = Auto) was misleading.
Fan speed is now aselectentity (see Added). - The Fan speed (RPM) and Fan speed setpoint (RPM) diagnostic sensors. Raw fan RPM
is a low-level reading; the meaningful fan speed (theFanSpeedenum) is surfaced by the
new fan speed select. - The multi-entry climate preset list. Quilt's comfort settings (Active/Sleep/Away/
Standby/Custom) are mostly internal schedule states applied automatically by Quilt's
scheduler, not user-selectable presets, so exposing them all as HA presets was
misleading. Only Away — a genuine user-facing state — is now exposed, as
PRESET_AWAY(see Added). Setpoint display still falls back to the active comfort
setting's values when the API returns placeholder setpoints.
Fixed
HATokenStore.delete()no longer risks raising on a corrupted (non-dict) token
cache file; it now defensively clears the store instead, matchingload()'s
existing handling of malformed data.- The thermostat card no longer shows a low/high temperature range in single-setpoint
Heat or Cool mode.target_temperature_low/target_temperature_highare now reported
only in Heat/Cool (auto) mode, so Heat and Cool modes show a single target setpoint
instead of a spurious range alongside it. - Indoor unit and Dial devices are now named after the room they serve (e.g. "Family
Room Indoor Unit", "Family Room Dial") instead of Quilt's serial-based default name
("Indoor Unit {serial}"). A genuine user-set name in the Quilt app is still respected;
only the serial-duplicating default is replaced (the serial is on the device card). - Control writes (LED on/off, fan speed, louver, climate setpoints/mode) now update the
entity state immediately from the write's return value instead of waiting for the next
stream push. A controls-only change is not always echoed on the notifier stream, so
toggling the LED light (and other controls) could appear to do nothing while streaming. - Turning the indoor unit LED on when its stored color was black (color code 0) now
defaults to white, so the light actually illuminates instead of staying dark. - Fallback polling never refreshed the coordinator's entity lookup indexes, so all
entities froze at their last streamed state whenever the stream was down and only
recovered on the next push - Authentication-failure detection was dead code: the coordinator matched an error
string ("jwt is expired") that quilt-hp-python never produces, so an expired refresh
token caused endlessUpdateFailederrors instead of triggering HA's re-auth flow;
QuiltAuthErroris now mapped toConfigEntryAuthFailedin the polling, write, and
setup paths async_setup_entryconverted auth failures intoConfigEntryNotReady, retrying setup
forever instead of starting re-authentication- Re-authentication ended in an
already_configuredabort without updating or reloading
the entry (and could create a duplicate entry when listing systems failed); it now
ends withreauth_successfuland reloads the entry - Coordinator shutdown skipped
super().async_shutdown(), leaving the poll timer and
debouncer running against a closed gRPC channel after unload - A permanently dead stream (e.g. after a failed token refresh) was invisible:
is_streamingstayedTrueforever, post-write refreshes were skipped, and the
repair issue could never trigger; the coordinator now restarts a dead stream with
backoff, detects cleanly-ended streams from the poll path, and reportsis_streaming
truthfully - The reconnect gap-fill refresh used the debounced request path, so the first push
after a reconnect cancelled it and state changed while disconnected could be lost
until the next poll; the refresh is now un-debounced - Frequent stream pushes rescheduled HA's poll timer indefinitely, so locations and
comfort settings (which are not streamed) went permanently stale in busy homes; a
stale-snapshot check now forces a full refresh at the polling cadence - A setup timeout (
asyncio.timeoutcancellation) bypassed the client cleanup in
async_setup, leaking a gRPC channel on everyConfigEntryNotReadyretry - Config flow: adding a duplicate home leaked the paused login task and its gRPC
channel; abandoning the OTP dialog leaked them permanently (async_removenow cleans
up); an auth error at the email step was reported as "cannot connect" instead of an
authentication error light.turn_onwith no arguments was a no-op when the device reported the LED off
with a retained non-zero brightness; the restore guard now keys on the LED state- Duplicate
"entity"JSON key instrings.json/translations/en.jsonsilently
discarded the louver-mode state translations - Energy fetches could run concurrently from a burst of stream pushes and were retried
on every push while the energy endpoint was failing; fetches are now single-flight
and rate-limited on attempt time - NaN values from the API are now normalized to "unknown" for all numeric sensors
(humidity, power, COP, RPM, signal, presence level, light brightness), not just
temperatures, p...
v0.5.3
Fixed
- Stream-triggered energy fetches with an expired JWT could raise
AttributeErroron
config_entry.async_start_reauthwhenconfig_entrywasNone, and could re-login
more times than necessary on a single retry; the coordinator now guards the reauth call
and only re-authenticates once per failed energy fetch (thanks
@c00w,
#9)
v0.5.2
Fixed
- Upgraded
quilt-hp-pythondependency to>=0.5.3- Fixes a hang in
_make_cognito_client()where botocore's EC2 instance metadata
credential discovery (IMDS at 169.254.169.254) blocked the calling thread
indefinitely on non-EC2 hosts (e.g. Home Assistant Yellow), exceeding the 20-second
async_setupbudget and causingsetup_retryon every HA restart when the
Cognito token was expired
- Fixes a hang in
v0.5.1
Changed
- Upgraded
quilt-hp-pythondependency to>=0.5.1QuiltClient.close()now clears the cached token, preventing stale token access after closeinvalidate_snapshot()log level lowered fromWARNINGtoDEBUG, reducing log noiseinvoke_refresh_callbackdeduplicated into a single shared implementation; eliminates repeatedinspect.signature()calls on every token-refresh eventFanSpeed.to_wire()/LouverAngle.to_wire()no longer re-allocate mapping dicts on every call
Fixed
diagnostics.pyaccessedhass.data[DOMAIN][entry.entry_id](old pattern) instead of
entry.runtime_data; every call to the HA diagnostics page raisedKeyError- Config flow reconfigure + OTP: when the user changed email and OTP was required, the
success path called_create_entryand created a duplicate entry instead of updating the
existing one; added_reconfigure_entrytracking so the OTP success path routes to
async_update_reload_and_abortin reconfigure context - Config flow
async_step_otp:FlowError(e.g.AbortFlow) was caught by the generic
except Exceptionhandler and converted to an "unknown" error, silently preventing reauth
from completing when OTP was required;FlowErroris now re-raised - Energy refresh tasks are now created via
config_entry.async_create_background_taskso
they are cancelled on entry unload rather than outliving it - Stream-triggered energy fetch did not call
async_set_updated_dataafter updating
energy_by_space_id, so energy sensor entities would not re-render until the next
unrelated stream push; a new_update_energy_and_notify()wrapper calls
async_set_updated_dataonly when a fetch actually occurred (not on rate-limited early return) - Schedule switch called
coordinator.async_request_refresh()directly after writes instead
of_async_refresh_if_not_streaming(), causing unnecessary polls while the gRPC stream
is active - Removed redundant targeted dict mutations in stream handlers that were immediately
overwritten byasync_set_updated_data - Energy sensors stopped updating while the gRPC stream was active because
async_set_updated_datacancels pending coordinator polls; the coordinator now
explicitly checks whether an energy refresh is due on each stream push and fetches
if so, ensuring reliable 30-minute energy updates regardless of stream activity
(thanks @c00w, #3)
v0.5.0
Added
- Support for Dry Mode (dehumidification): New
HVACMode.DRYwith automatic humidity control- Dry mode states:
HVACState.DRY,DRY_DEFERRED,DRY_PREPARING - Dry mode maps to
HVACAction.DRYINGin Home Assistant - Temperature setpoint display disabled in Dry mode (server-side controlled)
- Dry mode states:
- Local Comms Health sensors for QSM (QuiltSmartModule) and Controller (Dial):
- Diagnostic sensors showing local Wi-Fi communication status
- Status values:
UNSPECIFIED,HEALTHY,DEGRADED,OFFLINE,STARTING_UP - Useful for troubleshooting local control connectivity
Changed
- Upgraded
quilt-hp-pythondependency to>=0.5.0- Brings in new DRY mode support and local comms health monitoring
LocalCommsStatusproto message structure for QSM and ControllerLocalCommsHealthStatusenum for health state
v0.4.0
sync changelog with manifest and tag
v0.2.0
Added
- Energy consumption sensors (power, accumulated energy) for indoor and outdoor units
- Schedule switch entity to enable/disable Quilt scheduling per space
- Comprehensive sensor coverage: space, IDU, ODU, QSM (radar/ALS), and Controller entities
- Controller (Quilt Dial) device with temperature sensor
- Multi-home selection step in config flow
- Brand assets (
icon.png,logo.png,icon.svg,logo.svg) for HA brands API - Docker Compose setup for local HA development and testing
- HACS validation GitHub Actions workflow (
hacs/action+hassfest)
Changed
- Integration display name renamed from "Quilt Heat Pump" to "Quilt"
- Spaces mapped to HA Areas (
suggested_area) instead of devices; IDU is the primary device per room - Outdoor unit linked to its indoor unit via
via_devicefor correct HA device hierarchy - ODU sensors created per IDU connection to support multi-IDU scenarios
- Upgraded minimum requirement to
quilt-hp-python>=0.3.0 - Minimum Home Assistant version set to 2026.3.0
Fixed
- OTP login flow: keep login task alive across config flow steps to prevent OTP rejection
- Louver angle availability check uses
louver_modeinstead oflouver_fixed_position - Louver angle select always returns a valid option
- Outdoor unit linking uses
space_idrelationship - IDU device model uses
hardware_idinstead ofsettings.name NotifierStreamuseson_errorcallback (replaces non-existenton_disconnected)- All strict mypy and basedpyright type errors resolved