Get an orphaned Behmor Connected Brewer back onto your Wi-Fi after the official app and its servers were shut down — without the app, without an account, without the cloud.
The Behmor Connected (and the Char-Broil SmartChef grills) used a cloud IoT platform from DADO Labs, which no longer exists. The app can't log in, so it can't push your Wi-Fi to the brewer, so a power-cycled brewer just sits there blinking. This repo talks to the brewer's local setup interface directly and provisions it.
Illustrated guide: https://garalex.github.io/behmor-rescue/ — the same walkthrough with the DADO light states and the exact handshake, for owners who'd rather read than run code.
Status: provisioning works and is the reason this exists. Remote brew control does not — it ran through the dead cloud. See What you can and can't do and PROTOCOL.md for the full story.
Tested on macOS (Apple Silicon), Python 3.9+ (standard library only — no pip install).
# 1. Put in your home Wi-Fi (2.4 GHz-capable SSID, WPA/WPA2, 8-64 char password)
cp wifi.env.example wifi.env
chmod 600 wifi.env
$EDITOR wifi.env # set SSID= and PASS=
# 2. Press the DADO button on the brewer so its light blinks ~once per second.
# (The setup radio sleeps after ~5 min; the button wakes it.)
# 3. Run the one-shot provisioner. It temporarily joins the brewer's "DADO"
# hotspot, sends your credentials, then restores your normal Wi-Fi.
# Your Mac's internet drops for ~30 seconds while it's on the DADO network.
./tools/provision_dado.shWhen it finishes, the brewer leaves the DADO network, joins yours, and the DADO
light goes solid (no longer blinking). That's the goal: it's back on your network.
provision_dado.sh switches the Wi-Fi to DADO and back for you. If it can't (some
setups), do it by hand:
# join "DADO" from the macOS Wi-Fi menu (it's an open network), then:
python3 tools/provision.py wifi.env
# then rejoin your home Wi-Fi from the menuOn Linux/Windows the provision.py step is identical once you're joined to DADO;
only the automatic network-switching wrapper is macOS-specific.
The Behmor app historically let you, all via the DADO cloud:
- brew now — set cups, water temperature (190–210 °F), grind/roast style, pre-soak (bloom) time
- schedule / delay a brew — yes, morning-coffee scheduling
- stop or cancel a brew
- run a clean cycle, run calibration, keep-warm
- save favorites and quick-start presets, pull roaster "Buzz" profiles
- auto-reorder coffee via Amazon Dash, take firmware updates, see live status
Today, with the cloud gone, only provisioning works. Once the brewer is on your
Wi-Fi it exposes no local control port (verified by port-scanning: :9760 refuses
connections in normal mode, nothing on 80/443), because all of the above was relayed
through DADO's servers. So this toolkit gets your brewer connected and usable from its
own front panel, but it cannot (yet) start a brew over the network. The path that
could — impersonating the DADO cloud on your LAN — is described at the end of
PROTOCOL.md; it isn't built here.
Practically: the brewer's physical Start/Stop button still brews with the last settings. Provisioning mainly buys you a non-blinking light and a device that's ready for any future local-cloud project.
| File | What it does |
|---|---|
tools/provision_dado.sh |
Main entry point (macOS). Joins DADO, provisions from wifi.env, restores your Wi-Fi, then looks for the brewer on your LAN. |
tools/provision.py |
The pure provisioning step. Run it while joined to DADO. Sends SSID/PASS/SEC/DHCP/SAVE and prints each ACK/REJ/RSSI. |
tools/discover.py |
Broadcasts "D" to UDP 30303 and prints any brewer that answers (ip, product key). |
tools/brewer_ws.py |
Opens ws://<ip>:9760 and speaks the mbCORE framing (for experimentation / firmware-era messages). |
tools/wsclient.py |
Tiny dependency-free RFC-6455 WebSocket client used by the above. |
tools/tcpscan.py |
Async TCP port scanner, used to characterize the brewer on the LAN. |
provision.py reads wifi.env (default ~/src/behmor/wifi.env, or pass a path) so your
password never appears in shell history or process listings. wifi.env is git-ignored.
- An unprovisioned brewer broadcasts an open Wi-Fi network called
DADOand runs a WebSocket server atws://192.168.1.1:9760. - You join
DADO; the tool sends five JSON frames —SSID,PASS,SEC,DHCP, thenSAVE— and the brewer ACKs each. - The brewer saves the credentials, joins your network, and the DADO light goes solid.
Full frame-by-frame details, the cloud API it used to use, and the hardware are in PROTOCOL.md.
wifi.envholds your Wi-Fi password in plaintext; it is git-ignored and should staychmod 600. Never commit it.- The tools only talk to the brewer on your own LAN and to the brewer's own setup AP. Nothing is sent to any third party.
- This is unofficial, community-made, and not affiliated with Behmor or DADO Labs.
Protocol recovered by decompiling the last public build of the official
com.dadolabs.behmor app. See PROTOCOL.md for method and specifics.