Rowenta vacuum cleaner HT component

I bought a rowenta 75S+.
Read all the posts above and there seems to be a solution, but I’m not that technical.
Is there a simple solution in the making or is there perspective?

I also read a short message to do it via google home? Not in favor of it, but if that were a ‘temporary’ solution that would suffice for me.

You can configure your Rowenta 75s+ via the Tuya app or Smart Life app and therefore also use it in the HA. These are the two options that I found. Unfortunately, it doesn’t work via the normal Rowenta app.

That works! Thanks a lot!

Does anybody know if the local web interface is also available on the Rowenta RR8L65WH X-PLORER S65 ?

Thanks!

Hi,
I managed to set everything up, but the vacuum cleaner does not respond to cleaning commands in the zones

Thx, This works

Merci, je vais certainement essayer, mais en attendant, j’ai fait quelques recherches et préparé une configuration manuelle. Je peux désormais contrôler mon aspirateur Rowenta Explorer 130 depuis HA sans intégration directe, en utilisant simplement le modèle d’aspirateur et l’intégration REST.

image
image
746 × 556 22,5 Ko
Si quelqu’un est intéressé par les détails, vous pouvez ajouter le code suivant dans votre configuration.yaml pour faire la même chose

Tout d’abord, vous devrez obtenir quelques détails de l’application RobEey (qui s’exécute sur le port 8080 de l’IP de votre aspirateur)

This is the configuration part

input_text:
vacuum_cleaner_ip:
name: “Vacuum cleaner IP”
# You need to set your local IP
initial: “192.168.X.X”
vacuum_cleaner_map_id:
name: “Vacuum cleaner map ID”
# You need to set Map ID from RobEye app
initial: “3”

This is the are mapping with human names and internal IDs from RobEey app

input_select:
vacuum_cleaner_area:
icon: mdi:map-marker
options:
- Bed room-1
- Kitchen-3
- Bathroom-6
- Living room-10
- Hall-11
- Toilet-14
- Hall and Bathroom-11,6
Vous pouvez obtenir votre identifiant de carte à partir d’ici
image

Et puis à partir de l’image de la carte, vous pouvez obtenir l’ID des zones :

image
image
871 × 600 91,5 Ko
Ensuite, vous pouvez simplement ajouter une configuration préparée comme je l’ai fait et vous assurer de redémarrer l’ensemble du HA dans le menu des outils de développement.

APIs for the sensors values

rest:
resource_template: http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/get/status
sensor:
- name: Vacuum battery level
value_template: “{{ value_json.battery_level | int }}”
unit_of_measurement: “%”
icon: mdi:battery
- name: Vacuum mode
value_template: “{{ value_json.mode }}”
icon: mdi:robot-vacuum
- name: Vacuum charging
value_template: “{{ value_json.charging }}”
icon: mdi:battery-charging
- name: Vacuum fan speed
value_template: “{{ value_json.cleaning_parameter_set }}”
icon: mdi:speedometer

Commands to control the Vacuum cleaner

rest_command:
rowenta_return_to_base:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/set/go_home”
rowenta_stop:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/set/stop”
rowenta_clean_all:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/set/clean_all?cleaning_parameter_set={{cleaning_parameter_set}}&cleaning_strategy_mode=1&pump_volume=none”
rowenta_clean_spot:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/set/clean_map?map_id={{states(‘input_text.vacuum_cleaner_map_id’)}}&area_ids={{area_ids}}&cleaning_parameter_set={{cleaning_parameter_set}}&cleaning_strategy_mode=1&pump_volume=none”
rowenta_set_fan_speed:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/set/switch_cleaning_parameter_set?cleaning_parameter_set={{cleaning_parameter_set}}”
rowenta_status:
url: “http://{{states(‘input_text.vacuum_cleaner_ip’)}}:8080/get/status”

Vacuum template

