Releases: eman/quilt-hp-python
Releases · eman/quilt-hp-python
v0.4.0
v0.3.2
Added
LouverAngle.labelproperty and__str__with human-readable position names:
ANGLE1→"Horizontal",ANGLE2→"Slightly Down",ANGLE3→"Down",
ANGLE4→"Mostly Down",ANGLE5→"Straight Down"
v0.3.1
Fixed
RST_STREAM with error code 0(HTTP/2NO_ERROR, a normal server-side graceful reset) is now logged atDEBUGinstead ofWARNINGto reduce log noiseCANCELLED(server closed the stream normally, e.g. keepalive timeout or server rotation) is now logged atINFOinstead ofWARNINGUNAUTHENTICATEDreconnects handled by the automatic token refresh are now logged atINFOinstead ofWARNING
v0.3.0
Added
NotifierStreamhealth properties:is_connected,last_event_at,stream_stateNotifierStreamdebounce_sparameter to coalesce rapid update burstsMetricBucketStatusenum exposed onEnergyBucket.status(was untypedint)grpc_call()context manager inservicesfor consistent gRPC error translation and optional retry- Structured
logging.getLogger(__name__)across all modules (auth, client, transport, services, CLI) QuiltStreamErrorre-exported from the top-levelquilt_hppackage- Shared model helpers (
_helpers.py) for WiFi signal parsing and hardware lookup
Changed
ScheduleEvent.hvac_modeis now typed asHVACMode(wasint)- Token temp file created with
os.open(..., 0o600)so permissions are secure from creation (no transient world-readable window) - Signature cache in transport layer uses
weakref.WeakKeyDictionaryinstead ofdict[int, bool]— prevents unbounded growth and id-reuse bugs after GC login()clears the token cache so a re-login always fetches fresh credentials_GrpcCallContextavoids self-chaining when re-raising aQuiltErrorunchanged
Fixed
EnergyBucket.has_missing_energy_valuenow treatsNone(absent proto field) as missing, not justNaN; preventsTypeErrorinSpaceEnergyMetrics.total_kwhMetricBucketStatus()conversion inget_energy_metricscatchesValueErrorfor unknown server values and falls back toUNSPECIFIEDinstead of raisingWeakKeyDictionary.get()for the refresh-callback signature cache is now guarded againstTypeErrorfor non-weakrefable callables- AUTO mode setpoint deadband clamp now runs before setpoint selection, ensuring the correct (clamped) value is sent to the device
- CLI settings
boolcoercion usesisinstance(v, bool)to avoidbool("false") == True - Zero-value proto3 fields (0 °C temperature, 0 dBm WiFi signal, 0% humidity) are now preserved instead of being dropped as falsy
NotifierStreamreconnect subscription is now protected by anasyncio.Lockto prevent concurrent subscribe/reconnect races- CLI enum lookups raise a clear error showing valid options on invalid input
auth.pynarrows broadexcept Exceptiontoexcept (QuiltAuthError, ClientError)to avoid swallowing unexpected errors
v0.2.2
Fixed
- Corrected mapping of outdoor units to indoor units in SystemSnapshot
- Fixed TUI interaction issues with button handling and bindings
v0.2.1
Fixed
- Restored CI/release quality-gate stability by applying required
ruff format
updates in model files.
v0.1.4
Fixed
boto3.client()was called synchronously inside async functions, causing a
blocking HTTP request to the EC2 instance metadata service (IMDS) at
169.254.169.254during credential resolution. This manifested as an
HTTPClientErrorin Home Assistant's async event loop. The client is now
created vialoop.run_in_executor()like the subsequent API calls.
v0.1.3
Fixed
- Regenerated gRPC stubs with
grpcio-tools==1.78.0so the library works
inside Home Assistant, which hard-pinsgrpcio==1.78.0in its package
constraints. Previously the stubs were generated with 1.80.0 and raised
RuntimeErrorat import time on older grpcio versions.
v0.1.2
chore: bump version to 0.1.2
v0.1.1
chore: bump version to 0.1.1