Deebot in Home Assistant einbinden

Anmerkung: Diese Anleitung ist gültig bis HA2024.1 und ab HA2024.2. Hier wurden zwar die Komponenten in den Core überführt und mit der Ecovacs Core Integration zusammengeführt, jedoch hat sich dadurch nicht viel geändert. Die Migration sieht jedenfalls so aus: 1. Entfernen der Deebot Integration in Geräte & Dienste – 2. Deinstallation Deebot 4 Home Assistant in HACS – 3. Installation der Ecovacs Integration

Ich habe mir vor ein paar Wochen den Ecovas Deebot T10* zugelegt. Dabei handelt es sich um einen Saugroboter mit Wischfunktion. Als Deebot T10+* gibt es diesen auch mit Absaugstation. Bisher bin ich recht zufrieden mit dem Roboter und lasse ihn alle zwei Tage durch die Wohnung huschen. Mit zwei Kindern und einer Katze liegt immer etwas rum und ich war dazu genötigt noch mehr zu saugen, was ich aber nicht selber machen wollte. So musste eine Aushilfe her. Eventuell schreibe ich dazu noch ein ausführliches Review, hier soll es aber erst mal um die Integration in Home Assistant gehen. Danke Deebot 4 Home Assistant ist die Einbindung auch relativ einfach. Entgegen der Anleitung hatte ich ein paar kleinere Probleme, auf die ich hier eingehen werde. Unser Ziel ist es die Advanced UI in unser Dashboard zu integrieren.

Zuletzt aktualisiert am 25. Mai 2024 um 0:31 . Wir weisen darauf hin, dass sich hier angezeigte Preise inzwischen geändert haben können. Alle Angaben ohne Gewähr.

Installation Deebot 4 Home Assistant (bis HA 2024.1)

Ich gehe mal davon aus das ihr HACS bereits installiert habt. Unter Integration wählt ihr „Durchsuchen und Herunterladen von Repositories“ und suchtr dort nach Deebot 4 Home Assistant. Installiert dieses und startet Home Assistant neu.

Geht nun zu Einstellungen -> Geräte und Dienste -> Integration Hinzufügen. Sucht nach Deebot und wählt „Deebot 4 Home Assistant“. Wöhlt als Variante Cloud und gebt im nächsten Dialog eure Zugangsdaten an. Für Deusctland wählt ihr als Land de und Kontinent eu.

Anschließend könt ihr in die Integration gehen und alle Entitäten zu eurem Deebot aktivieren.

Somit habt ihr euren Deebot erst mal grundlegend in Home Assistant eingebunden. Damit ihr ihn aber auch ordentlich steuern könnt, benötigen wir ein paar Scripte.

Ecovacs Integration hinzufügen (ab HA 2024.2)

Ab Home Assistant 2024.2 wurde die Integration in den Core Überführt, das macht es etwas einfacher. Geht einfach auf Einstellungen -> Geräte & Dienste -> INTEGRATION HINZUFÜGEN. Dort sucht ihr nach Ecovacs und konfiguriert die Integration entsprechend. Anschließend könt ihr in die Integration gehen und alle Entitäten zu eurem Deebot aktivieren.

Notwendige Karte installieren.

Das Advanced UI Beispiel benötigt zwei weitere Karten für euer Dashboard, beide lassen sich über HACS installieren. Ihr benötigt zusätzlich noch die Vacuum Card und Button Card. Ihr findet beide im Frontedn Bereich von HACS.

Deebot Scripte einbinden

Wir fangen erst mal damit an, die Räume auszulesen. Euer Deebot muss dazu seine Kartierungsfahrt abgeschlossen haben und ihr solltet die Räume benannt und angepasst haben.

Wählt in der Deebot Integration euer Gerät aus, klickt in den Steuerelemente auf euren Roboter und klappt im folgenden Fenster die Attribute auf. Wichtig sind hier die Namen für die einzelnen Räume, denn diese müssen wir später in den Scripten eintragen.

Alle folgenden Scripte kommen in die configuration.yaml, außer ihr habt z.B. eine eigene Datei für Scripte oder Automations. XYZ müsst ihr durch den Namen eures Deebot ersetzen.

Script

script:
  deebot_clean:
    description: Start a deebot cleaning task
    variables:
      queue: input_text.deebot_XYZ_queue
      vacuum_bot: vacuum.XYZ
    sequence:
      - alias: Get room numbers
        variables:
          # See for appending to list
          # https://github.com/home-assistant/core/issues/33678#issuecomment-609424851
          rooms: >-
            {%- set queue_split = states(queue).split(",") -%}
            {%- set rooms = state_attr(vacuum_bot, "rooms")-%}
            {%- set data = namespace(rooms=[]) -%}
            {%- for room_name in queue_split -%}
              {%- set data.rooms = data.rooms + [rooms[room_name]] -%}
            {%- endfor -%}
            {{ data.rooms | join(",") }}
      - alias: Send cleaning job to vacuum
        service: vacuum.send_command
        data:
          entity_id: "{{ vacuum_bot }}"
          command: spot_area
          params:
            rooms: "{{ rooms }}"
            cleanings: 1

  deebot_room_queue:
    description: Add/Remove a room from the queue
    fields:
      queue:
        description: The queue variable
        example: input_text.deebot_XYZ_queue
      room:
        description: Room, which should be removed or added
        example: kitchen
    sequence:
      - service: input_text.set_value
        target:
          entity_id: "{{ queue }}"
        data:
          value: >-
            {%- set queue_state = states(queue) -%}
            {%- set queue_split = queue_state.split(",") -%}
            {%- if queue_state | length == 0 -%}
              {{ room }}
            {%- elif room in queue_split -%}
              {{ queue_split | reject("eq", room) | list | join(",")}}
            {%- else -%}
              {{ (queue_split + [room]) | join(",") }}
            {%- endif -%}

