Home Assistant Custom Component for Bosch Indego robotic lawn mowers
A comprehensive Home Assistant integration that provides full control and monitoring of your Bosch Indego lawn mower. Get real-time status, battery information, mowing schedules, and more.
- ๐ฎ Full Mower Control - Start, pause, dock, and schedule mowing
- ๐ Real-time Monitoring - Battery, location, alerts, and more
- ๐ Lawn Mapping - Visual SVG map with mower position overlay (dynamic streaming based on movement)
- ๐ค SmartMowing Switch - Toggle automatic schedule optimization based on weather
โ ๏ธ Alert Management - Monitor and manage mower alerts with action buttons and complete error list extraction- ๐ Multi-language Support - German, English, Dutch, French, Spanish, Italian, Danish, Norwegian, Polish, Swedish, Slovak, and more
- ๐ Native Entities - Lawn Mower and Vacuum entities for seamless Home Assistant integration
- ๐ฑ Multiple Mowers - Support for multiple mowers in one Home Assistant instance
- ๐ Service Monitoring - Bosch Cloud API availability detection with HTTP 5xx error tracking
- ๐ Advanced Battery Info - Detailed battery metrics (voltage, temperature, cycles, discharge)
- ๐ก๏ธ Intelligent Offline Detection - 3-layer system (error codes, timeout, successful updates)
- ๐ Stuck Detection - Automatic detection when mower is immobilized (> 60 seconds without movement)
- ๐ค Custom User Agent - Configurable User-Agent for API requests to work around Bosch restrictions
- ๐ Session Tracking - Counter for completed mowing sessions
- ๐ฏ Dynamic Camera Streaming - Camera shows as streaming when mower is actively moving/mowing
- ๐ฒ Alert Action Buttons - Quick action buttons to manage specific alerts
- Features
- Community
- Installation
- Getting Started
- Monitored Entities
- Advanced Features
- Entity Reference
- Services & Control
- Debugging
- Supported Models
- Known Issues
- Contribution & Support
- Credits
Join our Discord community to discuss features, vote on improvements, and get support: discord.gg/aD33GsP
- Add this repository to HACS (Community Store)
- Search for "Bosch Indego"
- Click "Install"
- Restart Home Assistant
- Copy the
indegofolder fromcustom_componentsto your Home Assistantcustom_componentsfolder - Restart Home Assistant
Bosch Indego uses OAuth authentication (Bosch SingleKey ID). To complete authentication, you need a Chrome extension:
- Download: HomeAssistant Indego authentication helper
- Extract the ZIP file
- Go to
chrome://extensions/in Google Chrome - Enable Developer mode (top right)
- Click Load unpacked and select the extracted folder
- โ You can disable the extension after setup if you prefer
Note: Currently only Google Chrome supports the Bosch authentication flow.
- In Home Assistant: Settings โ Devices & Services โ Create Integration
- Search for "Bosch Indego"
- Click Create
- Follow the authentication flow (uses the Chrome extension above)
- All sensors will appear as "Unused Entities" after setup
You can add this integration multiple times if you own multiple mowers.
After adding the integration, you can enable additional features in Settings โ Devices & Services โ Bosch Indego โ Configure:
- Custom User Agent - Useful if Bosch Cloud is blocking requests. Try alternatives like
HomeAssistant/IndegoorHA/Indego - Expose as Lawn Mower - Enable native Home Assistant Lawn Mower entity (recommended for automation compatibility)
- Expose as Vacuum - Enable legacy Vacuum entity for backward compatibility
- Show All Alerts - Store all historical alerts (use sparingly due to Entity Registry limits)
All entities are automatically discovered after setup and will appear as "Unused Entities" in Home Assistant.
Find all sensors at: Home Assistant โ Settings โ Devices & Services โ Indego โ Sensors
| Sensor | Description |
|---|---|
| Mower State | Current state of the mower (e.g., mowing, paused, charging) |
| State Detail | Detailed state information with more context |
| Mowing Mode | Current mowing mode setting (e.g., Normal, SmartMowing) |
| Lawn Mowed | Percentage of lawn mowed (%) |
| Lawn Mowed Size | Absolute lawn area mowed in current session (mยฒ) |
| Garden Size | Total lawn area (mยฒ) |
| Sensor | Description |
|---|---|
| Battery Level | Current battery charge (%) |
| Battery Voltage โ๏ธ | Battery voltage (V) - diagnostic |
| Battery Temperature โ๏ธ | Battery cell temperature (ยฐC) - diagnostic |
| Ambient Temperature โ๏ธ | Ambient air temperature (ยฐC) - diagnostic |
| Battery Cycles โ๏ธ | Battery charge cycles count - diagnostic |
| Battery Discharge โ๏ธ | Battery discharge capacity (Ah) - diagnostic |
| Battery Charging โ๏ธ | Whether mower is currently charging (On/Off) |
โ๏ธ = Diagnostic sensors (hidden by default)
| Sensor | Description |
|---|---|
| Session Count | Total number of completed mowing sessions |
| Total Mowing Time | Total cumulative mowing time (hours) |
| Last Completed Mow | Timestamp of last full lawn mowing completion |
| Next Mow Time | Scheduled next mowing time |
| Sensor | Description |
|---|---|
| Mower Position X โ๏ธ | X coordinate on map (pixels) - diagnostic |
| Mower Position Y โ๏ธ | Y coordinate on map (pixels) - diagnostic |
| Sensor | Description |
|---|---|
| Last Error Code | Last error code and timestamp with error description |
| Firmware Version โ๏ธ | Current firmware version - diagnostic |
| Maintenance Hours | Maintenance counter (hours) with status (good/service_due_soon/service_required) |
| Binary Sensor | Description |
|---|---|
| Online Status | Whether mower is connected (On/Off) - with intelligent 3-layer offline detection |
| Alerts | Active alert status indicator with count of unread alerts |
| Mower Stuck | Indicates if mower is stuck (detected by no movement >5px for 60+ seconds during mowing) |
| Service Status | Bosch Cloud API availability - detects HTTP 5xx errors |
| Update Available | Firmware update availability (On/Off) |
| Switch | Description |
|---|---|
| SmartMowing | Toggle SmartMowing mode on/off - enables automatic schedule optimization based on weather conditions |
| Button | Description |
|---|---|
| Delete Alert (Last) | Delete the most recent alert from the mower |
| Delete All Alerts | Delete all alerts from the mower at once |
| Mark Alert as Read (Last) | Mark the most recent alert as read |
| Mark All Alerts as Read | Mark all alerts as read without deleting them |
These entities can be enabled in Settings โ Devices & Services โ Bosch Indego โ Configure:
Enable "Expose as Lawn Mower" to add a native Home Assistant Lawn Mower entity with full controls:
- Commands: Start Mowing, Pause, Dock (return to charging)
- States: DOCKED, MOWING, PAUSED, RETURNING, ERROR
- Features: Automatically maps 60+ mower states to Home Assistant standard activities
- Entity ID:
lawn_mower.indego_<SERIAL>
Enable "Expose as Vacuum" for backward compatibility with Vacuum automations:
- Commands: Start, Pause, Return to Dock
- States: Docked, Cleaning, Idle, Paused, Returning, Error
- Entity ID:
vacuum.indego_<SERIAL>
Visual SVG map with mower position overlay:
- Dynamic Streaming: Shows as streaming when mower is actively moving/mowing
- Map Updates: Refreshes on mower position changes (>5px movement)
- File Location:
www/indego_map_<SERIAL>.svg - Entity ID:
camera.indego_<SERIAL>_lawn_map
Available at: Settings โ Devices & Services โ Bosch Indego โ Device โ Diagnostics
Complete system snapshot including:
- Current mower state and detailed state information
- Battery status (percentage, voltage, temperature, cycles, discharge)
- Garden size and mowing progress metrics
- Runtime statistics (operation, mowing, charging hours)
- Alert history with timestamps and codes
- Maintenance status and hours
- Last API response time
- Position data (X, Y coordinates on map)
- Firmware version and update availability
For Home Assistant administrators to analyze integration health:
- Connection metrics and refresh cycle tracking
- Error code statistics
- Session counter data
- Configuration details (redacted for security)
Bosch Indego integrates with Home Assistant System Health for service monitoring:
Access at: Settings โ System โ System Health โ Bosch Indego
Monitors:
- Bosch API Health: Detects HTTP 5xx errors and service availability
- Mower Connectivity: Shows online/offline status of connected mowers
- Last Update: Time of last successful API response (with warnings if >10 minutes stale)
- Authentication Status: OAuth2 token validation
Helps distinguish between Bosch Cloud outages vs. local connectivity problems.
Automatic issue detection and resolution:
Authentication Failure Repair
- When triggered: OAuth2 token becomes invalid or expires
- Resolution: Click "Fix" to re-authenticate with Bosch SingleKey ID
- Auto-clears: After successful re-authentication
Connection Failure Repair
- When triggered: 5+ consecutive API timeout failures
- Resolution: Auto-clears when connectivity is restored
- Purpose: Helps distinguish temporary network issues from permanent problems
Manage at: Settings โ System โ Repairs
The binary_sensor.indego_<SERIAL>_alert sensor stores all active mower alerts as individual attributes:
Available Attributes (for each alert):
alerts_count- Number of active alertslast_alert_error_code- Most recent error codelast_alert_message- Most recent error messagelast_alert_date- Most recent error timestamplast_alert_read- Read status of most recent alert
Complete Error History (error_0, error_1, error_2, ...):
error_N- Complete error:"802: WiFi connection lost - 2024-01-01 12:34:56"error_N_code- Error code only:"802"error_N_description- Error description:"WiFi connection lost"error_N_timestamp- Time of error:"2024-01-01 12:34:56"error_N_message- Original API messageerror_N_read- Read status (true/false)
Note: Use with show_all_alerts: true option to store complete history (use sparingly due to Entity Registry limits).
Over 90 error codes are mapped in the integration. See error list in Developer Tools โ Services โ search "indego" or check error_codes.py for complete reference.
The binary_sensor.indego_<SERIAL>_service_status sensor monitors Bosch Cloud API availability:
- UP (On) - Bosch API is responding normally
- DOWN (Off) - Bosch Cloud experiencing 5xx errors (usually temporary)
- Attribute
last_service_error- HTTP error code (e.g., "HTTP 503")
Note: 5xx errors are typically temporary Bosch Cloud issues and resolve automatically.
The integration uses a sophisticated 3-layer system to accurately detect when your mower is offline:
Layer 1: Error Code Detection
- Immediately marks mower as offline on API errors: 802, 803, 804 (connection failures)
- Provides instant feedback when mower loses connectivity
Layer 2: Timeout System
- After 300 seconds (5 minutes) without a successful API response, mower is marked offline
- Handles situations where the API doesn't return explicit error codes
- Automatically recovers when connectivity is restored
Layer 3: Last Successful Update Tracking
- Continuously tracks
_last_successful_updatetimestamp - Monitors refresh cycles to detect prolonged connection loss
- Works in conjunction with error codes and timeout system
How It Works:
- Each successful API call updates the timestamp
- Every refresh cycle checks for timeout or error conditions
- If timeout exceeded OR error codes detected โ mower state set to offline
- Online state automatically restored when connection resumes
The lawn map camera entity provides dynamic streaming capabilities:
- Streaming State: Camera's
is_streamingproperty indicates active mower movement - Movement Detection: Automatically detects if mower is in a mowing, moving, or cutting state (states 500-799)
- Map Updates: SVG map reloads when mower movement is detected for fresh position data
- Visual Feedback: Streaming indicator in Home Assistant UI shows when mower is actively working
Automatic stuck mower detection system:
- Binary Sensor:
binary_sensor.indego_<SERIAL>_mower_stuck - Detection Threshold: No movement > 5 pixels for 60+ seconds while mowing
- Tracking: Only during active mowing/movement states (state numbers 500-799)
- Attributes:
stuck_since- Timestamp when mower became stuckstuck_x- X position (pixels) where mower is stuckstuck_y- Y position (pixels) where mower is stuck
The integration fully supports multiple mowers on the same Bosch account:
- Add Multiple Times: You can add this integration multiple times to manage different mowers
- Service Routing: Services automatically detect which mower to control via the
mower_serialparameter - Unified Dashboard: All mowers appear as separate devices in Home Assistant
- Concurrent Polling: Each mower is polled independently with optimal refresh intervals
Using Services with Multiple Mowers:
service: indego.command
data:
command: mow
mower_serial: "0123456789ABCDEF" # Required for multiple mowersRefresh Intervals:
- State Polling: Immediate on each update cycle (uses 230-second API long-poll timeout)
- Generic Data (firmware, mode): Every 10 minutes
- Position Updates: Every 60 seconds
- Map Refresh: On position changes (>5px movement) or state transitions
- Battery/Garden Data: Every 10 minutes
Retry Strategy (on connection failures):
- Backoff delays: [0 sec (immediate), 10 sec, 30 sec, 60 sec]
- After 60 seconds: Marks mower as offline after 5+ consecutive failures
- Automatic recovery: Clears offline state on successful reconnection
- Token Refresh: Every 12 hours (aggressive strategy to prevent 400 errors)
- Bosch Tokens Expire: At 24 hours, so early refresh prevents gaps
- Authentication Flow: Uses Bosch SingleKey ID
- Required Scope:
openid profile email offline_access https://prodindego.onmicrosoft.com/indego-mobile-api/Indego.Mower.User
Bosch Cloud may occasionally block requests. Configure custom User-Agent strings:
Access in: Settings โ Devices & Services โ Bosch Indego โ Configure โ "Custom User Agent"
Available Options:
HomeAssistant/Indego- Full descriptionHA/Indego- Shorter form (default)
When to change: If you encounter HTTP 4XX (block) errors, try switching the user agent.
The integration tracks completed mowing sessions:
- Session Counter:
sensor.indego_<SERIAL>_session_count- Total number of completed sessions - Increment Logic: Counter increments when transitioning INTO mowing state (from non-mowing states)
- Session Attributes on
lawn_mowedsensor:last_session_operation_min- Total session durationlast_session_cut_min- Active cutting timelast_session_charge_min- Charging time between sessions
Detailed battery information available as diagnostic sensors (disabled by default):
| Sensor | Unit | Purpose |
|---|---|---|
| Battery Voltage | V | Monitor charging voltage for diagnostics |
| Battery Temperature | ยฐC | Track battery thermal behavior |
| Ambient Temperature | ยฐC | Monitor environmental conditions |
| Battery Cycles | count | Track battery age and health |
| Battery Discharge | Ah | Monitor discharge capacity |
Enable these sensors: Settings โ Devices & Services โ Indego โ Sensors โ Enable
The integration includes translations for 11 languages:
- German (Deutsch), English, Dutch (Nederlands), French (Franรงais)
- Spanish (Espaรฑol), Italian (Italiano), Danish (Dansk), Norwegian (Norsk)
- Polish (Polski), Swedish (Svenska), Slovak (Slovenฤina)
Language selection is handled automatically by Home Assistant based on your system settings.
The integration maps 60+ distinct mower states to Home Assistant standard activities:
Docked States (0, 101, 257-263, 1281, 64513):
- Mower is at rest in charging dock
- Lawn Mower Activity: DOCKED
- Vacuum State: DOCKED
Mowing States (266, 512-525, 768-776, 1005):
- Mower is actively cutting grass or moving during mowing session
- Lawn Mower Activity: MOWING
- Vacuum State: CLEANING / IDLE
Paused States (517, 519):
- Mower paused mid-mowing session
- Lawn Mower Activity: PAUSED
- Vacuum State: PAUSED
Returning States (detected from "Returning to" state descriptions):
- Mower actively returning to dock
- Lawn Mower Activity: RETURNING
- Vacuum State: RETURNING
Error States (1025, 1026, 1027, 1038, 1537, 99999):
- Mower encountered an error condition
- Lawn Mower Activity: ERROR
- Vacuum State: ERROR
Charging States (detected from "Charging" in state descriptions):
- Mower is charging in dock
- Tracked separately via
binary_sensor.indego_<SERIAL>_battery_charging
Mower State (sensor.indego_<SERIAL>_mower_state):
- Attributes:
last_updated
Mower State Detail (sensor.indego_<SERIAL>_mower_state_detail):
- Attributes:
last_updated,state_number,state_description - Provides human-readable state descriptions like "Mowing - Relocalizing", "Charging", "Returning to Dock"
Battery (sensor.indego_<SERIAL>_battery_percentage):
- Attributes:
voltage_V,discharge_Ah,cycles,battery_temp_ยฐC,ambient_temp_ยฐC,last_updated
Lawn Mowed (sensor.indego_<SERIAL>_lawn_mowed):
- Attributes:
last_completed_mow,next_mow,last_session_operation_min,last_session_cut_min,last_session_charge_min,last_updated
Runtime Total (sensor.indego_<SERIAL>_runtime_total):
- State Class:
total_increasing(for statistics) - Attributes:
total_operation_time_h,total_mowing_time_h,total_charging_time_h
Alerts (binary_sensor.indego_<SERIAL>_alert):
- Attributes: Complete error list with:
alerts_count- Number of active alertslast_alert_error_code,last_alert_message,last_alert_date,last_alert_read- For each alert:
error_N,error_N_code,error_N_description,error_N_timestamp,error_N_message,error_N_read
Mower Stuck (binary_sensor.indego_<SERIAL>_mower_stuck):
- Attributes:
stuck_since,stuck_x,stuck_y
Maintenance Hours (sensor.indego_<SERIAL>_maintenance_hours):
- Attributes:
maintenance_status(values: "good", "service_due_soon", "service_required") - Status logic:
- < 50 hours: "good"
- 50-149 hours: "service_due_soon"
-
= 150 hours: "service_required"
Different entity categories are used to organize features in Home Assistant:
CONFIG Category (buttons for alert management):
button.indego_<SERIAL>_delete_last_alertbutton.indego_<SERIAL>_delete_all_alertsbutton.indego_<SERIAL>_read_last_alertbutton.indego_<SERIAL>_read_all_alertsswitch.indego_<SERIAL>_smartmowing_switch
DIAGNOSTIC Category (detailed information):
sensor.indego_<SERIAL>_battery_voltagesensor.indego_<SERIAL>_battery_temperaturesensor.indego_<SERIAL>_ambient_temperaturesensor.indego_<SERIAL>_battery_cyclessensor.indego_<SERIAL>_battery_dischargesensor.indego_<SERIAL>_mower_svg_xsensor.indego_<SERIAL>_mower_svg_ysensor.indego_<SERIAL>_firmware_version
Diagnostic entities are hidden by default but can be enabled via: Settings โ Devices & Services โ Indego โ Sensors โ Enable
Control your mower through Home Assistant services. All services support multiple mowers via the mower_serial parameter.
Service: indego.command
Sends control commands to your mower (compatible with Lawn Mower and Vacuum entities).
Parameters:
command(required): One of:mow- Start mowingpause- Pause current operationreturnToDock- Return to charging dock
mower_serial(optional): Serial number (required only for multiple mowers)
Example:
service: indego.command
data:
command: mowService Compatibility:
- These commands trigger the corresponding Lawn Mower entity methods (async_start_mowing, async_dock, async_pause)
- Commands can also be sent directly to Lawn Mower entity via Home Assistant UI
The SmartMowing feature can be controlled in two ways:
Use the SmartMowing switch entity in Home Assistant UI:
- Entity ID:
switch.indego_<SERIAL>_smartmowing_switch - Location: Home Assistant dashboard or automations
- State Detection: Automatically detects current SmartMowing status from mower's mode
- Real-time Sync: Switch state updates automatically based on mower's current settings
Service: indego.smartmowing
Enable or disable SmartMowing programmatically for automations.
Parameters:
enable(required):true|falsemower_serial(optional): Serial number (only needed for multiple mowers)
Example:
service: indego.smartmowing
data:
enable: trueWhat SmartMowing Does:
- Automatic schedule adjustment based on weather and lawn growth
- Mower adapts mowing plan to optimal conditions
- Can be toggled on/off based on your preferences
Service: indego.delete_alert
Parameters:
alert_index(required): Index of alert to delete (0 = most recent, 1 = second most recent, etc.)mower_serial(optional)
Example:
service: indego.delete_alert
data:
alert_index: 0Service: indego.delete_alert_all
Batch deletes all alerts with configurable delays between deletions.
Parameters:
mower_serial(optional)
Batch Settings:
- Delay between deletions: 10 seconds
- Maximum rounds: 20 (removes up to 20 alerts per call)
Service: indego.read_alert
Parameters:
alert_index(required): Index of alert (0 = most recent, 1 = second most recent, etc.)mower_serial(optional)
Example:
service: indego.read_alert
data:
alert_index: 0Service: indego.read_alert_all
Batch marks all alerts as read with configurable delays.
Parameters:
mower_serial(optional)
Batch Settings:
- Delay between read operations: 10 seconds
- Maximum rounds: 20
Service: indego.download_map
Downloads the current lawn map from Bosch Cloud API and saves as www/indego_map_<SERIAL>.svg in your Home Assistant configuration directory.
Used by:
- Camera entity to display the mowing map with mower position overlay
- Custom dashboards via the SVG map file
Parameters:
mower_serial(optional): Serial number (only needed for multiple mowers)
Note: The map is automatically downloaded and cached. Use this service to force a fresh map update.
File Location: <HA_CONFIG>/www/indego_map_<SERIAL>.svg
To enable debug logging for troubleshooting, add this to your Home Assistant configuration:
logger:
logs:
custom_components.indego: debug
pyIndego: debugThen check your logs in Settings โ System โ Logs for detailed debugging information.
The integration supports the following Bosch Indego models:
- Indego 1000, 1100, 1200
- Indego 10C, 13C
- Indego 350, 400
- Indego S+ 350 (1st & 2nd Gen)
- Indego S+ 400 (1st & 2nd Gen)
- Indego S+ 500
- Indego M+ 700 (1st & 2nd Gen)
Not seeing your model? Please open an issue to request support.
-
Chrome Extension Required
- A Chrome extension is required to complete the authentication setup (Bosch SingleKey ID OAuth flow)
- Can be disabled/removed after initial setup
-
Bosch Cloud API Issues
- The Bosch Cloud (Azure) may occasionally block the integration:
HTTP 4XXerrors ("The connection to the Bosch Indego API failed!") - Workaround: Try changing the user agent during setup or in Settings โ Devices & Services โ Bosch Indego Mower โ Configure
- The Bosch Cloud (Azure) may occasionally block the integration:
-
Temporary Bosch Cloud Outages
HTTP 5XXerrors typically indicate temporary Bosch Cloud unavailability (often occurs once daily)- These are temporary and resolve automatically
-
Invalid Commands
- Sending impossible commands (e.g., docking while already docked) may cause temporary
HTTP 5XXerrors from Bosch
- Sending impossible commands (e.g., docking while already docked) may cause temporary
- Check existing issues first
- Open a new issue with:
- Your mower model and firmware version
- Steps to reproduce
- Relevant logs (with debug enabled)
- Screenshots if applicable
- ๐ Documentation & Issues
- ๐ฌ Discord Community
- ๐ Services reference: Developer Tools โ Services (search "Bosch Indego")
Maintainers: @whylev, @kimzeuner, @sander1988
Contributors: Eduard, Jumper78, dykandDK, ultrasub, Gnol86, naethan, bekkm, onkelfarmor, ltjessem, nsimb, jjandersson, Shamshala, nath, urbatecte, Windmelodie, Fuempel, MagaliDB, mhosse, Promises
Inspiration:

