Roborock in Home Assistant: Map & Segmentreinigung in der Core Integration!


:robot: Roborock in Home Assistant: NEU :world_map: Map & Segmentreinigung in der Core Integration!

In diesem Tutorial zeige ich dir, wie du deinen Roborock Saugroboter und Saug-Wisch-Roboter in Home Assistant einrichtest. Dank der Core Integration ist jetzt auch die Map- und Segmentreinigung ohne HACS möglich!

Ich erkläre Schritt für Schritt, wie du deinen Roboter integrierst und gebe dir zusätzlich hilfreiche Tipps zur Automatisierung für verschiedene Reinigungsmodi – egal ob Staubsaugen oder Wischen.

4 „Gefällt mir“

Sehr cooles Video. Vielen dank dafür. Einfach zu verstehen und auch sehr intuitiv.

Mir Selber hilft es nur leider nicht. Da ich einen Deebot habe und dafür keine Anleitung finde ich auch Funktioniert :frowning:

Hat vielleicht hier einer aus der Community eine idee oder soll ich am besten ein eigenes Thema dazu auf machen? Hier geht es ja eigentlich um Roborock und nicht um Saugroboter im Allgemeinen.

Danke euch.

1 „Gefällt mir“

Hallo Tobias,
ich habe die Integration anhand deines Videos für unseren Roborock S7 maxv Ultra umgesetzt. Insbesondere die Lösung, dass einzelne Räume am Wallpanel ausgewählt und gestartet werden können gefällt nicht nur meiner Frau sondern auch unseren Kindern. Es wurden zusätzlich die Modis „nur Saugen“ und nur Wischen" als Auswahl hinterlegt. Als Ergänzung lasse ich mir auf dem Wallpanel noch den Status der Station anzeigen.

Gruss Lewe

3 „Gefällt mir“

schiebe ich auch noch vor mir her. wird bestimmt ein separates panel werden mit separatem dashboard.

1 „Gefällt mir“

Habe es dank deinem Video auch umgesetzt bekommen. Hast du eigentlich weiter an dem fehlerhaften Script getüftelt wo man mehrere Räume gleichzeitig wählen kann?
Gruß

2 „Gefällt mir“

Jemand aus der Community hat den Fehler im Template gefunden :slight_smile:

Hier mal ein Beispieltemplate:

{% set rooms = "[" %}
{% if states('input_boolean.raum_eg_kuche') == 'on' %}
    {% set rooms = rooms + ",16" %}
{% endif %}
{% if states('input_boolean.raum_eg_wohnzimmer') == 'on' %}
    {% set rooms = rooms + ",17" %}
{% endif %}
{% if states('input_boolean.raum_eg_esszimmer') == 'on' %}
    {% set rooms = rooms + ",18" %}
{% endif %}
{% if states('input_boolean.raum_eg_flur') == 'on' %}
    {% set rooms = rooms + ",20" %}
{% endif %}
{% if states('input_boolean.raum_eg_nahzimmer') == 'on' %}
    {% set rooms = rooms + ",21" %}
{% endif %}
{% if states('input_boolean.raum_eg_toilette') == 'on' %}
    {% set rooms = rooms + ",22" %}
{% endif %}
{% if states('input_boolean.raum_eg_badezimmer') == 'on' %}
    {% set rooms = rooms + ",23" %}
{% endif %}
{% if states('input_boolean.raum_eg_pia') == 'on' %}
    {% set rooms = rooms + ",24" %}
{% endif %}
{% set rooms = rooms + "]" %}
{{rooms| replace("[,", "[")}}

Umgesetzt habe ich das dann so:

Und für die Vollständigkeit noch das Skript dazu

