Skip to content
 
 

Repository files navigation

HACS Default GitHub Latest Release GitHub All Releases

Viomi SE (V-RVCLM21A) integration for Home Assistant

This is a custom component for Home Assistant to integrate the Viomi SE Vacuum Cleaner (viomi.vacuum.v19) - apparently EU version - with 4.0.9_0012 firmware and tested in 4.0.9_0017.

Building upon the major refactor initiated in v2025.10.19, the current version (v2026.4.4) has been fully updated and verified on Home Assistant 2026.2.3.

While optimized for the latest core, it remains compatible with Home Assistant 2024.12.0+ thanks to the use of modern practices like UI-based configuration (Config Flow), DataUpdateCoordinator, dedicated sensors for consumables, and configurable options.


Table of Contents


🎉 What's New in v2? (The Modernization Update)

The current version (v2026.4.4), building on the massive refactor initiated in v2025.10.19, completely modernizes this integration.

If you are a new user, you can skip to the Installation section. If you are upgrading from version v1 (v2025.02.09beta or earlier), please read the Upgrading instructions below carefully.

  • UI-Based Configuration: No more YAML! The integration is now set up entirely through the Home Assistant interface.
  • Dedicated Sensors for Consumables: Individual sensors for the remaining life of the main brush, side brush, filter, and mop.
  • Configurable Options: You can now click "Configure" on the integration to adjust:
    • Command Cooldown: Time to wait between commands to prevent flooding the device.
    • Update Interval: How often to fetch status updates.
  • Improved Stability & Performance: The integration now uses DataUpdateCoordinator for efficient data fetching and includes a command debounce mechanism to prevent errors.
  • Full Translation Support (EN/PT) and a services.yaml file for a better user experience in the Developer Tools.

⬆️ Upgrading from v1

If you were using the old version of this integration with a configuration.yaml setup, please follow these steps to upgrade:

  1. Important: Make a backup of your Home Assistant configuration.
  2. Remove the old vacuum: entry for viomise from your configuration.yaml file.
  3. Update the integration to the latest version via HACS (or by manually copying the new files).
  4. Restart Home Assistant.
  5. After restarting, go to Settings > Devices & Services and add the Viomi SE integration through the UI. You will be prompted for the IP Address and Token again.

Your old entity names should be preserved if you use the same name during the new configuration.


✨ Features

  • UI Configuration: Set up and configure the vacuum entirely through the Home Assistant user interface.
  • Standard Vacuum Controls: start, pause, stop, return_to_base, locate.
  • Fan Speed Control: Adjust fan speeds (Silent, Standard, Medium, Turbo).
  • Consumable & Battery Sensors: Dedicated sensors for the life percentage of all consumables and the battery.
  • Configurable Timings: Adjust command cooldown and update intervals via the integration's options.
  • Custom Services: Advanced cleaning commands for zones, segments (rooms), and specific points.
  • Multi-language Support: UI is translated into English and Portuguese.

📋 Prerequisites

You need to obtain the IP Address and the 32-character Token of your Viomi SE vacuum.

The easiest way to get the token is by using the Xiaomi Miot Auto integration, which can automatically discover tokens for devices on your network. Alternatively, you can use the python-miio tool.


🚀 Installation

HACS (Recommended)

This integration is part of the default HACS repository!

  1. Go to your HACS page in Home Assistant.
  2. Click on "Integrations".
  3. Click the "Explore & Download Repositories" button in the bottom right corner.
  4. Search for "Viomi SE Vacuum".
  5. Click on the integration and then click "Download".
  6. Restart Home Assistant when prompted.

Manual Installation

  1. Download the latest release from the Releases page.

  2. Unzip the downloaded file.

  3. Copy the entire viomise folder into your Home Assistant's custom_components directory.

    Important: Ensure the folder contains all these critical files for v2 to work:

    • __init__.py & const.py (Core logic and constants)
    • coordinator.py (Data handling - Essential for v2)
    • config_flow.py (UI Configuration setup)
    • vacuum.py & sensor.py (Entity platforms)
    • manifest.json & services.yaml
    • translations/ folder (Required for UI text and translations)
  4. The final path should look like: <config_directory>/custom_components/viomise/

  5. Restart Home Assistant.


⚙️ Configuration

Once the integration is installed and Home Assistant is restarted, you can add your vacuum via the UI.

  1. Go to Settings > Devices & Services.
  2. Click the + ADD INTEGRATION button in the bottom right corner.
  3. Search for "Viomi SE" and click on it.
  4. A configuration dialog will appear. Enter the following:
    • Device Name: A friendly name for your vacuum (e.g., "Viomi SE").
    • IP Address: The local IP address of your vacuum.
    • Token: The 32-character token you obtained earlier.
  5. Click "Submit".

If the details are correct, the integration will be added, and a new device with its entities will appear.


🔧 Options