Automation

Da es immer wieder zu Problemen mit den Automations kommt, solltet ihr sie manuell anlegen. Erstellt einen neue Automatisierung und wechselt in den YAML Modus. Fügt nun deen Code-BLock ein und ändert XYZ in den Namen eures Robots. Anschließend speichern und es sollte passen.

alias: Staubsauger Zimmer resetieren
trigger:
  - platform: event
    event_type: deebot_cleaning_job
    event_data:
      status: finished
  - platform: state
    entity_id:
      - vacuum.XYZ
    to: docked
condition: []
action:
  - alias: Reset room queue
    service: input_text.set_value
    target:
      entity_id: input_text.deebot_XYZ_queue
    data:
      value: ""
mode: single

Hier nochmals der Block, wenn ihr die Automatisierung in die configurations.yaml einfügen wollt, ich würde aber obige Methode verwenden.

automation:
  - alias: Staubsauger Zimmer resetieren
    trigger:
      - platform: event
        event_type: deebot_cleaning_job
        event_data:
          status: finished
      - platform: state
        entity_id:
          - vacuum.XYZ
        to: docked
    condition: []
    action:
    - alias: Reset room queue
      service: input_text.set_value
      target:
        entity_id: input_text.deebot_XYZ_queue
      data:
        value: ""
    mode: single

Recorder

recorder:
  exclude:
    entities:
      - input_text.deebot_XYZ_queue
      - script.deebot_room_queue
    entity_globs:
      - sensor.deebot_*_queue_*

Input_Text

input_text:
  deebot_XYZ_queue:
    name: XYZ Raum Reihenfolge
    max: 255 # Current max limit. See https://www.home-assistant.io/integrations/input_text/#max

Template

Im Abschnitt Sensor des Templates müsst ihr einen Abschnitt für jeden Raum erzeugen, dabei verwendet ihr die Namen der Räume, welche wir unter Attribute ausgelesen haben.

# Room name comes from the integration to match attribute names
template:
  unique_id: deebot_XYZ_queue
  trigger:
    - platform: state
      entity_id: input_text.deebot_XYZ_queue
  sensor:
    # Add for each room the following. Change room_name accordingly
    - unique_id: deebot_XYZ_queue_living_room
      name: deebot_XYZ_queue_living_room
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "living_room" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}

Geht nun auf die Entwicklerwerkzeuge (Hammer-Symbol), lasst die Konfiguration prüfen und startet Home Assistant neu, wenn alles ok ist.

Einfacher geht es mit Packages. Ihr erzeugt den neuen Eintrag packages innerhalb der Abschnittes homeassistant.

homeassistant:
  packages: !include_dir_named packages
configuration.yaml

Nun erzeugt ihr den neuen Ordner packeges in eurem config Verzeichnis. Ich verwende dazu das Advanced SSH & Web Terminal Add-on.

cd config
mkdir packages

Anschließend erzeugt ihr, z.B. mit dem File editor Add-on, eine neuen YAML-Datei, wir z.B. ecovacs.yaml, mit folgendem Inhalt. XYZ müsst ihr natürlich durch den Namen eures Roboters ergänzen und auch die Räume im Template Abschnitt anpassen.

script:
  deebot_clean:
    description: Start a deebot cleaning task
    variables:
      queue: input_text.deebot_XYZ_queue
      vacuum_bot: vacuum.XYZ
    sequence:
      - alias: Get room numbers
        variables:
          # See for appending to list
          # https://github.com/home-assistant/core/issues/33678#issuecomment-609424851
          rooms: >-
            {%- set queue_split = states(queue).split(",") -%}
            {%- set rooms = state_attr(vacuum_bot, "rooms")-%}
            {%- set data = namespace(rooms=[]) -%}
            {%- for room_name in queue_split -%}
              {%- set data.rooms = data.rooms + [rooms[room_name]] -%}
            {%- endfor -%}
            {{ data.rooms | join(",") }}
      - alias: Send cleaning job to vacuum
        service: vacuum.send_command
        data:
          entity_id: "{{ vacuum_bot }}"
          command: spot_area
          params:
            rooms: "{{ rooms }}"
            cleanings: 1
  deebot_room_queue:
    description: Add/Remove a room from the queue
    fields:
      queue:
        description: The queue variable
        example: input_text.deebot_XYZ_queue
      room:
        description: Room, which should be removed or added
        example: kitchen
    sequence:
      - service: input_text.set_value
        target:
          entity_id: "{{ queue }}"
        data:
          value: >-
            {%- set queue_state = states(queue) -%}
            {%- set queue_split = queue_state.split(",") -%}
            {%- if queue_state | length == 0 -%}
              {{ room }}
            {%- elif room in queue_split -%}
              {{ queue_split | reject("eq", room) | list | join(",")}}
            {%- else -%}
              {{ (queue_split + [room]) | join(",") }}
            {%- endif -%}
