Builds the model from a /bindings entry and its live attributes.
Wire identity from /bindings.
Live attribute payload from /devdata.
Optionaltimezone: string
IANA timezone anchoring derogation end dates; defaults to the runtime system timezone.
ReadonlyidWire did — the device's unique identifier.
Wire dev_alias — the user-facing device name; tracks renames across syncs.
ReadonlyproductProduct generation resolved from the wire product_key.
ReadonlyproductWire product_key hash.
ReadonlyproductWire product_name label.
The last-synced attribute payload.
The attributes as of the latest sync or decorated mutation.
When the running derogation (boost, vacation, presence countdown)
ends, or null when none is running or the deadline has passed.
The wire carries the derogation's duration but not its start, so
the end is derived when a change is observed. A derogation already
running when the SDK first sees the device therefore stays null
until it changes — a persistent client can bridge the gap by
retaining the last end it observed.
The derogation end date, or null.
The last non-stop mode observed — what "back on" restores to. Defaults to eco when the device has only ever been seen stopped.
The previous heating mode.
Merge a fresh (possibly partial) attribute payload into the model
and derive the transition state (previous mode, derogation end).
Explicit-undefined keys are dropped — a tolerant caller payload
cannot erase known state.
Fresh attribute payload from a sync or a decorated mutation echo.
In-memory model of one bound Heatzy device: wire identity, the last-synced attribute payload, and the derived state the wire does not carry (previous mode, derogation end date). Instances are created and updated exclusively by DeviceRegistry.syncDevices, which preserves object identity across syncs.