After adding the integration, you can fine-tune its behavior.

  1. Go to Settings > Devices & Services.
  2. Find the Viomi SE integration and click on "Configure".
  3. You can adjust the following options:
    • Command Cooldown (seconds): The minimum time to wait between sending commands to the vacuum. This prevents flooding the device with requests. (Default: 2.5)
    • Update Interval (seconds): How often to fetch status updates from the vacuum. (Default: 30)

📦 Entities & Attributes

Main Entity: vacuum.<device_name>

All properties fetched from the vacuum are available as State Attributes. This allows for advanced dashboard cards and automations without extra entities. (Note: If you named your device "Living Room", the entity will be vacuum.living_room).

Category Attribute Description
Mapping current_map_id Unique ID of the active floor/map.
remember_map Status of map saving (0: Off / 1: On).
has_map Indicates if a map is currently loaded.
has_newmap Indicates if a new map has been discovered.
Cleaning Stats s_area Area cleaned in the last/current session (m²).
s_time Duration of the last/current cleaning (min).
Modes & Config run_state Numerical state of the vacuum (e.g., 4: Cleaning, 2: Charging).
mode Operation mode (0: Vacuum, 1: Mixed, 2: Mop).
mop_route Mopping pattern (0: S-shape, 1: Y-shape).
suction_grade Suction power level (0-3).
water_grade Water flow level (11: Low, 12: Medium, 13: High).
repeat_state If the cleaning is set to repeat (0/1).
Hardware battary_life Real-time battery percentage (0-100).
box_type Container detected (1: Dust, 2: Water, 3: 2-in-1).
mop_type Mop bracket status (0: Not installed, 1: Installed).
err_state Current error code (0 if no error).
Maintenance main_brush_left Hours remaining for the main brush.
side_brush_left Hours remaining for the side brush.
filter_left Hours remaining for the filter.
mop_left Hours remaining for the mop.
*_percentage Percentage remaining for each consumable above.

Dedicated Sensors

For easier history tracking and native Home Assistant features:

  • sensor.viomi_se_battery (Battery percentage)
  • sensor.viomi_se_main_brush_life (%)
  • sensor.viomi_se_side_brush_life (%)
  • sensor.viomi_se_filter_life (%)
  • sensor.viomi_se_mop_life (%)

Note: The exact entity ID may vary slightly based on the name you provide during setup. Naming the vacuum 'Robot' will result in the entity ID sensor.robot_battery


🛠️ Custom Services

In addition to the standard vacuum services, this integration provides advanced services. You can find them in Developer Tools > Services.

Service Parameter Example
viomise.vacuum_clean_zone zone (coords), repeats Clean a specific area.
viomise.vacuum_clean_segment segments (list) Clean specific rooms.
viomise.vacuum_goto x_coord, y_coord Send robot to a spot.
viomise.vacuum_set_map map_id, map_name or map_index Switch between floors.

Example Service Call (in YAML):

service: viomise.vacuum_clean_segment
target:
  entity_id: vacuum.viomi_se
data:
  segments: [10, 11]

⚠️ Backward Compatibility (v2.x)

Starting with version v2026.4.20, this integration supports both the new modern service names and legacy names to ensure your existing dashboards don't break.

Service Name (New) Legacy Alias (Backward Compatibility) Description
viomise.vacuum_clean_zone vacuum.xiaomi_clean_zone Required for xiaomi-vacuum-map-card default config.
viomise.vacuum_clean_point vacuum.xiaomi_clean_point Required for "Go to point" default config.

Note: While legacy aliases are supported to keep community Lovelace cards working out-of-the-box, we recommend migrating your custom scripts and automations to the viomise.* domain for better long-term support and visibility in Home Assistant Developer Tools.


🖼️ Lovelace Integration

For the best experience, we recommend using the Xiaomi Vacuum Map Card. This integration is compatible with its features.

