Releases: actabi/delonghi_coffeelink
Release list
v0.3.16 - Russian translations
What's new
- Russian translations (
ru.json) for config flow, entities and buttons - thanks @TischenkoArseny (PR #12).
This is a translation-only release: no Python/code changes, so behaviour on PrimaDonna Soul (DL-millcore) and Eletta Explore (DL-striker-cb) is unchanged.
Update via HACS, then restart Home Assistant to load the new translations.
v0.3.15 - Eletta maintenance binary sensors
Adds maintenance binary sensors for ECAM models (Eletta Explore, DL-striker-cb), cherry-picked from @TischenkoArseny's work in PR #9 / issue #7.
Added
- 4 maintenance binary sensors (ECAM only): Water tank empty, Waste container full, Decalcification needed, Filter change needed - decoded from the
d302_monitor_machineMonitorV2switches/alarmsbitfields (DlghIoT layout). - MonitorV2 parsing of the 16-bit
switchesand 32-bitalarmsbitfields. - Machine Status sensor now exposes
switches/alarmsas hex diagnostic attributes (ECAM only). - Entity-name translations (en/fr/cs) for the new binary sensors.
- Unit tests for the new bitfield parsing.
Notes
- PrimaDonna Soul (
DL-millcore) unchanged: every new entity/attribute is gated onuses_cloud_session, so the Soul gets no new entities and behaves identically. - The counter / Last-Connected improvements proposed in PR #9 are not included here - they were already shipped in v0.3.14 (issue #7, @kasiom), and this release builds on that.
Thanks to @TischenkoArseny for the contribution. 🙏
v0.3.14 - Eletta Explore counters, JSON counter parsing, i18n
Integrates the field-tested contribution from @kasiom (#7) after a security audit (no new hosts, no dynamic code/network) and a rework for testability.
Added
- Eletta Explore (450.65.G) counter sensors mapped from the real Ayla datapoint dump (#7): iced beverages, cold brew, hot/cold mug drinks, per-recipe totals, total descales (
d552), total water (d553), filters used (d554), filtered-water qty (d555). Each sensor is created only when its datapoint is present, so the PrimaDonna Soul is unaffected. - Czech localisation (
cs.json) and full French entity names.
Fixed
- JSON-aggregated counters (#7): newer models publish some counters (e.g.
d735_iced_bev,d738_cold_brew_bev) as a JSON blob; the sensor now sums the integer sub-values for the state and exposes the breakdown as attributes. Plain-integer counters (Soul) are unchanged. Last Connectedraw base64 (#7): now uses the propertydata_updated_attimestamp withdevice_class: timestamp.
Changed
- Entity names migrated to Home Assistant translation keys (sensors + buttons), HA best practice. Entity ids are unchanged, so existing dashboards/automations keep working.
Notes
- Issue #10 (counters frozen on the Soul) is a separate cloud-sync limitation, not addressed here.
v0.3.13 - On-demand cloud session + confirm/retry (PR #8)
On-demand cloud session, confirm/retry & diagnostics (Eletta / ECAM)
Merges @TischenkoArseny's cloud-session rework (#8), tested on a real Eletta Explore. The PrimaDonna Soul (DL-millcore) path is unchanged - all of this is gated behind ECAM/Eletta models (uses_cloud_session).
Fixes & changes (Eletta / ECAM only)
- Cloud session is now registered on demand, right before a command - never during the background poll. Fixes the "Your Eletta is already connected" block: Home Assistant no longer holds a permanent session, so the official Coffee Link app can claim its own slot again.
- HA now waits for the cloud to confirm the session before sending Wake/Standby. Ayla can take ~90 s (and sometimes several minutes) to acknowledge; before that, commands return HTTP 200 but the machine ignores them. The first press after a long deep-standby may take a couple of minutes.
- Transient Ayla errors (429/502/503/504) are retried instead of failing the command.
- Session is cleaned up on integration unload.
- New diagnostic sensor
Cloud Session app_idshowing who holds the session (free/ha/foreign).
Upgrade
Update via HACS, then restart Home Assistant (a reload does not reload the new code).
Relates to #1. Thanks @TischenkoArseny for the deep testing. ☕
v0.3.12 - Cloud session management (ECAM deep-standby fix candidate)
Added
Cloud session management for ECAM models 🔗 (PR #6 by @TischenkoArseny, following the DlghIoT connect() logic).
Before commands on Eletta-style models, the integration registers a cloud app session by writing timestamp + app_id to app_device_connected. This targets the deep-standby problem in #1 - the machine stopping to react to cloud commands until the official app "nudges" it.
- Eletta-only (
uses_cloud_sessionprofile flag): the PrimaDonna Soul path is byte-for-byte unchanged. - Command frames are NOT modified - learned replay stays verbatim; the session id is used only for the session property write.
- Cold connect runs in a background task (POST + 4 s settle) so button presses return immediately; a warm session (4 min cache) sends directly.
Changed (maintainer hardening on top of PR #6)
- Commands pressed during a cold connect are queued, not dropped.
- Adopting the official app's session id is transient: no background refresh of a foreign session, revert to our own id once released.
- Tests for the session helpers and the profile gating.
57 tests pass.
Eletta testers: this is the release to try for the wake-from-deep-standby problem - see #1.
v0.3.11 - Machine Status sensor
Added
"Machine Status" sensor 📊 - the machine's operational state (standby, waking_up, ready, rinsing, dispensing_hot_water, ...) decoded from the d302_monitor_machine monitor blob the machine already publishes, with progress/action/accessory as attributes.
Contributed by @TischenkoArseny (cherry-picked from PR #5), derived from the DlghIoT client by Matthieu Guerquin-Kern.
Parsing is defensive: a blob that doesn't decode on a given model yields an unknown state with the parse error as attribute, and can never break the data update.
Changed
- Buttons/services use
ACTION_START/ACTION_STOPconstants; the raw-command service goes throughcoordinator.async_send_raw(also from PR #5).
54 tests pass. No command-path behaviour change - wake, standby and beverage paths are untouched.
v0.3.10 - Standby button (remote power-off)
Added
Standby button - power the machine off remotely. ⏻
The power command family (0x84 0x0f) has a standby payload (params 01 01, CRC 0x0041) first reported on an Eletta Explore by @TischenkoArseny (#1) and validated live on the reference PrimaDonna Soul - the machine powers off exactly as with the physical button.
The official Coffee Link app exposes no power-off control, so the frame is always synthesized:
- Soul (
DL-millcore): works out of the box. - Eletta Explore (and other learn-and-replay models): the per-device signature is appended from any already-learned frame (e.g. the wake frame) - so once the one-time Wake teach step is done, Standby works too. Until then a best-effort unsigned frame is sent with a clear log message.
51 tests pass. Wake / beverage paths untouched.
v0.3.9 - Wake-learning guard (session-refresh packets)
Fixed
Wake learning can no longer be overwritten by session-refresh packets.
The official Coffee Link app emits 0x84 0x0f frames that are not a power-on (e.g. params 03 02, seen in issue #1 captures). The sniffer used to learn any power-family frame as the wake frame, so such a packet could silently replace the learned power-on frame and break the Wake button replay.
- Only frames with the real wake params (
02 01) are now learned as the wake frame. - A non-wake frame persisted by an earlier version is discarded at startup, with a log message asking to power the machine on once from the official app to re-learn.
No behaviour change on the PrimaDonna Soul (DL-millcore) or on the Eletta beverage learn-replay path. 44 tests pass.
Thanks @TischenkoArseny for spotting the overwrite path (#1).
v0.3.8 - Model profiles (extensible per-machine behaviour)
Internal refactor + docs, no functional change for supported machines.
- Per-model behaviour now lives in one class per machine family (
model_profiles.py:SoulProfile,ElettaProfile) instead ofif is_elettabranches across the coordinator. Adding first-class support for a new model is now a singleModelProfilesubclass. - Unknown models default to learn-and-replay (works on any Coffee Link machine once taught), avoiding the silent-failure an unrecognised model used to hit.
- README: "Adding a new machine model" - exactly what diagnostics to capture (device id, Last Captured Command per drink + wake, recipe dump) so a new machine can be added.
PrimaDonna Soul (synthesize) and Eletta Explore (learn-and-replay) behaviour unchanged. 41 unit tests pass.
v0.3.7 - Diagnostic: Dump Recipe Datapoints
Adds a read-only Dump Recipe Datapoints diagnostic button. It logs the recipe definitions the machine already reports (d059_rec_1_* …) plus the active profile, decoded to hex, between clear BEGIN/END markers - it sends nothing to the machine.
This surfaces the data needed to map a stored recipe to the beverage command's variable recipe block, the next step toward dropping the one-time "trigger the drink from the app" learning step (zero-touch).
How to use
- Update to v0.3.7, restart HA.
- Find the Dump Recipe Datapoints button (diagnostic) on your machine's device page and press it.
- Open Settings → System → Logs (filter
delonghi), copy the block betweenrecipe datapoint dump BEGINandEND, and paste it.
37 unit tests pass.