automation:
  - alias: Staubsauger Zimmer resetieren
    trigger:
      - platform: event
        event_type: deebot_cleaning_job
        event_data:
          status: finished
    - platform: state
      entity_id:
        - vacuum.XYZ
      to: docked
    condition: []
    action:
    - alias: Reset room queue
      service: input_text.set_value
      target:
        entity_id: input_text.deebot_XYZ_queue
      data:
        value: ""
    mode: single
recorder:
  exclude:
    entities:
      - input_text.deebot_XYZ_queue
      - script.deebot_room_queue
    entity_globs:
      - sensor.deebot_*_queue_*

input_text:
  deebot_XYZ_queue:
    name: XYZ Raum Reihenfolge
    max: 255 # Current max limit. See https://www.home-assistant.io/integrations/input_text/#max
# Room name comes from the integration to match attribute names		
template:
  unique_id: deebot_XYZ_queue
  trigger:
    - platform: state
      entity_id: input_text.deebot_XYZ_queue
  sensor:
    # Add for each room the following. Change room_name accordingly
    - unique_id: deebot_susi_queue_living_room
      name: deebot_XYZ_queue_living_room
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "living_room" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_kitchen
      name: deebot_XYZ_queue_kitchen
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "kitchen" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_corridor
      name: deebot_XYZ_queue_corridor
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "corridor" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_bedroom
      name: deebot_XYZ_queue_bedroom
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "bedroom" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_bathroom
      name: deebot_XYZ_queue_bathroom
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "bathroom" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_storeroom
      name: deebot_XYZ_queue_storeroom
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "storeroom" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
    - unique_id: deebot_XYZ_queue_kids_room
      name: deebot_XYZ_queue_kids_room
      # room_name must match the room name provided by the vacuum
      state: >
        {% set room_name = "kids_room" %}
        {% set queue = trigger.to_state.state.split(",") %}
        {{ queue.index(room_name)+1 if room_name in queue else 0 }}
ecovacs.yaml

Anschließend über die Entwicklertools die Konfiguration prüfen und HA neu starten. Somit habt ihr einen Großteil der Konfiguration in einer Datei und überladet euch nicht eure configuration.yaml.

Deebot UI Konfiguration

Folgender Block kommt in eure RAW-Datei. Diese findet ihr, wenn ihr eure Dashbaord bearbeitet. Fügt den Block einfach ans Ende an, vergesst aber nicht den Namen eures Roboters zu ändern.

button_card_templates:
  vacuum_service:
    color: var(--text-color)
    entity: vacuum.XYZ 
    tap_action:
      action: call-service
      service_data:
        entity_id: vacuum.XYZ
    lock:
      enabled: |
        [[[ return variables.enabled ]]]
      exemptions: []
    styles:
      card:
        - height: 80px
      lock:
        - color: var(--primary-text-color)
    state:
      - operator: template
        value: |
          [[[ return variables.enabled ]]]
        styles:
          card:
            - color: var(--disabled-text-color)
  vacuum_room:
    color: var(--text-color)
    variables:
      # change me
      lock_enabled: >
        [[[ return ['cleaning', 'paused'].includes(states['vacuum.XYZ'].state)
        ]]]
    state:
      - operator: template
        value: |
          [[[ return variables.lock_enabled && entity.state == 0 ]]]
        styles:
          card:
            - color: var(--disabled-text-color)
      - styles:
          card:
            - background-color: var(--primary-color)
        operator: ">="
        value: 1
    styles:
      card:
        - font-size: 12px
      grid:
        - position: relative
      custom_fields:
        order:
          - display: |
              [[[
                if (entity.state == "0")
                  return "none";
                return "block";
              ]]]
          - position: absolute
          - left: 5%
          - top: 5%
          - height: 20px
          - width: 20px
          - font-size: 20px
          - font-weight: bold
          - line-height: 20px
    custom_fields:
      order: |
        [[[ return entity.state ]]]
    tap_action:
      action: call-service
      service: script.deebot_room_queue
      service_data:
        queue: input_text.deebot_XYZ_queue
    lock:
      enabled: |
        [[[ return variables.lock_enabled ]]]
      exemptions: []

Jetzt kommt die Konfiguration der eigentlichen Karte. Den markierten Bereich müsst ihr an eure Gegebenheiten, also an eurem Räume, anpassen. In entity und room müsst ihr die Namen aus eurem Deebot übernehmen. Je nach Integration (HACS oder Core) müsst ihr auch die Namen der Entity-IDs in der Vacuum-Card anpassen (hauptburste, lebensdauer_der_hauptburste)

