Skip to content

Releases: actabi/delonghi_coffeelink

v0.3.16 - Russian translations

Choose a tag to compare

@actabi actabi released this 22 Jun 12:57

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

Choose a tag to compare

@actabi actabi released this 18 Jun 18:11

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_machine MonitorV2 switches/alarms bitfields (DlghIoT layout).
  • MonitorV2 parsing of the 16-bit switches and 32-bit alarms bitfields.
  • Machine Status sensor now exposes switches/alarms as 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 on uses_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

Choose a tag to compare

@actabi actabi released this 17 Jun 20:32
1576ae1

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 Connected raw base64 (#7): now uses the property data_updated_at timestamp with device_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.

Credit: @kasiom (#7). 84 unit tests pass.

v0.3.13 - On-demand cloud session + confirm/retry (PR #8)

Choose a tag to compare

@actabi actabi released this 09 Jun 14:17

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_id showing 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)

Choose a tag to compare

@actabi actabi released this 07 Jun 21:38

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_session profile 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

Choose a tag to compare

@actabi actabi released this 07 Jun 19:12

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_STOP constants; the raw-command service goes through coordinator.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)

Choose a tag to compare

@actabi actabi released this 07 Jun 15:15

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)

Choose a tag to compare

@actabi actabi released this 07 Jun 14:33

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)

Choose a tag to compare

@actabi actabi released this 06 Jun 22:33

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 of if is_eletta branches across the coordinator. Adding first-class support for a new model is now a single ModelProfile subclass.
  • 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

Choose a tag to compare

@actabi actabi released this 06 Jun 21:03

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

  1. Update to v0.3.7, restart HA.
  2. Find the Dump Recipe Datapoints button (diagnostic) on your machine's device page and press it.
  3. Open Settings → System → Logs (filter delonghi), copy the block between recipe datapoint dump BEGIN and END, and paste it.

37 unit tests pass.