alias: Sauge und Wische Erdgeschoss Räume
sequence:
  - alias: Saugen eingeschaltet
    if:
      - condition: state
        entity_id: input_boolean.saugen
        state: "on"
    then:
      - action: vacuum.set_fan_speed
        metadata: {}
        data:
          fan_speed: max_plus
        target:
          device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
      - action: vacuum.send_command
        metadata: {}
        data:
          command: app_segment_clean
          params: "{{states('sensor.raume_eg')}}"
        target:
          device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
      - device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
        domain: select
        entity_id: 101b671708a4ce2c5d9570ccd80ef6db
        type: select_option
        option: "off"
  - alias: Wischen eingeschaltet
    if:
      - condition: state
        entity_id: input_boolean.wischen
        state: "on"
    then:
      - alias: Saugen und Wischen sind eingeschaltet
        if:
          - condition: and
            conditions:
              - condition: state
                entity_id: input_boolean.saugen
                state: "on"
              - condition: state
                entity_id: input_boolean.wischen
                state: "on"
        then:
          - wait_for_trigger:
              - entity_id:
                  - vacuum.roborock_s8_pro_ultra
                to: docked
                for:
                  hours: 0
                  minutes: 1
                  seconds: 0
                trigger: state
            timeout:
              hours: 2
              minutes: 0
              seconds: 0
              milliseconds: 0
          - device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
            domain: select
            entity_id: 64080f8d493e7254e61bb748836e23b2
            type: select_option
            option: standard
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
      - device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
        domain: select
        entity_id: 101b671708a4ce2c5d9570ccd80ef6db
        type: select_option
        option: moderate
      - delay:
          hours: 0
          minutes: 0
          seconds: 1
          milliseconds: 0
      - action: vacuum.set_fan_speed
        metadata: {}
        data:
          fan_speed: "off"
        target:
          device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
      - delay:
          hours: 0
          minutes: 0
          seconds: 1
          milliseconds: 0
      - action: vacuum.send_command
        metadata: {}
        data:
          command: app_segment_clean
          params: "{{states('sensor.raume_eg')}}"
        target:
          device_id: fda5950e2e44e5f2d95b9c5dcb413a6c
description: ""
mode: single

2 „Gefällt mir“

Danke da muss ich jetzt erst mal wieder durch steigen.
Sehe ich das richtig das ich für jeden Raum einen input.boolen brauche?
Bei so was bin ich noch ein ziemlicher Anfänger :see_no_evil:

1 „Gefällt mir“

Ja, für jeden Raum habe ich einen Input Boolean Helfer angelegt. Dadurch ist dann halt Multiselect möglich. Leider bietet die HA Drop Down Liste ja kein Multiselect… Kann man bestimmt schöner machen, aber so funktioniert es und wird fleißig verwendet :slight_smile:

2 „Gefällt mir“

bei dem Script hänge ich. Bei Ändere die Option. Keine Ahnung was ich da bei Aktion jeweils angeben muss.
Muss ich mir noch mal in ruhe anschauen.

1 „Gefällt mir“

Die sind sehr schnell angelegt, einfach unter Einstellungen Geräte ein paar Schalter / input_boolean für die Räume anlegen und schon kannst du die Button entsprechend benutzen. :slight_smile:

Die Raumreinigung ist schon cool und nutze ich bei meinem Dreame L10s ultra auch sehr gerne. Das muss standard werden, dass Räume oder Bereiche angefahren werden können.

1 „Gefällt mir“

die Schalter habe ich alle. Bei dem Script hänge ich noch ein bisschen fest.
bei

type: select_option
option: standard

und

type: select_option
option: moderate

so wird es bei mir nicht übernommen

1 „Gefällt mir“

Das ist bestimmt vom Device Abhängig. So sieht es im Skript aus.

2 „Gefällt mir“

Danke @smarthomeandmore jetzt habe ich es und weiß was damit bezweckt werden soll.

2 „Gefällt mir“