type: vertical-stack
cards:
  - type: custom:vacuum-card
    entity: vacuum.XYZ
    stats:
      default:
        - entity_id: sensor.XYZ_lebensdauer_der_hauptburste
          unit: '%'
          subtitle: Hauptbürste
        - entity_id: sensor.XYZ_lebensdauer_der_seitenbursten
          unit: '%'
          subtitle: Seitenbürsten
        - entity_id: sensor.XYZ_lebensdauer_des_filters
          unit: '%'
          subtitle: Filter
      cleaning:
        - entity_id: sensor.XYZ_flache_gereinigt
          unit: 
          subtitle: Geputzte Fläche
        - entity_id: sensor.XYZ_reinigungsdauer
          unit: Minuten
          subtitle: Reinigungsdauer
    show_status: true
    show_toolbar: false
    compact_view: false
  - type: custom:button-card
    color: auto-no-temperature
    name: Räume zum Putzen auswählen
    styles:
      card:
        - font-size: 18px
        - height: 30px
      name:
        - color: var(--primary-color)
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_living_room
        icon: mdi:sofa
        name: Wohnzimmer
        tap_action:
          service_data:
            room: living_room
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_kitchen
        icon: mdi:stove
        name: Küche
        tap_action:
          service_data:
            room: kitchen
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_corridor
        icon: mdi:shoe-print
        name: Flur
        tap_action:
          service_data:
            room: corridor
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_bedroom
        icon: mdi:bed-king
        name: Schlafzimmer
        tap_action:
          service_data:
            room: bedroom
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_bathroom
        icon: mdi:shower
        name: Badezimmer
        tap_action:
          service_data:
            room: bathroom
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_storeroom
        icon: mdi:locker-multiple
        name: Abstellkammer
        tap_action:
          service_data:
            room: storeroom
      - type: custom:button-card
        template: vacuum_room
        entity: sensor.deebot_XYZ_queue_kids_room
        icon: mdi:teddy-bear
        name: Kinderzimmer
        tap_action:
          service_data:
            room: kids_room
  - type: horizontal-stack
    cards:
      - type: conditional
        conditions:
          - entity: vacuum.XYZ
            state_not: cleaning
          - entity: vacuum.XYZ
            state_not: paused
        card:
          type: custom:button-card
          template: vacuum_service
          icon: mdi:play
          name: Start
          tap_action:
            action: call-service
            service: script.deebot_clean
          variables:
            enabled: |
              [[[ 
                return ((!states['input_text.deebot_XYZ_queue'].state || 
                    states['input_text.deebot_XYZ_queue'].state.length === 0)
                    && ['docked', 'idle', 'error', 'returning'].includes(entity.state))
              ]]]
      - type: conditional
        conditions:
          - entity: vacuum.XYZ
            state: cleaning
        card:
          type: custom:button-card
          color: auto
          icon: mdi:pause
          name: Pause
          tap_action:
            action: call-service
            service: vacuum.pause
            service_data:
              entity_id: vacuum.XYZ
          styles:
            card:
              - height: 80px
              - background-color: var(-color)
      - type: conditional
        conditions:
          - entity: vacuum.XYZ
            state: paused
        card:
          type: custom:button-card
          color: auto
          icon: mdi:play-pause
          name: Weiter
          tap_action:
            action: call-service
            service: vacuum.start
            service_data:
              entity_id: vacuum.XYZ
          styles:
            card:
              - height: 80px
              - background-color: var(-color)
      - type: custom:button-card
        template: vacuum_service
        icon: mdi:stop
        name: Stop
        tap_action:
          service: vacuum.stop
        variables:
          enabled: |
            [[[ 
              return !(['cleaning', 'paused', 'returning'].includes(entity.state))
            ]]]
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        template: vacuum_service
        icon: mdi:home-map-marker
        name: Zurück zur Ladestation
        tap_action:
          service: vacuum.return_to_base
        variables:
          enabled: |
            [[[ 
              return ['docked', 'returning'].includes(entity.state)
            ]]]
      - type: custom:button-card
        color: auto
        icon: mdi:map-marker
        name: Lokalisieren
        tap_action:
          action: call-service
          service: vacuum.locate
          service_data:
            entity_id: vacuum.XYZ
        styles:
          card:
            - height: 80px
            - background-color: var(-color)
  - show_state: false
    show_name: false
    camera_view: auto
    type: picture-entity
    tap_action:
      action: none
    hold_action:
      action: none
    entity: image.XYZ_karte

Anschließend erhaltet ihr eine schöne Karte, mit der ihr euren Robot steuern könnt.

Nun habt ihr die Möglichkeit nacheinander die Räume auszuwählen und somit eine Reinigungs-Plan festzulegen.

Wie immer seid ihr aber in eurer eigenen Gestaltung frei und könnt euren Bot nun ganz nach eurem Geschmack in eure Dashbaords integrieren.

Die Anzeige der Produkte wurde mit dem affiliate-toolkit Plugin umgesetzt.