Click to expand: Full Map Card YAML Example
type: grid
square: false
columns: 1
cards:
  - type: heading
    heading: Viomi SE
    icon: mdi:robot-vacuum
    heading_style: title

  - type: custom:xiaomi-vacuum-map-card
    entity: vacuum.viomi_se
    vacuum_platform: marotoweb/viomise
    map_source:
      camera: image.viomi_se_live_map
    calibration_source:
      camera: true
    
    # Dashboard Tiles: Displaying real-time stats and consumable status
    tiles:
      - tile_id: status
        entity: vacuum.viomi_se # Uses the main entity state (Cleaning, Docked, etc.)
        label: Status
      - tile_id: battery
        entity: sensor.viomi_se_battery
        label: Battery
      - tile_id: area
        entity: vacuum.viomi_se
        label: Area
        attribute: s_area
        unit: 
        icon: mdi:texture-box
      - tile_id: time
        entity: vacuum.viomi_se
        label: Time
        attribute: s_time
        unit: min
        icon: mdi:clock-time-five-outline
      - tile_id: main_brush
        entity: vacuum.viomi_se
        label: Main Brush
        attribute: main_brush_left
        unit: h
        icon: mdi:brush-variant
      - tile_id: side_brush
        entity: vacuum.viomi_se
        label: Side Brush
        attribute: side_brush_left
        unit: h
        icon: mdi:brush
      - tile_id: filter
        entity: vacuum.viomi_se
        label: Filter
        attribute: filter_left
        unit: h
        icon: mdi:air-filter
      - tile_id: mop_life
        entity: vacuum.viomi_se
        label: Mop
        attribute: mop_left
        unit: h
        icon: mdi:format-color-fill

    append_icons: true
    icons:
      # --- MAP SELECTION ---
      # Icons will highlight (glow) when the 'current_map_id' attribute matches the value
      - icon_id: map_1
        icon: mdi:layers-outline
        label: First Floor
        menu_id: map_selection
        conditions:
          - entity: vacuum.viomi_se
            attribute: current_map_id
            value: 1776530025
        tap_action:
          action: call-service
          service: viomise.vacuum_set_map
          service_data:
            entity_id: vacuum.viomi_se
            map_id: 1776530025

      - icon_id: map_2
        icon: mdi:layers-triple-outline
        label: Ground Floor
        menu_id: map_selection
        conditions:
          - entity: vacuum.viomi_se
            attribute: current_map_id
            value: 1776189566
        tap_action:
          action: call-service
          service: viomise.vacuum_set_map
          service_data:
            entity_id: vacuum.viomi_se
            map_id: 1776189566

      # --- CLEANING MODES ---
      - icon_id: mode_vacuum
        icon: mdi:vacuum
        label: Vacuum Only
        menu_id: cleaning_mode
        conditions:
          - entity: vacuum.viomi_se
            attribute: is_mop
            value: "0"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_mop
            params: [0]

      - icon_id: mode_mixed
        icon: mdi:hydro-power
        label: Vacuum & Mop
        menu_id: cleaning_mode
        conditions:
          - entity: vacuum.viomi_se
            attribute: is_mop
            value: "1"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_mop
            params: [1]

      - icon_id: mode_mop
        icon: mdi:waves
        label: Mop Only
        menu_id: cleaning_mode
        conditions:
          - entity: vacuum.viomi_se
            attribute: is_mop
            value: "2"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_mop
            params: [2]

      # --- WATER LEVELS ---
      - icon_id: water_low
        icon: mdi:water-minus-outline
        label: Low
        menu_id: water_level
        conditions:
          - entity: vacuum.viomi_se
            attribute: water_grade
            value: "0"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_suction
            params: [11]

      - icon_id: water_medium
        icon: mdi:water
        label: Medium
        menu_id: water_level
        conditions:
          - entity: vacuum.viomi_se
            attribute: water_grade
            value: "1"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_suction
            params: [12]

      - icon_id: water_high
        icon: mdi:water-plus
        label: High
        menu_id: water_level
        conditions:
          - entity: vacuum.viomi_se
            attribute: water_grade
            value: "2"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_suction
            params: [13]

      # --- MOPPING PATTERNS ---
      - icon_id: pattern_y
        icon: mdi:alpha-y-circle
        label: Y-shape
        menu_id: mop_pattern
        conditions:
          - entity: vacuum.viomi_se
            attribute: mop_route
            value: "1"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_moproute
            params: [1]

      - icon_id: pattern_s
        icon: mdi:alpha-s-circle
        label: S-shape
        menu_id: mop_pattern
        conditions:
          - entity: vacuum.viomi_se
            attribute: mop_route
            value: "0"
        tap_action:
          action: call-service
          service: vacuum.send_command
          service_data:
            entity_id: vacuum.viomi_se
            command: set_moproute
            params: [0]

❓ Troubleshooting

  • "Failed to connect" error: Double-check that the IP address is correct and that the vacuum is on the same network. The token might be incorrect or may have changed if you reset the vacuum's Wi-Fi.
  • Device is "Unavailable": This usually means Home Assistant cannot reach the vacuum at its IP address. Check your network and ensure the vacuum is online in the Mi Home app.
  • Logs: To get more information, you can enable debug logging for the integration by adding the following to your configuration.yaml:
    logger:
      default: info
      logs:
        custom_components.viomise: debug
        miio: debug

Acknowledgements

This integration was originally forked from the home-assistant-vacuum-styj02ym project, which provided the initial structural foundation.

However, all the protocol research, including the discovery of how to use the specific siid and piid properties required to control the Viomi SE (v19) model, was done independently for this project. This reverse-engineering effort is the core of what makes this integration work for this specific vacuum model.


🤝 Contributions

Contributions are welcome! If you find a bug or have a suggestion for a new feature, please open an issue or submit a pull request.


📄 License

This project is licensed under the MIT License. See the LICENSE file for details.

About

Hacky Home assistant support for Viomi SE (V-RVCLM21A)

Topics

Resources

Stars

24 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages