Skip to main content

barista ☕

Control your De'Longhi coffee machine from your terminal, browser, or any automation.

An open-source BLE-to-HTTP bridge that turns your De'Longhi ECAM coffee machine into a fully automatable, API-driven appliance.

Python 3.11+ License: MIT


Brew from your terminal · Beautiful web UI · HTTP API for automations · Works on Windows, macOS, Linux


Barista Demo

The Problem

De'Longhi makes incredible coffee machines with Bluetooth — then locks you into their app. No automations. No API. No way to:

  • Brew coffee when your morning alarm goes off
  • Trigger an espresso from a keyboard shortcut
  • Monitor your machine from a smart home dashboard
  • Build anything custom around your coffee workflow

The Solution

Barista talks to your De'Longhi over Bluetooth Low Energy and exposes everything through a clean HTTP API and a beautiful web UI.

python -m pip install "git+https://github.com/asaf5767/barista.git@master"
barista scan                           # Find your machine
barista start --address AA:BB:CC:DD    # Start the server

Then open http://localhost:8080 — or hit the API from anywhere on your network.


Quick Start

1. Install

Requires Python 3.11+ and Git. Barista has not yet been released on PyPI; install directly from this repository until an official release is available.

python -m pip install "git+https://github.com/asaf5767/barista.git@master"

2. Find Your Machine

Make sure:

  • Your coffee machine is powered on
  • The De'Longhi app on your phone is disconnected (only one BLE connection at a time)
  • You're within Bluetooth range (~10 meters)
barista scan
Scanning for De'Longhi coffee machines...

Found 1 device(s):

  Name:    D1533270
  Address: 00:A0:50:2A:D2:8F

3. Start Barista

barista start --address 00:A0:50:2A:D2:8F
============================================================
  De'Longhi Coffee Machine Control
  Web UI:  http://localhost:8080
  API:     http://localhost:8080/api
============================================================

4. Brew

From the web UI:

Open http://localhost:8080 and tap a drink.

From the terminal:

# Espresso
curl -X POST http://localhost:8080/api/brew \
  -H "Content-Type: application/json" \
  -d '{"beverage": "espresso"}'

# Coffee with custom settings
curl -X POST http://localhost:8080/api/brew \
  -H "Content-Type: application/json" \
  -d '{"beverage": "coffee", "quantity_ml": 150, "aroma": 4}'

# Check status
curl http://localhost:8080/api/status

Web UI

Barista ships with a built-in web interface — dark-themed, mobile-friendly, real-time status updates.

  • Tap to brew any of 14+ beverages
  • Live machine status — state, alarms, nozzle detection
  • Connection management — reconnect with one click
  • Activity log — see what's happening

Access it at http://localhost:8080 from any device on your network.


HTTP API

All endpoints return JSON. Use from any language, any automation platform.

Method Endpoint Description
GET /api/status Machine state, alarms, readiness
POST /api/brew Brew a beverage
POST /api/brew/stop Stop current brew
POST /api/power Turn machine on
POST /api/steam Start steam wand
POST /api/hot-water Dispense hot water
POST /api/profile Select user profile (1-4)
GET /api/beverages List available drinks
GET /api/recipes List cached beverage recipes
POST /api/recipes/refresh Re-fetch recipes from machine
GET /api/scan Scan for BLE machines
POST /api/reconnect Force BLE reconnect

Brew Parameters

{
  "beverage": "espresso",
  "quantity_ml": 40,
  "aroma": 3,
  "temperature": 2
}
Parameter Values
beverage espresso, coffee, long_coffee, espresso_2x, doppio_plus, americano, cappuccino, latte_macchiato, flat_white, caffe_latte, hot_water, steam, ristretto, ...
aroma 1 (extra mild) → 5 (extra strong)
temperature 0 (low) → 3 (very high)
quantity_ml Depends on beverage (e.g., 25-250)

Status Response

{
  "connected": true,
  "state": "READY",
  "is_ready": true,
  "alarms": [],
  "nozzle": "DETACHED"
}

Automation Examples

Morning Coffee Cron Job (Linux/macOS)

# Brew a coffee every weekday at 7:00 AM
0 7 * * 1-5 curl -s -X POST http://localhost:8080/api/brew -H "Content-Type: application/json" -d '{"beverage":"coffee"}'

Python Script

import requests

# Check if machine is ready
status = requests.get("http://localhost:8080/api/status").json()
if status["is_ready"]:
    requests.post("http://localhost:8080/api/brew", json={
        "beverage": "espresso",
        "aroma": 4,  # strong
    })

Home Assistant (REST command)

rest_command:
  brew_espresso:
    url: "http://YOUR_PC_IP:8080/api/brew"
    method: POST
    content_type: "application/json"
    payload: '{"beverage": "espresso"}'

  brew_coffee:
    url: "http://YOUR_PC_IP:8080/api/brew"
    method: POST
    content_type: "application/json"
    payload: '{"beverage": "coffee"}'

  coffee_machine_power:
    url: "http://YOUR_PC_IP:8080/api/power"
    method: POST

Apple Shortcuts / HTTP Shortcut (Android)

Just point an HTTP action at:

POST http://YOUR_PC_IP:8080/api/brew
Body: {"beverage": "espresso"}

Node-RED

Use an HTTP Request node pointed at http://localhost:8080/api/brew with a JSON payload.


Supported Machines

Barista works with De'Longhi machines that use the ECAM Bluetooth protocol via the "De'Longhi Coffee Link" app.

Tested

Model Status
Dinamica Plus (ECAM 370.85 / 370.95) ✅ Fully working

Should Work (same protocol)

Model Notes
Primadonna Elite (ECAM 650.x) Same ECAM protocol, likely works
Primadonna Soul (ECAM 610.x) Same ECAM protocol
Dinamica (ECAM 350.x) Same ECAM protocol
Magnifica Evo (ECAM 290.x) Same ECAM protocol
Eletta Explore (ECAM 450.x) Same ECAM protocol

Your machine isn't listed? If it works with the "De'Longhi Coffee Link" app over Bluetooth, it likely uses the same ECAM protocol. Try barista scan — if it finds your machine, there's a good chance it works. Please open an issue to report compatibility!


Platform Notes

Windows

Works out of the box with Windows 10/11 and built-in Bluetooth. Uses the Windows BLE stack via bleak.

macOS

Works out of the box. You may need to grant Bluetooth permissions to your terminal app.

Linux

Requires BlueZ. You may need to grant BLE capabilities:

sudo setcap cap_net_raw+eip $(readlink -f $(which python3))

How It Works

Barista reverse-engineers the De'Longhi ECAM Bluetooth Low Energy protocol:

  1. Connects to your machine via BLE using a known service UUID
  2. Sends commands as structured binary packets with CRC-16 checksums
  3. Receives status via BLE notifications (machine state, alarms, brew progress)
  4. Exposes everything through a local HTTP API and web UI

The protocol uses:

  • Service UUID: 00035b03-58e6-07dd-021a-08123a000300
  • Characteristic: 00035b03-58e6-07dd-021a-08123a000301
  • Packet format: [0x0D] [length] [command] [params...] [CRC16]
  • CRC: CRC-16/CCITT with init 0x1D0F

For full protocol documentation, see docs/PROTOCOL.md.


Troubleshooting

"No machines found" during scan

  1. Make sure the coffee machine is powered on (display lit up)
  2. Disconnect the De'Longhi app on your phone — only one BLE connection is allowed
  3. Move closer to the machine (BLE range is ~10m)
  4. On Linux, make sure BlueZ is running and you have BLE permissions

"Connection failed"

  • The machine may have gone to BLE sleep — press any button on it to wake it up
  • Try again — BLE connections can be flaky on the first attempt
  • Barista has auto-reconnect built in; it will keep trying

Command sent but machine doesn't brew

  • Check that is_ready is true in the status response
  • The machine needs water, beans, and an empty drip tray
  • Some beverages (cappuccino, latte) require the milk frother to be attached

Contributing

Contributions are welcome! Especially:

  • Testing on other ECAM models — report which machines work
  • Protocol discoveries — new commands, parameters, or status fields
  • Platform fixes — BLE quirks on different OS versions
  • Integrations — Home Assistant components, Alexa skills, etc.

See CONTRIBUTING.md for guidelines.


Acknowledgments

The ECAM Bluetooth protocol was decoded thanks to the work of the open-source community:

Barista is an original implementation built from scratch, informed by the protocol knowledge documented by these projects.


License

MIT — see LICENSE.


Made with ☕ and a De'Longhi Dinamica Plus.

Metadata

Release files for barista-coffee 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for barista-coffee 0.1.0
File Size Uploaded Provenance
barista_coffee-0.1.0.tar.gz 57.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for barista-coffee 0.1.0
File Interpreter ABI Platform
barista_coffee-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 106.9 kB

Release files / barista_coffee-0.1.0.tar.gz

Download URL barista_coffee-0.1.0.tar.gz
Size 57.0 kB
Tags Source
SHA-256 checksum
How to use checksums
fd64e6c801291700b8c6e7afc8cfe9e35d76ffc0489df416f5914589833e653e
BLAKE2b-256 checksum
How to use checksums
b527b2637298589dfbf9fc6b2919fc03dc6e3d9ffc8d71d8a9fe6e525619e054
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release files / barista_coffee-0.1.0-py3-none-any.whl

Download URL barista_coffee-0.1.0-py3-none-any.whl
Size 49.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d561367b00e2898b743b14738b60318c9e734f58d21f70f4740cc40f51b8a2e5
BLAKE2b-256 checksum
How to use checksums
24849f5bd9064f0ec229a850be3fb8b9d2f16559a1d13cd9edf71cd48e23b70c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Security for barista-coffee 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for barista_coffee-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page