vacuum:

  • platform: template
    vacuums:
    rowenta_vacuum:
    # Change to yours SN
    unique_id: “aicu-123345909090”
    friendly_name: “Vacuum cleaner”
    battery_level_template: “{{states(‘sensor.vacuum_battery_level’)}}”
    fan_speed_template: “{{states(‘sensor.vacuum_fan_speed’)}}”
    value_template: >-
    {% if states(‘sensor.vacuum_mode’) == “cleaning” %}
    cleaning
    {% elif states(‘sensor.vacuum_mode’) == “ready” and ( states(‘sensor.vacuum_charging’) == “charging” or states(‘sensor.vacuum_charging’) == “connected” ) %}
    docked
    {% elif states(‘sensor.vacuum_mode’) == “ready” and states(‘sensor.vacuum_charging’) == “unconnected” %}
    paused
    {% elif states(‘sensor.vacuum_mode’) == “go_home” %}
    returning
    {% else %}
    error
    {% endif %}
    attribute_templates:
    cleaning_area: >-
    {% set parts = states(‘input_select.vacuum_cleaner_area’).split(‘-’) %}
    {{ parts[0] }}
    start:
    service: rest_command.rowenta_clean_all
    data:
    cleaning_parameter_set: >-
    {% set fan_speed_reverse_map = { ‘Normal’:‘1’, ‘Eco’:‘2’, ‘High’:‘3’, ‘Silent’: ‘4’ } %}
    {{ fan_speed_reverse_map[states(‘input_select.vacuum_cleaner_fan_speed’)] }}
    stop:
    service: rest_command.rowenta_stop
    return_to_base:
    service: rest_command.rowenta_return_to_base
    clean_spot:
    service: rest_command.rowenta_clean_spot
    data:
    area_ids: >-
    {% set parts = states(‘input_select.vacuum_cleaner_area’).split(‘-’) %}
    {{ parts[1] }}
    cleaning_parameter_set: >-
    {% set fan_speed_reverse_map = { ‘Normal’:‘1’, ‘Eco’:‘2’, ‘High’:‘3’, ‘Silent’: ‘4’ } %}
    {{ fan_speed_reverse_map[states(‘input_select.vacuum_cleaner_fan_speed’)] }}
    set_fan_speed:
    - service: rest_command.rowenta_set_fan_speed
    data:
    cleaning_parameter_set: >-
    {% set fan_speed_reverse_map = { ‘Normal’:‘1’, ‘Eco’:‘2’, ‘High’:‘3’, ‘Silent’: ‘4’ } %}
    {{ fan_speed_reverse_map[fan_speed] }}
    - service: input_select.select_option
    data:
    option: “{{ fan_speed }}”
    target:
    entity_id: input_select.vacuum_cleaner_fan_speed
    fan_speeds:
    - Normal
    - Eco
    - High
    - Silent

#Helper input select with fan speed
input_select:
vacuum_cleaner_fan_speed:
icon: mdi:speedometer
options:
- Normal
- Eco
- High
- Silent

Helper button to start area cleaning

input_button:
vacuum_cleaner_start_area_cleaning:
name: Start area cleaning
icon: mdi:vacuum

Automation to start the spot cleaning

automation:

  • id: ‘1700602293259’
    alias: Vacuum start area cleaning
    description: ‘’
    trigger:
    • platform: state
      entity_id:
      • input_button.vacuum_cleaner_start_area_cleaning
        condition:
        action:
    • service: vacuum.clean_spot
      data: {}
      target:
      entity_id: vacuum.rowenta_vacuum
      Vous pouvez également créer des boutons de raccourci pour nettoyer une pièce spécifique comme ceci :

Helper button to start kitchen cleaning

input_button:
vacuum_cleaner_start_kitcheb_cleaning:
name: Start kitchen cleaning
icon: mdi:vacuum

automation:

  • id: ‘1700636942173’
    alias: 'Clean kitchen ’
    description: ‘’
    trigger:
    • platform: state
      entity_id:
      • input_button.clean_kitchen
        condition:
        action:
    • service: input_select.select_option
      data:

      You need to specify the option from the area-ids mapping selector

      option: Kitchen-3
      target:
      entity_id: input_select.vacuum_cleaner_area
    • service: vacuum.clean_spot
      data: {}
      target:
      entity_id: vacuum.rowenta_vacuum
      mode: single
      Et voici mon exemple de configuration de carte de tableau de bord, qui ressemble à ceci :
      image

type: entities
entities:

  • entity: vacuum.rowenta_vacuum
  • entity: sensor.vacuum_battery_level
    name: Battery
  • entity: input_select.vacuum_cleaner_area
    name: Area
    icon: mdi:map-marker
  • entity: input_select.vacuum_cleaner_fan_speed
    name: Cleaning mode
    icon: mdi:speedometer
  • entity: input_button.vacuum_cleaner_start_area_cleaning
    title: Vacuum cleaner
    footer:
    type: buttons
    entities:
    • entity: input_button.clean_kitchen
      show_icon: true
      show_name: true

