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.
Brew from your terminal · Beautiful web UI · HTTP API for automations · Works on Windows, macOS, Linux
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:8080from 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:
- Connects to your machine via BLE using a known service UUID
- Sends commands as structured binary packets with CRC-16 checksums
- Receives status via BLE notifications (machine state, alarms, brew progress)
- 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
- Make sure the coffee machine is powered on (display lit up)
- Disconnect the De'Longhi app on your phone — only one BLE connection is allowed
- Move closer to the machine (BLE range is ~10m)
- 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_readyistruein 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:
- Arbuzov/home_assistant_delonghi_primadonna — Home Assistant integration with verified command bytes
- manekinekko/cafy — TypeScript implementation with BLE packet documentation
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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| barista_coffee-0.1.0.tar.gz | 57.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.