A complete, ready-to-build Dockerized project that provides a private "Roomba cloud" with a backend using dorita980 and a simple frontend UI. Control your iRobot Roomba vacuum cleaner from a web interface on your local network.
- Web-based Control Interface: Clean, responsive UI for controlling your Roomba
- Real-time Status Monitoring: Battery level, cleaning state, errors, and more
- Secure API: All endpoints protected with API key authentication
- Docker Ready: Easy deployment with Docker Compose
- Persistent Storage: Roomba credentials saved securely to disk
- Network Flexible: Supports both host networking and custom network configurations
- Advanced Controls: Custom dorita980 method calls for power users
- Docker and Docker Compose installed
- iRobot Roomba on the same LAN
- Roomba BLID and password (see Getting Roomba Credentials)
git clone <your-repo-url>
cd doria980-webui
cp .env.example .envEdit .env and set your API key:
# Generate a secure API key
openssl rand -hex 32
# Edit .env file
API_KEY=your_generated_api_key_here
PORT=8080
ROOMBA_IP= # Optional: leave empty for auto-discovery# Build and start the service
docker-compose up --build -d
# Check logs
docker-compose logs -f roomba-uiOpen your browser to http://localhost:8080 (or your configured port).
- Click "βοΈ Settings & Configuration"
- Enter your API key (from .env file)
- Enter your Roomba BLID and password
- Click "Set Credentials"
Your Roomba's BLID (Bluetooth Low Energy Identifier) and password are required for connection.
# Run the password helper for instructions
npm run getpassword
# Or inside Docker container:
docker exec -it roomba-webui npm run getpassword# Install and run the password extraction tool
docker run -it --rm --net=host node:18-alpine sh -c "npm install -g homebridge-roomba && getpassword"- Place Roomba on dock and ensure it's powered on
- Hold HOME button until it plays tones (~2 seconds)
- WiFi LED should start flashing
- Use the homebridge-roomba getpassword utility
- Follow the prompts to extract credentials
All endpoints require X-API-Key header with your API key.
Returns current Roomba status including state, battery, charging status, and errors.
curl -H "X-API-Key: your_api_key" http://localhost:8080/api/statusSend commands to Roomba: start, pause, stop, dock.
curl -X POST -H "X-API-Key: your_api_key" -H "Content-Type: application/json" \
-d '{"command": "start"}' http://localhost:8080/api/commandSet Roomba BLID and password.
curl -X POST -H "X-API-Key: your_api_key" -H "Content-Type: application/json" \
-d '{"blid": "your_blid", "password": "your_password"}' http://localhost:8080/api/credentialsCall custom dorita980 methods.
curl -X POST -H "X-API-Key: your_api_key" -H "Content-Type: application/json" \
-d '{"method": "getRobotState", "args": ["cleanMissionStatus", "batPct"]}' \
http://localhost:8080/api/customGet service and dependency versions.
curl -H "X-API-Key: your_api_key" http://localhost:8080/api/versionThe default docker-compose.yml uses host networking for easy Roomba discovery:
network_mode: "host"For custom network setups, uncomment the macvlan configuration in docker-compose.yml:
networks:
roomba_network:
driver: macvlan
driver_opts:
parent: eth0 # Change to your network interface
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1# Install dependencies
npm install
# Set environment variables
export API_KEY=your_api_key_here
export ROOMBA_IP=192.168.1.100 # Optional
# Start development server
npm run devnpm start- Start production servernpm run dev- Start development server with debuggingnpm run build- Build check (no build step needed)npm run getpassword- Show password extraction help
- Generate strong API keys:
openssl rand -hex 32 - Never commit API keys to version control
- Rotate keys regularly
For secure remote access, consider:
- Tailscale (Recommended): Zero-config VPN
- Reverse Proxy: nginx with HTTPS and basic auth
- VPN: Connect to your home network securely
Example nginx configuration:
server {
listen 443 ssl;
server_name roomba.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
auth_basic "Roomba Control";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}- Run on isolated VLAN if possible
- Use strong WiFi passwords
- Keep Roomba firmware updated
- Monitor network traffic for anomalies
-
Roomba not found:
- Ensure Roomba is on same network
- Try specifying ROOMBA_IP in .env
- Check if Roomba is awake (press CLEAN button)
-
Authentication failed:
- Verify BLID and password are correct
- Ensure no other apps are connected
- Try restarting Roomba
-
API key errors:
- Check X-API-Key header is included
- Verify API key matches .env file
- Ensure API_KEY environment variable is set
# Check container status
docker-compose ps
# View logs
docker-compose logs roomba-ui
# Restart service
docker-compose restart roomba-ui
# Access container shell
docker exec -it roomba-webui sh# Test Roomba connectivity
ping <roomba_ip>
# Check open ports
nmap -p 80,443,8080 <roomba_ip>
# Test API locally
curl -H "X-API-Key: your_key" http://localhost:8080/healthdoria980-webui/
βββ src/
β βββ server.js # Express server and API routes
β βββ roombaClient.js # dorita980 wrapper client
βββ public/
β βββ index.html # Web interface
β βββ app.js # Frontend JavaScript
βββ scripts/
β βββ getpassword.js # Password extraction helper
βββ Dockerfile # Container configuration
βββ docker-compose.yml # Service orchestration
βββ package.json # Node.js dependencies
βββ .env.example # Environment template
βββ README.md # This file
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - see LICENSE file for details.
- dorita980 - Roomba communication library
- homebridge-roomba - Credential extraction tools
- iRobot for creating awesome vacuum robots
- Create an issue for bug reports
- Check existing issues before creating new ones
- Include logs and system information in bug reports
- Star the repo if you find it useful!
Made with β€οΈ for the home automation community