Hello

I’m new to HA, and your integration interests me and perfectly meets my expectations! I tried copying and pasting your code into my configuration.yaml file, and I’m getting an error message.

Could you tell me why this isn’t working? Maybe I didn’t copy it to the right place? Can you tell me where to copy each part of your code (config.yaml, etc.)?
Sorry, but I’m a beginner.

Thank you very much!

Merci [michalkopecky] cela fonctionne pour mon ROWETA 120 ai , Top.

Hi everyone! :waving_hand:

I've been following this thread for a while and decided to build a proper custom Home Assistant integration for Rowenta / Tefal RobEye robot vacuums — no more manual YAML configs!

:warning: Early release disclaimer: This is working on my own instance (X-Plorer Serie 120), but hasn't been tested on other setups yet. Consider it a beta — feedback and bug reports are very welcome!


:robot: Rowenta / Tefal RobEye — Custom HA Integration

GitHub: GitHub - Tazmania0/rowenta_roboeye · GitHub

:white_check_mark: Compatible models

  • Rowenta / Tefal X-Plorer Serie 120 / S220 / S240 (D-shaped, Robart SDK, local HTTP port 8080)
  • Not compatible: Serie 50–80 / S85+ (those use Tuya — different architecture entirely)

:sparkles: Features

  • Full vacuum control: Start, Stop, Pause/Resume, Return to base
  • Per-room cleaning with interactive room selection
  • Live SVG map card — floor plan, robot position, cleaned-area shading
  • Auto-generated Lovelace dashboard — no manual card setup
  • Fan speed & cleaning strategy per room
  • Multi-floor map support
  • Schedule management with enable/disable toggles
  • Battery, brush status, error & event notifications
  • 100% local — no cloud, no Rowenta account required

:world_map: Standalone Map Editor

One of the biggest frustrations with the Rowenta / Tefal app is that map editing — merging rooms, drawing no-go zones, setting up a new floor — requires an active cloud connection and the official app. If the app changes or the cloud goes down, you lose access to your own robot's map.

The repo includes a standalone local map editor (map_editor/) that runs entirely in your browser and communicates directly with the robot over your LAN. No Home Assistant required, no Rowenta account, no cloud. It works as a full local control panel even without Home Assistant installed — useful for initial setup, troubleshooting, or anyone who just wants a simple web UI to control their robot.

A small Python helper handles the browser CORS restriction by acting as a local proxy — it's pure Python stdlib, no pip installs needed. On Windows and macOS you can simply double-click launch-rowenta-editor.py to get a small GUI where you enter the robot IP and click Launch. The editor opens in your browser automatically.

For terminal users or headless setups:

python rowenta-editor-server.py --ip 192.168.1.50

Map editor supports:

  • Browse all saved maps on the robot and switch between floors
  • Trigger a new floor exploration to build a fresh map
  • Merge two rooms into one
  • Split a room with a drawn line
  • Add blocking (no-go) zones and spot-clean zones
  • All changes are written directly to the robot — no cloud sync, no app needed
  • Send cleaning commands: Start, Stop, Pause, Return to base, clean by room
  • Live robot position on the map while cleaning

:package: Installation via HACS (recommended)

  1. Go to HACS → Integrations → ⋮ → Custom repositories
  2. Add https://github.com/Tazmania0/rowenta_roboeye as Integration
  3. Search for Rowenta RobEye, click Install, then restart HA
  4. Go to Settings → Devices & Services → Add Integration, search for Rowenta / Tefal RobEye Robot Vacuum
  5. Enter your robot's local IP address and an optional friendly name

Maps and rooms are auto-discovered from the robot — no map IDs to look up.

Manual install: Copy custom_components/rowenta_roboeye/ into config/custom_components/, restart HA, then follow steps 4–5 above.

To find your robot's IP: check your router's DHCP client list or use a network scanner. The robot listens on port 8080.


If you have a Serie 120 / S220 / S240 and want to try it out, I'd love to hear how it goes on your setup. Issues and pull requests on GitHub are very welcome! :raising_hands:


Side note for the developers in the room: this entire integration was built using AI-assisted "vibe coding" — essentially describing what I wanted and iterating with an AI coding agent rather than writing every line by hand. It's a proof of concept that this approach can produce a working, structured HA integration from scratch. The code is open — curious to hear what others think, and whether anyone wants to build on it.