Irgendwie habe ich Mist gebaut. Wenn der Robo jetzt losfährt zum saugen sag er kurz nach dem er die Station verlassen hat, Mopp wird gereinigt under fährt zur Station zurück :joy:
Edit: Krieg es nicht hin. Wenn er nur saugen soll wäscht er vorher immer erst den Mopp. So sieht mein Script aus. Vielleicht sieht einer den Fehler.

alias: Sauge und Wische Räume im EG
sequence:
  - alias: Saugen eingeschaltet
    if:
      - condition: state
        entity_id: input_boolean.saugen
        state: "on"
    then:
      - action: vacuum.set_fan_speed
        metadata: {}
        data:
          fan_speed: max
        target:
          device_id:
            - 8b07bd82706df95c672f7df2b8f463cb
      - action: vacuum.send_command
        metadata: {}
        data:
          command: app_segment_clean
          params: "{{states('sensor.auswahl_raume')}}"
        target:
          device_id:
            - 8b07bd82706df95c672f7df2b8f463cb
      - device_id: 8b07bd82706df95c672f7df2b8f463cb
        domain: select
        entity_id: 30efaaa3a085dc9277caef475b8b066c
        type: select_option
        option: "off"
  - alias: Wischen eingeschaltet
    if:
      - condition: state
        entity_id: input_boolean.wischen
        state: "on"
    then:
      - alias: Saugen und Wischen sind eingeschaltet
        if:
          - condition: and
            conditions:
              - condition: state
                entity_id: input_boolean.saugen
                state: "on"
              - condition: state
                entity_id: input_boolean.wischen
                state: "on"
        then:
          - wait_for_trigger:
              - entity_id:
                  - vacuum.roborock_s8_pro_ultra
                to: docked
                for:
                  hours: 0
                  minutes: 1
                  seconds: 0
                trigger: state
            timeout:
              hours: 2
              minutes: 0
              seconds: 0
              milliseconds: 0
          - device_id: 8b07bd82706df95c672f7df2b8f463cb
            domain: select
            entity_id: 6a46700f79c27ccfee3f0ed4920d3a7a
            type: select_option
            option: standard
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
      - device_id: 8b07bd82706df95c672f7df2b8f463cb
        domain: select
        entity_id: 30efaaa3a085dc9277caef475b8b066c
        type: select_option
        option: moderate
      - delay:
          hours: 0
          minutes: 0
          seconds: 1
          milliseconds: 0
      - action: vacuum.set_fan_speed
        metadata: {}
        data:
          fan_speed: "off"
        target:
          device_id:
            - 8b07bd82706df95c672f7df2b8f463cb
      - delay:
          hours: 0
          minutes: 0
          seconds: 1
          milliseconds: 0
      - action: vacuum.send_command
        metadata: {}
        data:
          command: app_segment_clean
          params: "{{states('sensor.auswahl_raume')}}"
        target:
          device_id:
            - 8b07bd82706df95c672f7df2b8f463cb
description: ""
mode: single
1 „Gefällt mir“

Moin zusammen,
erstmal vielen Dank für das interessante Video.

Hab auf Basis ein Script geschrieben, mit dem man die Entity IDs automatisch ermitteln kann:

Als Parameter gibt man den Roborock Saugroboter sowie den Sensor für die aktuelle Karte an, als Ergebnis bekommt man in Mapping Name auf Raum-ID zurück. Falls man eine andere Karte als die aktuelle auslesen möchte dann gibt man statt der Entity den Namen der Karte direkt an.

Gibt man noch zusätzlich Komma-Separiert Namen von Räumen an dann verändert sich der Response:

segments:
  - 17
  - 18

Das wiederum lässt sich dann in einer Automatisierung etc. einbauen um (basierend auf Raumnamen) den Helfer los zu schicken, beispielsweise so:

alias: Rocky Reinigung Wohnung
sequence:
  - action: script.get_roborock_room_ids
    metadata: {}
    data:
      vacRobot: vacuum.roborock_s7_maxv
      current_map_entity: select.roborock_s7_maxv_ausgewahlte_karte
      room_names: Flur,Wohnzimmer
    response_variable: rooms
  - metadata: {}
    data:
      command: app_segment_clean
      params:
        - segments: "{{rooms.segments}}"
          repeat: 1
    target:
      entity_id: vacuum.roborock_s7_maxv
    action: vacuum.send_command
    enabled: true
mode: single

Hier der Quellcode für das Script:

sequence:
  - alias: Check Map Parameter
    if:
      - alias: If no map param is given
        condition: template
        value_template: >-
          {{current_map_entity is not defined and map_name_param is not
          defined}}
    then:
      - stop: No map name is given
        error: true
  - variables:
      mapname: >-
        {% if map_name_param is defined   %} {{map_name_param}} {%else%}
        {{states(current_map_entity)}} {%endif%}
  - action: roborock.get_maps
    metadata: {}
    data: {}
    target:
      entity_id: "{{vacRobot}}"
    response_variable: action_response
  - variables:
      roomJson: >-
        {% set rooms = action_response[vacRobot]['maps']  | selectattr('name',
        'eq', mapname)  | map(attribute='rooms')  | first %} {# Erstelle ein
        Dictionary mit vertauschten Schlüssel-Wert-Paaren direkt in der Schleife
        #} { {% for key, value in rooms.items() %}
          "{{ value }}": "{{ key }}"{% if not loop.last %}, {% endif %}
        {% endfor %} }
  - if:
      - condition: template
        value_template: "{{room_names is defined}}"
        alias: IF room_names is defined
    then:
      - variables:
          response: >-
            {"segments":[{% set room_names_list = room_names.split(',') %} {%
            for room in room_names_list %}
              {% if roomJson[room] is not none %}{{roomJson[room]}}{% if not loop.last %}, {% endif %}{% endif %}
            {% endfor %}]}
      - stop: ""
        enabled: true
        response_variable: response
    alias: If Room_names is defined
  - stop: ""
    enabled: true
    response_variable: roomJson
fields:
  vacRobot:
    selector:
      entity:
        filter:
          - domain: vacuum
    name: vacRobot
    description: Which vacuum robot should be used as a data source?
    default: vacuum.roborock_s7_maxv
    required: true
  current_map_entity:
    selector:
      entity:
        filter:
          - domain: select
    name: Current Map Entity
    description: >-
      Which entity contains the current map? Use as an alternative to
      map_name_param
    default: select.roborock_s7_maxv_ausgewahlte_karte
    required: false
  map_name_param:
    selector:
      text: null
    name: Map Name Param
    description: >-
      Which floormap should be used? Overides the current selected Map if used
      as an alternative to current_map_entity
  room_names:
    selector:
      text:
        multiline: false
    name: Room Names
    default: Flur,Küche
alias: Get Roborock Room IDs
description: ""

Lässt sich natürlich noch zusammen kombinieren in einem Script für „Reinige Raum xy“, hab aktuell nur den Bedarf nicht…

-Sascha aka callidus2000

3 „Gefällt mir“

Hallo zusammen,
das Video ist super hilfreich, ich verstehe nur nicht, warum so viele Helfer verwendet werden.
Leider stehe ich aber auf dem Schlauch.
Im nachfolgenden Skript übergebe ich aus der Schaltfläche Raum und Reinigungsvorgaben - dann fallen die Dropdowns weg.
In der Regel hat man ja immer die gleichen Aufgaben.
Damit würde das Skript schön schlank, nur übernimmt das Skript die Feldwerte nicht

alias: Rocky Automationsskript
description: ""
fields:
  room:
    selector:
      text: null
    name: Raumauswahl
    description: Raumauswahl
  fan_speed:
    selector:
      text: null
    name: Saugkrafteinstellung
    description: Saugkrafteinstellung
  clean_mode:
    selector:
      text: null
    name: Wischintensität
    description: Wischintensität
  mop_mode:
    selector:
      text: null
    name: Reinigungsintensität
    description: Reinigungsintensität
