Use Obico (AI failure detection, remote control, webcam) with an Elegoo Centauri Carbon running its stock firmware — no flashing, no OpenCentauri/COSMOS, no firmware modification.
This project is a small Docker container that speaks the printer's native
SDCP protocol and exposes a Moonraker-compatible API, which is exactly
what moonraker-obico expects. Everything happens on the network and in
Docker, so it is fully reversible: stop the container and your printer is back
to stock.
┌──────────────────────────────┐
│ Elegoo Centauri Carbon │
│ (stock firmware) │
│ │
│ SDCP WebSocket :3030 │
│ MJPEG camera :3031/video │
└───────────────┬──────────────┘
│
▼
┌──────────────────────────────┐
│ centauri-obico-bridge │ ← this project (port 7125)
│ SDCP ⇄ Moonraker API │
└───────────────┬──────────────┘
│ Moonraker HTTP + WebSocket JSON-RPC
▼
┌──────────────────────────────┐
│ moonraker-obico (agent) │
└───────────────┬──────────────┘
│
▼
┌──────────────────────────────┐
│ Obico (cloud or self-hosted)│
└──────────────────────────────┘
Obico only talks to printers through OctoPrint or Moonraker. The Centauri Carbon speaks SDCP (Chitu's Smart Device Control Protocol) and has no Moonraker server. This bridge translates between the two so you get:
- AI failure detection (spaghetti detection) with automatic pause
- Live webcam in the Obico app
- Print control: start / pause / resume / cancel
- Print status, progress, temperatures, layer info
- Upload a G-code to Obico and print it on the Centauri
| Feature | Status |
|---|---|
| Live status (progress, layers, temps, position) | ✅ |
| Webcam MJPEG stream + JPEG snapshot | ✅ |
| Obico failure detection → pause | ✅ |
| Start / pause / resume / cancel | ✅ |
| Upload & print G-code from Obico | ✅ |
| Job history / metadata | ✅ |
| Moonraker WebSocket JSON-RPC | ✅ |
| No firmware modification | ✅ |
| Fully reversible | ✅ |
- An Elegoo Centauri Carbon on your LAN with the stock firmware.
- A host that can run Docker (Linux recommended; the agent uses host networking, so Docker Desktop on macOS/Windows is not supported).
- An Obico account: cloud or a self-hosted server.
git clone https://github.com/absolutetheoG/centauri-obico-bridge.git
cd centauri-obico-bridge
./install.shThe script will:
- Check for Docker/Compose (and offer to install Docker if missing).
- Ask for your printer IP and your Obico server URL.
- Generate
.envandconfig/moonraker-obico.cfg. - Build and start the bridge and
moonraker-obico. - Wait until the bridge is healthy.
Then link the printer to Obico:
./install.sh --linkOpen the Obico app/web UI, add a Klipper printer, and enter the 6-digit code when prompted. That's it.
Useful commands:
./install.sh --status # containers + bridge health
./install.sh --link # link / re-link to Obico
docker compose logs -f # follow logs
docker compose down # stop everythingPrefer to understand every step? See docs/MANUAL_INSTALL.md. In short:
cp .env.example .env
# edit CENTAURI_HOST (and OBICO_SERVER_URL if self-hosting)
cp config/moonraker-obico.cfg.template config/moonraker-obico.cfg
docker compose up -d --buildIf you already run moonraker-obico elsewhere, use the bridge only:
docker compose -f docker-compose.bridge-only.yml up -d --buildAll settings live in .env (see .env.example):
| Variable | Default | Description |
|---|---|---|
CENTAURI_HOST |
– | Required. Printer IP or hostname |
CENTAURI_SDCP_PORT |
3030 |
SDCP WebSocket port |
CENTAURI_VIDEO_PORT |
3031 |
MJPEG camera port |
START_CALIBRATION |
1 |
Bed levelling on START_PRINT (1/0) |
OBICO_SERVER_URL |
https://app.obico.io |
Used to generate the agent config |
Additional bridge options (advanced, set in docker-compose.yml):
| Variable | Default | Description |
|---|---|---|
POLL_INTERVAL |
2 |
Seconds between status polls |
BRIDGE_PUBLIC_URL |
(auto) | Public URL used in /server/webcams/list |
SDCP_RAW_LOG |
– | Path to append raw SDCP traffic (JSONL) |
The bridge connects to ws://<printer>:3030/websocket and:
- keys every SDCP response by
Cmd+RequestID(they all share the samesdcp/response/<MainboardID>topic), - keeps the latest
sdcp/status/<MainboardID>andsdcp/attributes/<MainboardID>, - maps
PrintInfo.Statusto Moonrakerprint_stats.state, - translates Moonraker print commands back into SDCP commands,
- proxies the camera and extracts JPEG snapshots from the MJPEG stream,
- proxies G-code uploads to the printer's HTTP upload endpoint.
/server/info, /printer/info, /printer/objects/{list,query,subscribe},
/server/files/{list,metadata,upload}, /server/history/list,
/server/webcams/list, /server/database/item, /machine/update/status,
/printer/print/{start,pause,resume,cancel}, /printer/gcode/script, and a
Moonraker-compatible WebSocket at /websocket.
GET /webcam/stream– MJPEG proxyGET /webcam/snapshot– single JPEG frame (cached)
GET /healthGET /debug/state– parsed status / attributes / objectsGET /debug/raw– SDCP responses keyed by Cmd/RequestIDGET /debug/messages– last raw SDCP messages
The bridge reports centauri_connected: false.
Check the printer IP and that ports 3030/3031 are reachable:
curl http://<printer>:3031/video should stream MJPEG.
Obico shows the printer offline.
Check docker compose logs -f moonraker-obico. The agent must reach the bridge
on 127.0.0.1:7125 (it uses host networking).
A print started from Obico doesn't seem to launch.
The printer runs a long calibration (nozzle PID tuning + bed levelling) before
actually printing — up to ~5 minutes. During that time the state is reported
as printing but pause/cancel are ignored by the firmware. Wait for the
nozzle to reach temperature and the first layer to begin.
Uploading a G-code fails. The printer only accepts uploads while idle, not during a print.
- SDCP is a reverse-engineered, undocumented protocol. Mappings were validated against firmware V1.4.49; other firmware versions may differ.
- Obico's failure detection pauses the printer; it never auto-cancels.
- During the printer's calibration phase, pause/cancel commands are ignored by the firmware.
server/files/delete, timelapse and history video are not implemented.- Jog / home / temperature commands are translated best-effort.
How the protocol was mapped (SDCP command IDs, status codes, upload format) is documented in docs/REVERSE_ENGINEERING.md.
MIT. Not affiliated with Elegoo or Obico. moonraker-obico is a
separate GPL-3.0 project; this repository only runs its published image.
This project was built with the help of AI, using the DeepSeek API
(deepseek-v4-flash-vision-exp) through opencode.
The SDCP protocol was reverse-engineered by inspecting the stock web UI and by capturing live traffic, and the bridge, installer and documentation were written iteratively by an AI assistant that ran real tests against an actual Centauri Carbon (status capture, webcam, pause/resume/cancel, G-code upload and the full Obico integration). Review the code before trusting it on your own hardware.