36 Gedanken zu „Deebot in Home Assistant einbinden“

  1. Hallo,

    erstaml, vielen Dank für die tolle Anleitung. Ich bin relativ neu in der HA-Welt. Habe deine Aneleitung umgesetzt. Aber irgendwie zeigt er bei der Card-Erstellung bei den Raumsymbolen im Hintergund der Symbole ein „un“ an. Die Buttons funktionieren auch nicht. Wo könnte der Fehler liegen?

    Vielen Dank

    Antworten
      • Ahh!!
        Genau da lieht wohl der Fehler. Die Automation ist rot. Folgender Fehler beim Anklicken der Automation:

        Auslöser: expected dict for dictionary value @ data[‚event_data‘]
        Aktionen: extra keys not allowed @ data[0][‚target‘][‚data‘

        Ist das ein EInrückfehler?

        Antworten
        • Vermutlich.

          So sieht es in meiner automations.yaml aus:

          - id: 8ccaa637746c4d5f89f84e6ac73ffdab
          alias: Staubsauger Zimmer resetieren
          trigger:
          - platform: event
          event_type: deebot_cleaning_job
          event_data:
          status: finished
          - platform: device
          device_id: 6f63acd89301096af4a754dfe232fed1
          domain: vacuum
          entity_id: 0db40db6e4c1c22df5f5e15ff2a9a756
          type: docked
          condition: []
          action:
          - alias: Reset room queue
          service: input_text.set_value
          target:
          entity_id: input_text.deebot_uschi_queue
          data:
          value: ''
          mode: single

          Leider ist das mit der FOrmatierung ein Krampf, hat dir das auch per Mail geschickt.

          Antworten
    • Hi,
      leider werden auch mir die Raume nicht angezeigt. Auf der entsprechenden Karte sehe ich zwar die Schaltfläche „Räume zum Putzen auswählen“, aber diese ist ohne Funktion. Auch darunter sehe ich nur die Buttons „Stop“; „Zurück zur Ladestation“ und „Lokalisieren“. Die Karte wird korrekt angezeigt auch der Zustand der Bürsten etc.

      Ich habe HA mehrfach neu gestartet, die Automation laufen lassen (woran sehe ich dass sie korrekt läuft?) und die Räume versucht umzunennen. Leider ohne Erfolg.

      Unter Attribute finde ich folgende Räume:
      living_room: 0
      schlafzimmer: 2
      flur: 1
      kuche: 4

      Was passiert mit den Nummern? Muss ich die irgendwo eingeben?

      Meine RAW Config sieht so aus:
      name: Räume zum Putzen auswählen
      styles:
      card:
      – font-size: 18px
      – height: 30px
      name:
      – color: var(–primary-color)
      – type: horizontal-stack
      cards:
      – type: custom:button-card
      template: vacuum_room
      entity: sensor.deebot_MeinRoboter_queue_living_room
      icon: mdi:sofa
      name: living_room
      tap_action:
      service_data:
      room: living_room

      Antworten
  2. Moin Björn,

    sehr schön erklärt, funktioniert auch super auf meinem Dashboard. Vielen Dank.

    Ich habe vor Wochen mal mit Dwain’s Dashboard herumgespielt, und hier scheint der Karten Code nicht zu funktionieren. Entweder meckert er über die button-card oder über vacuum-room im Code. Ich habe im github ein Issue dazu erstellt, doch leider befriedigt mich Dwains antwort nicht wirklich, da es ja nur ein button-card template zu installieren gibt.
    https://github.com/dwainscheeren/dwains-lovelace-dashboard/issues/786

    Hast du einen flotten Tipp wie man das Problem umgehen könnte? Screenshot findest du im github issue.

    Vielen Dank und Gruß

    Sebastian

    Antworten
  3. Hallo Björn!
    Zunächst einmal muss ich sagen…..tolle, verständliche Anleitung!
    Nun aber zu meinem Problem:
    Ich besitze einen Deebot Ozmo 930pro. Leider lässt er sich mit der offiziellen Integration nicht einbinden. Er wird zwar angezeigt, jedoch nur als Entität und kann nicht gesteuert werden (bekanntes Progöem bei der 900er Reihe). In der Vergangenheit hab ich ihn mit der Integration von Ligio zum laufen bekommen. das funktioniert nun leider nicht mehr :-(.
    Hast du einen Tipp wie ich ihn doch noch zum laufen bekomme?
    LG

    Antworten
  4. Hallo Björn,

    vielen Dank den tollen Blog. Ich habe es auch probiert. Funktioniert soweit auch, jedoch habe ich auch das Problem, dass der Status in den Räumen immer auf Unassigned stehen bleibt. Habe schon wie oben beschrieben die Automation nochmals getriggert und auch neugestartet, aber hilft nichts.

    Gibt es sonst noch einen Tipp was die Ursache sein kann?

    Grüße
    Julian

    Antworten
  5. Hey, leider habe ich Probleme bei der Button Card mit dem Omni X1.

    Ich sehe die einzelnen Räume nicht.
    „Template vacuum_room is missing“ erhalte ich als Fehler.

    Antworten
  6. Hi,
    wir haben einen T30 Pro, die Integration des Geräts selbst war keine Problem.
    Nun habe ich mich mit deinen Script beschäftigt und dieses über Packages eingebunden.
    Ich erhalte jedoch folgenden Fehlercode und weiss gerade nicht woran es liegen könnte

    Invalid config for ‚recorder‘ at packages/ecovacs.yaml, line 74: Entity ID input_text.deebot_vacuum.saugi_queue is an invalid entity ID for dictionary value ‚recorder->exclude->entities‘, got [‚input_text.deebot_vacuum.saugi_queue‘, ’script.deebot_room_queue‘]
    Invalid config for ‚input_text‘ at packages/ecovacs.yaml, line 80: invalid slug deebot_vacuum.saugi_queue (try deebot_vacuum_saugi_queue) for dictionary value ‚input_text‘, got OrderedDict({‚deebot_vacuum.saugi_queue‘: OrderedDict({’name‘: ‚Saugi Raum Reihenfolge‘, ‚max‘: 255})})

    Vielleicht kannst du mir ja einen Denkanstoss geben

    Antworten
  7. Hallo Björn
    Ich habe erfolgreich einen T30 Omni integriert. Funktioniert einwandfrei. Danke für die gute Anleitung.
    Nun mein Problem ich habe einen zweiten Roboter T10 Turbo hinzugefügt danach kommt beim kontrollieren Warnung

    Konfigurationswarnungen
    Setup of package ‚putzfrau_stefan‘ failed: integration ’script‘ has duplicate key ‚description‘

    Wenn ich auf der neu erstellten Karte einen Raum auswähle wird dieser beim ersten Roboter angewählt und das Schloss vom Startbutton verschwindet auch beim ersten Roboter obwohl ich Namen der Räume und Roboter angepasst habe.
    Vielleicht hast du ja eine Lösung für die korrekte Einbindung eines zweiten Roboters.
    Gruß Klaus

    Antworten
  8. Hallo Björn,
    danke erstmal für diese Anleitung.
    Ich habe (m.m.n) alles so gemacht wie du beschrieben hast, und es scheint auch alles zu klappen, BIS auf die tablets „vacuum_room“ und „vacuum_service“ die fehlen.
    Die Fehlermeldung in der button card ist: „Button-card template ‚vacuum_room‘ is missing“ und „Button-card template ‚vacuum_service‘ is missing“

    der Quellcode mal hier angehängt:

    views:
    – title: Home
    badges: []
    cards:
    – type: vertical-stack
    cards:
    – type: custom:vacuum-card
    entity: vacuum.staubi
    stats:
    default:
    – entity_id: sensor.staubi_lebensdauer_der_hauptburste
    unit: ‚%‘
    subtitle: Hauptbürste
    – entity_id: sensor.staubi_lebensdauer_der_seitenburste
    unit: ‚%‘
    subtitle: Seitenbürsten
    – entity_id: sensor.staubi_lebensdauer_des_filters
    unit: ‚%‘
    subtitle: Filter
    cleaning:
    – entity_id: sensor.staubi_flache_gereinigt
    unit: m²
    subtitle: Geputzte Fläche
    – entity_id: sensor.staubi_reinigungsdauer
    unit: Minuten
    subtitle: Reinigungsdauer
    show_status: true
    show_toolbar: false
    compact_view: false
    – type: custom:button-card
    color: auto-no-temperature
    name: Räume zum Putzen auswählen
    styles:
    card:
    – font-size: 18px
    – height: 30px
    name:
    – color: var(–primary-color)
    – type: horizontal-stack
    cards:
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_bathroomtaubi_queue_bedroom
    icon: mdi:bed
    name: Schlafzimmer
    tap_action:
    service_data:
    room: Schlafzimmer
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_study
    icon: mdi:desk
    name: Büro
    tap_action:
    service_data:
    room: Büro
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_bathroom
    icon: mdi:bathtub
    name: Badezimmer
    tap_action:
    service_data:
    room: Badezimmer
    – type: horizontal-stack
    cards:
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_living_room
    icon: mdi:sofa
    name: Wohnzimmer
    tap_action:
    service_data:
    room: Wohnzimmer
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_corridor
    icon: mdi:shoe-sneaker
    name: Flur
    tap_action:
    service_data:
    room: Flur
    – type: custom:button-card
    template: vacuum_room
    entity: sensor.deebot_staubi_queue_kitchen
    icon: mdi:pot
    name: Küche
    tap_action:
    service_data:
    room: Küche
    – type: conditional
    conditions:
    – entity: vacuum.staubi
    state_not: cleaning
    – entity: vacuum.staubi
    state_not: paused
    card:
    type: custom:button-card
    template: vacuum_service
    icon: mdi:play
    name: Start
    tap_action:
    action: call-service
    service: script.deebot_clean
    variables:
    enabled: |
    [[[
    return ((!states[‚input_text.deebot_staubi_queue‘].state ||
    states[‚input_text.deebot_staubi_queue‘].state.length === 0)
    && [‚docked‘, ‚idle‘, ‚error‘, ‚returning‘].includes(entity.state))
    ]]]
    – type: conditional
    conditions:
    – entity: vacuum.staubi
    state: cleaning
    card:
    type: custom:button-card
    color: auto
    icon: mdi:pause
    name: Pause
    tap_action:
    action: call-service
    service: vacuum.pause
    service_data:
    entity_id: vacuum.staubi
    styles:
    card:
    – height: 80px
    – background-color: var(-color)
    – type: conditional
    conditions:
    – entity: vacuum.staubi
    state: paused
    card:
    type: custom:button-card
    color: auto
    icon: mdi:play-pause
    name: Weiter
    tap_action:
    action: call-service
    service: vacuum.start
    service_data:
    entity_id: vacuum.staubi
    styles:
    card:
    – height: 80px
    – background-color: var(-color)
    – type: custom:button-card
    template: vacuum_service
    icon: mdi:stop
    name: Stop
    tap_action:
    service: vacuum.stop
    variables:
    enabled: |
    [[[
    return !([‚cleaning‘, ‚paused‘, ‚returning‘].includes(entity.state))
    ]]]
    – type: horizontal-stack
    cards:
    – type: custom:button-card
    template: vacuum_service
    icon: mdi:home-map-marker
    name: Zurück zur Ladestation
    tap_action:
    service: vacuum.return_to_base
    variables:
    enabled: |
    [[[
    return [‚docked‘, ‚returning‘].includes(entity.state)
    ]]]
    – type: custom:button-card
    color: auto
    icon: mdi:map-marker
    name: Lokalisieren
    tap_action:
    action: call-service
    service: vacuum.locate
    service_data:
    entity_id: vacuum.staubi
    styles:
    card:
    – height: 80px
    – background-color: var(-color)
    – show_state: false
    show_name: false
    camera_view: auto
    type: picture-entity
    tap_action:
    action: none
    hold_action:
    action: none
    entity: image.staubi_karte
    button_card_templates:
    vacuum_service:
    color: var(–text-color)
    entity: vacuum.staubi
    tap_action:
    action: call-service
    service_data:
    entity_id: vacuum.staubi
    lock:
    enabled: |
    [[[ return variables.enabled ]]]
    exemptions: []
    styles:
    card:
    – height: 80px
    lock:
    – color: var(–primary-text-color)
    state:
    – operator: template
    value: |
    [[[ return variables.enabled ]]]
    styles:
    card:
    – color: var(–disabled-text-color)
    vacuum_room:
    color: var(–text-color)
    variables:
    lock_enabled: >
    [[[ return [‚cleaning‘,
    ‚paused‘].includes(states[‚vacuum.staubi‘].state) ]]]
    state:
    – operator: template
    value: |
    [[[ return variables.lock_enabled && entity.state == 0 ]]]
    styles:
    card:
    – color: var(–disabled-text-color)
    – styles:
    card:
    – background-color: var(–primary-color)
    operator: ‚>=‘
    value: 1
    styles:
    card:
    – font-size: 12px
    grid:
    – position: relative
    custom_fields:
    order:
    – display: |
    [[[
    if (entity.state == „0“)
    return „none“;
    return „block“;
    ]]]
    – position: absolute
    – left: 5%
    – top: 5%
    – height: 20px
    – width: 20px
    – font-size: 20px
    – font-weight: bold
    – line-height: 20px
    custom_fields:
    order: |
    [[[ return entity.state ]]]
    tap_action:
    action: call-service
    service: script.deebot_room_queue
    service_data:
    queue: input_text.deebot_staubi_queue
    lock:
    enabled: |
    [[[ return variables.lock_enabled ]]]
    exemptions: []

    Antworten
  9. Servus!
    Gibt es auch eine Möglichkeit, den Reinigungsmodus einzustellen?

    Also bei mir z.B.
    – nur saugen
    – saugen und wischen
    – wischen nach dem saugen
    – nur wischen

    Antworten
  10. Hi Björn,

    danke für die tolle Anleitung.

    leider erhalte ich beim letzten Skript einfügen folgende Fehlermeldung:
    Unknown type encountered: vertical-stack

    Nach googlen und durch git stöbern habe ich irgendwas gelesen, das vertical-stack und horizontal-stack nach einem Update jetzt zu Fehlern führen. Stimmt das? Und wie könnte ich den Code anpassen, dass der Fehler nicht mehr auftritt?

    Hier ein Link von einem Reddit-Thread der das Thema behandelt:
    https://www.reddit.com/r/homeassistant/comments/jmpgy4/after_updating_lovelace_cant_find/?rdt=63622

    Beste Grüße
    Fabi

    Antworten
  11. Hi, habe es durch diese Anleitung endlich auch hinbekommen! Alles funktioniert, danke!
    Aber jetzt, da ich die Räume direkt und einzeln ansteuern kann, muss es doch bestimmt auch eine Möglichkeit geben, das ganze auch über einen Sprachbefehl im Assist auszuführen. Bis jetzt startet der Saugroboter eine ganz normale Reinigung, aber ich kann ihn noch nicht in einzelne Räume schicken. Den Zugriff vom Sprachassistenten hab ich überall aktiviert. Hat da jemand eine Idee/Anleitung?

    Gruß Jerry

    Antworten
  12. Hallo 🙂
    Danke für die Anleitung habe vor Monaten damit ein Raumsteuerung hinbekommen und meine Frau war happy.
    Allerdings verliert der Deboot 920 ständig die Karte und die Räume wodurch ich alle paar Tage am Anpassen war. (Vielleicht gab es da einen Trick, aber wie er anhand der neuen Zahlen was erkennen soll, wäre mir neu)
    Jetzt haben wir gesagt, dass er immer alles saugen soll.
    Sehr schade. Wenn er mal kaputt geht hole ich mir einen wo Valetudo drauf geht.
    Hatte mir viel Erhofft aber so ist es halt.

    Antworten
  13. Hallo zusammen,

    vielen dank für die super Anleitung, klappt echt genial und sieht toll aus in meinem Dashboard.
    Jetzt noch zu meiner Frage:
    Ich habe es über Packages gemacht, wenn ich jetzt einen zweiten Sauger einbinden will, wie mache ich dass dann?
    Über eine zweite Datei? (Ecovacs2.yaml, oder muss ich das in die bestehende integrieren?
    Auch beim Dashboard stellt sich mir dann die Frage wie ich das anlegen muss? Also die button_card_template in der Grundkonfig vom Dashboard?

    Bin noch ganz frisch in HA drin, darum mag es vielleicht eine doofe Frage sein.

    Viele Grüsse und danke schonmal für ein Feedback

    Antworten
    • Ich würde es genau so machen. Du erstellts eine zweite Datei in der du den Namen des zweiten Bots nutzt und schaust das z.B. Dinge wie den Scriptnamen deebot_clean ebenfalls umbenennst, so das dieser eindeutig ist. In der Karte für den zweiten Bot muss dieses natürlich ebenfalls angepasst werden.

      Antworten
      • Hallo Björn,
        danke fürs feedback, aber irgendwo scheine ich noch einen Fehler im Denkprozess zu haben.
        Er sagt mir beim Überprüfen der config immer dass er duplicates hat.

        Hier mal die zweite yaml mit meinen bisherigen Anpassungen, hab eigentlich immer eine 2 gemacht als Änderung.
        Ist sicher nur ein kleiner Fehler, aber ich komme nicht drauf. Die Räume habe ich noch nciht angepasst, das würde noch kommen, aber ich möchte es gerne erst grundsätzlich zum laufen bringen.

        script:
        deebot2_clean:
        description: Start a deebot2 cleaning task
        variables:
        queue: input_text.deebot_saubaaar_queue
        vacuum_bot: vacuum.saubaaar
        sequence:
        – alias: Get room numbers Deebot2
        variables:
        # See for appending to list
        # https://github.com/home-assistant/core/issues/33678#issuecomment-609424851
        rooms: >-
        {%- set queue_split = states(queue).split(„,“) -%}
        {%- set rooms = state_attr(vacuum_bot, „rooms“)-%}
        {%- set data = namespace(rooms=[]) -%}
        {%- for room_name in queue_split -%}
        {%- set data.rooms = data.rooms + [rooms[room_name]] -%}
        {%- endfor -%}
        {{ data.rooms | join(„,“) }}
        – alias: Send cleaning job2 to vacuum
        service: vacuum.send_command
        data:
        entity_id: „{{ vacuum_bot }}“
        command: spot_area
        params:
        rooms: „{{ rooms }}“
        cleanings: 1
        deebot2_room_queue:
        description: Add/Remove a room from the queue2
        fields:
        queue:
        description: The queue2 variable
        example: input_text.deebot_saubaaar_queue
        room:
        description: Room, which should be removed or added queue2
        example: Wohnzimmer
        sequence:
        – service: input_text.set_value
        target:
        entity_id: „{{ queue }}“
        data:
        value: >-
        {%- set queue_state = states(queue) -%}
        {%- set queue_split = queue_state.split(„,“) -%}
        {%- if queue_state | length == 0 -%}
        {{ room }}
        {%- elif room in queue_split -%}
        {{ queue_split | reject(„eq“, room) | list | join(„,“)}}
        {%- else -%}
        {{ (queue_split + [room]) | join(„,“) }}
        {%- endif -%}
        automation:
        – alias: Staubsauger Zimmer resetieren
        trigger:
        – platform: event
        event_type: deebot_cleaning_job
        event_data:
        status: finished
        – platform: state
        entity_id:
        – vacuum.saubaaar
        to: docked
        condition: []
        action:
        – alias: Reset room queue
        service: input_text.set_value
        target:
        entity_id: input_text.deebot_saubaaar_queue
        data:
        value: „“
        mode: single
        recorder:
        exclude:
        entities:
        – input_text.deebot_saubaaar_queue
        – script.deebot2_room_queue
        entity_globs:
        – sensor.deebot_*_queue_*

        Antworten
        • Hallo Björn,
          hat sich erledigt, ich habe es hin bekommen 😉
          Danke für den Tip von oben, nach ein wenig rum suchen und probieren konnte ich als nicht Programmierer es auch zum laufen bekommen.

          Vielem Grüsse

          Antworten
  14. Vielen Dank für die Anleitung, die sofort funktioniert, sobald man die eigenen Tipp- und Einrückfehler ausgemerzt hat. Gibt es eine Möglichkeit, die Fehlermeldungen wie z.B. Frischwasser nachfüllen in HA auszugeben? Dann könnte die Ecovacs-App bis auf Ausnahmefälle ungenutzt bleiben.

    Antworten

Schreibe einen Kommentar