A premium Linux desktop app for controlling the JURA E4 coffee machine through the WiFi Connect V2 dongle. Reverse-engineered from the official J.O.E. Android app.
- Three products: Espresso, Coffee, Hot Water
- Adjustable strength (1-3), volume (slider), and temperature (Low/Normal/High)
- Confirmation dialog before every brew (safety)
- Live brewing animation with real-time progress and temperature from the machine
- Heating phase detection with pulsing "Heating up..." display
- "Enjoy your coffee!" completion feedback
- Lifetime product counters — how many espressos, coffees, and hot waters have been made
- Maintenance progress bars — Cleaning, Descaling, and Filter status (color-coded: green/amber/red)
- Cycle counters — number of maintenance cycles performed
- Maintenance warnings surface in the dashboard status bar when due
- Auto-connect on launch — tries saved IP, falls back to UDP discovery
- Auto-reconnect on unexpected connection drops (5 attempts, 5 seconds apart)
- Settings persistence — dongle IP and brew preferences saved across sessions
- Clear error messages (e.g. "Close J.O.E. on your phone first" when the dongle is busy)
- System tray — minimize to tray on close, quick-brew from the tray menu
- Dark theme with gold accents
- Custom-painted SVG/PNG icons
.desktoplauncher
The app has three screens:
- Connection splash — auto-connects on launch, manual IP fallback if needed
- Dashboard — product cards with brew controls, status bar with machine alerts
- Statistics — beverage counters, maintenance health bars, refresh button
- Python 3.10+
- PyQt5 5.15+
- bleak 3.0+ (BLE library — installed but only used by the reference protocol module)
- Linux with a desktop environment (tested on Linux Mint / Cinnamon)
- JURA WiFi Connect V2 dongle plugged into the coffee machine
- Machine and computer on the same local network
# Clone
git clone https://github.com/ovexro/JuraE4.git
cd JuraE4
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run
./run.shThe WiFi Connect V2 dongle requires a per-dongle authentication hash. This is a one-time setup — you extract the hash once and the app remembers it forever.
You need a packet capture of the J.O.E. app connecting to your machine. Pick whichever method works for your setup:
Option A — Wireshark (easiest if your PC is on the same WiFi)
- Install Wireshark
- Start capturing on your WiFi interface
- Open J.O.E. on your phone and let it connect to the coffee machine
- Stop the capture, save as
capture.pcap
Option B — tcpdump on an OpenWrt router
# SSH into your router
ssh root@192.168.1.1
# Capture traffic to/from the dongle (replace IP if different)
tcpdump -i br-lan -w /tmp/capture.pcap host 192.168.1.105 &
# Open J.O.E. on your phone, let it connect, then:
kill %1
scp root@192.168.1.1:/tmp/capture.pcap .Option C — tcpdump on Linux (if your network allows promiscuous mode)
sudo tcpdump -i wlan0 -w capture.pcap port 51515
# Open J.O.E. on phone, let it connect, then Ctrl+Cpip install scapy # one-time dependency
python3 tools/extract_hash.py capture.pcapOutput:
============================================================
AUTH HASH FOUND
============================================================
Device name: Your Phone
Auth hash: CCC3B0FDD2EE35B9...
Paste this hash into the JURA Desktop Control app
when prompted on first launch.
============================================================
On first launch, the app shows a setup screen. Paste the 64-character hash and click SAVE & CONNECT. Done — you'll never be asked again.
- Launch the app — it auto-connects to the dongle (saved IP from last session)
- If discovery fails, enter the dongle's IP manually (check your router's DHCP leases)
- Once connected, the IP is saved for next time
- Choose a product card (Espresso, Coffee, or Hot Water)
- Adjust strength, volume, and temperature
- Click BREW and confirm
- Watch the live brewing animation with real progress from the machine
- Closing the window minimizes to the system tray (stays connected)
- Right-click the tray icon for quick-brew shortcuts
- Select Quit from the tray menu to fully exit
- Click Statistics in the dashboard header
- View lifetime beverage counts and maintenance status
- Click Refresh to re-read data from the machine
jura_app.py PyQt5 GUI — all screens, widgets, animations
jura_wifi_v2.py WiFi V2 protocol client — encryption, auth, commands
jura_protocol.py BLE protocol module (reference — used for alert definitions)
jura_wifi.py ESP32 bridge client (legacy, not used)
esp32/ ESP32 MicroPython firmware (legacy, not used)
captures/ Network capture analysis tools
The WiFi Connect V2 dongle communicates over TCP port 51515 with a per-message nibble-substitution cipher. The encryption was reverse-engineered from the decompiled J.O.E. Android APK (WifiCryptoUtil.java).
Key commands:
| Command | Purpose |
|---|---|
@HP: |
Authentication (static hash per dongle) |
@TS:01/00 |
Start/stop session |
@TG:C0 |
Maintenance status (cleaning/descaling/filter %) |
@TG:43 |
Maintenance counters |
@TR:32,XX |
Product counters (lifetime totals) |
@TP: |
Brew command (product, strength, volume, temperature) |
@TV: |
Brew progress push (real-time % and temperature) |
@TF: |
Machine status bitmask (40+ alerts) |
The dongle handles all machine-level serial encryption internally — the desktop app only needs the WiFi-layer cipher.
- Main thread: Qt event loop (GUI rendering, signal dispatch)
- WiFiV2Manager: daemon threads for status polling, brew progress, statistics reading
- Communication: Qt signals with automatic cross-thread queuing
- Safety:
threading.Lockfor connection state,_sock_lockfor socket send/recv atomicity
Settings are stored in ~/.config/jura-desktop/settings.json:
{
"dongle_ip": "192.168.1.105",
"product_espresso": {"strength": 2, "volume": 45, "temperature": 1},
"product_coffee": {"strength": 2, "volume": 100, "temperature": 1},
"product_hot water": {"volume": 220, "temperature": 1}
}- Single connection: The WiFi V2 dongle accepts only one TCP connection at a time. Close the J.O.E. phone app before using the desktop app.
- E4 only: Tested exclusively on the JURA E4. Other JURA models may work if they use the same WiFi Connect V2 dongle, but product codes and register layouts will differ.
- No BLE brewing: The BLE Smart Connect dongle works for status reading but rejects brew commands from Linux (BlueZ ATT limitation). WiFi V2 is the only working brew path.
This project is an independent, personal work created for educational and interoperability purposes. It is not affiliated with, endorsed by, or associated with JURA Elektroapparate AG or any of its subsidiaries. "JURA", "J.O.E.", and "WiFi Connect" are trademarks of JURA Elektroapparate AG.
The communication protocol was reverse-engineered under the right to interoperability as provided by EU Directive 2009/24/EC (Article 6) and applicable fair-use principles, for the sole purpose of enabling a Linux desktop client to communicate with hardware owned by the user.
No proprietary source code, binaries, or assets from JURA are included in this repository.
Private — not for redistribution.
- Protocol reverse-engineering: decompiled from the J.O.E. Android app
- Built with Claude Code (Claude Opus 4.6)