sequence:
  - device_id: xxx
    domain: select
    entity_id: xxx
    type: select_option
    option: "{{ clean_mode }}"
  - action: vacuum.set_fan_speed
    metadata: {}
    data:
      fan_speed: "{{ fan_speed }}"
    target:
      entity_id: vacuum.roborock_qrevo_slim
  - device_id: xxx
    domain: select
    entity_id: xxx
    type: select_option
    option: "{{ mop_mode }}"
  - action: vacuum.send_command
    metadata: {}
    data:
      command: app_segment_clean
      params:
        - segments: "{{ room }}"
    target:
      entity_id: vacuum.roborock_qrevo_slim
mode: single

Der Aufruf erfolgt über einen simplen Button:

Leider kommt als Fehlermeldung, dass der Sauger den Feldnamen nicht verarbeiten kann.
Auch wenn man das Skript über die Entwicklerwerkzeuge aufruft.
Wahrscheinlich habe ich irgendwo einen Denkfehler.
Danke

1 „Gefällt mir“

Ich vermute, dass es daran liegt, dass du in „room“ ja nur die 16,22 übergibst.
Korrekt müsste es sein [16,20] . Wenn du dein „room“ Feld am Anfang mit „[“ und am Ende mit „]“ schließt, sollte es so auch funktionieren. Kannst du ja direkt bei Anwendung des „Felds“ im Script ergänzen.
Und das Segments braucht es dann nicht mehr.

In diesem Beispiel lese ich aus dem Helfer genau diese Infos aus.
D.h. in sensor.raume_eg steht [16,22]

action: vacuum.send_command
metadata: {}
data:
  command: app_segment_clean
  params: "{{states('sensor.raume_eg')}}"
target:
  device_id: deinedeviceID
1 „Gefällt mir“

Danke, das hatte ich übersehen.
Meine Problem scheint aber in erster Linie die Übergabe Wischparameter zu sein:

Option {{ clean_mode }} ist für die Entität select.roborock_qrevo_slim_wisch_intensitat nicht gültig, gültige Optionen sind: off, mild, moderate, intense, custom.

Die Übergabe erfolgt wie in der Dokumentation beschrieben - auch der Umweg über die Automation liefert den gleichen Fehler.
Der Sauger wird angesprochen, da ein ping zu hören ist (so wie bei der Übergabe von Plänen in der App).
Als notification kommen die Parameter im Script an.
Dennoch meldet HA, dass „clean_mode“ nicht gültig sei.

Hier noch ein Update:
Es ist (zumindest für mich) möglich wie oben beschrieben Raum und Saugmodus zu übergeben - also die Textfelder im Script.
MopModus und Wischintensität übernimmt er nicht.
Offensichtlich habe ich hier noch eine Syntaxfehler.

1 „Gefällt mir“

Hi,
danke erstmal für das Video @smarthomeandmore
Soweit tut das auch bei mir, allerdings hänge ich noch an der kleine ecke der Repeats.
Vorher hatte ich ja also Parameter:
segment:

  • RaumIDs
    repeat: 2
    jetzt habe ich es so wie hier im Beispiel:
  • action: vacuum.send_command
    metadata: {}
    data:
    command: app_segment_clean
    params: „{{states(‚sensor.raume_eg‘)}}“
    target:
    device_id:

Aber wie bekomme ich jetzt noch den Parameter „repeat:“ da rein…

Danke schonmal :slight_smile:

1 „Gefällt mir“

Denke das geht dann so.

action:
  - repeat:
      count: 2
      sequence:
        - service: vacuum.send_command
          metadata: {}
          data:
            command: app_segment_clean
            params: "{{ states('sensor.raume_eg') }}"
          target:
            device_id: DEIN_DEVICE_ID

1 „Gefällt mir“