FIXED: Ecovacs Deebot 2019 & OZMO Series - Working Library

Thanks for all of the hard work that went into making this, I have a 920 and I have managed to get it working no problem.

Next step is to get a nice UI up and running like some of the examples (and replace the horrible app for most basic functions). I saw some mention of being able to use co-ordinates with the spot cleaning function - can anyone help me with how I can find these out for my map?

Struggling with how to get the brush and filter percentage displayed in the main image at the top of the card. I used KEM_Hass’ card. I’m using a Deebot 901 with location as US, NA. Appreciate any help, I’m not seeing where to add the attributes in the xiaomi card.

Ciao stefano sto seguendo un po’ questa tua discussione per creare una card ocme le vostre, sono riuscito in parte a fare tutto, ma ho fatto quella come l’altro ragazzo mentre la tua e piu completa, mi passeresti la tua card? Mi piacciono tutte quelle info che ci sono nella tua.

dove bisogna inserire queste righe di ocmando per avere il colore variabile?

Stefano, thanks for all the work

I’m trying to implement the map but your instructions are not really clear :slight_smile: Where do I need to paste the code you provided?

@Gabriele_Mandalari @StefanoGiu

Good job!
Could you share your card with all the related codes to make it work properly?

Fantastic the possibility to change the color according to the chosen option and also to be able to decide the cleaning areas.

Thanks

As many of you asked about the configuration I used, please find below:

Lovelace:

 ##################################
 # ASPIRAPOLVERE
 ##################################
  - badges: []
    visible: false
    cards:
      - cards:
          - buttons:
              locate: false
              pause: false
              return: false
              spot: false
              start: false
              stop: false
            entity: vacuum.aspirapolvere
            image: /local/deebot.jpg
            name: Aspirapolvere
            type: 'custom:xiaomi-vacuum-card'
            vendor: deebot
          - color: black
            entity: null
            icon: null
            name: Controllo
            styles:
              card:
                - font-size: 16px
                - background-color: black
                - color: white
              name:
                - justify-self: start
                - padding-left: 16px
            type: 'custom:button-card'
          - cards:
              - color: white
                entity: null
                icon: 'mdi:map-marker-radius'
                name: Trova
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                tap_action:
                  action: call-service
                  service: vacuum.locate
                  service_data:
                    entity_id: vacuum.aspirapolvere
                type: 'custom:button-card'
              - color: white
                entity: null
                icon: 'mdi:play'
                name: Inizia
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                tap_action:
                  action: call-service
                  service: vacuum.start
                  service_data:
                    entity_id: vacuum.aspirapolvere
                type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - input_boolean.deebot_times
                  - input_boolean.deebot_cucina
                  - input_boolean.deebot_sala
                  - input_boolean.deebot_camera
                  - input_boolean.deebot_bagno_grande
                  - input_boolean.deebot_bagno_piccolo
                  - input_boolean.deebot_corridoio
                  - input_boolean.deebot_aurora
                  - input_boolean.deebot_giovanni
                card:
                    type: 'custom:button-card'
                    color: white
                    entity: null
                    icon: 'mdi:view-dashboard-outline'
                    name: Stanze
                    styles:
                      card:
                        - font-size: 12px
                        - background-color: black
                        - color: white
                    tap_action:
                      action: call-service
                      service: script.vacuum_clean_zone
              - color: white
                entity: null
                icon: 'mdi:pause'
                name: Pausa
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                tap_action:
                  action: call-service
                  service: vacuum.pause
                  service_data:
                    entity_id: vacuum.aspirapolvere
                type: 'custom:button-card'
              - color: white
                entity: null
                icon: 'mdi:robot-vacuum'
                name: Ricarica
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                tap_action:
                  action: call-service
                  service: vacuum.return_to_base
                  service_data:
                    entity_id: vacuum.aspirapolvere
                type: 'custom:button-card'
            type: horizontal-stack
          - color: black
            entity: null
            icon: null
            name: >                 
                [[[
                    var stanze = states['input_text.valuestanze'].state;
                    stanze = stanze.substring(0,stanze.length - 1);
                    return "Stanze da pulire: <br>" + stanze;
                ]]]
            styles:
              card:
                - font-size: 13px
                - background-color: black
                - color: white
              name:
                - width: 100%
                - align: 'left'
                - justify-self: start
                - padding-left: 10px
                - word-wrap: anywhere
            type: 'custom:button-card'
          - cards:
              - color: yellow
                entity: input_boolean.deebot_cucina
                icon: 'mdi:toaster-oven'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_sala
                icon: 'mdi:sofa'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_camera
                icon: 'mdi:bed-king'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_bagno_grande
                icon: 'mdi:shower'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
            type: horizontal-stack
          - cards:
              - color: yellow
                entity: input_boolean.deebot_bagno_piccolo
                icon: 'mdi:shower-head'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_corridoio
                icon: 'mdi:road-variant'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_aurora
                icon: 'mdi:bed-empty'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: yellow
                entity: input_boolean.deebot_giovanni
                icon: 'mdi:bed-empty'
                state:
                  - color: 'rgb(100, 100, 100)'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
              - color: 'rgb(0, 255, 0)'
                entity: input_boolean.deebot_times
                icon: 'mdi:numeric-2'
                state:
                  - color: 'rgb(255, 0, 0)'
                    icon: 'mdi:numeric-1'
                    value: 'off'
                styles:
                  card:
                    - font-size: 12px
                    - background-color: black
                    - color: white
                type: 'custom:button-card'
            type: horizontal-stack
          - color: auto
            entity: null
            icon: null
            name: Potenza di aspirazione e quantitĂ  d'acqua
            styles:
              card:
                - font-size: 16px
                - background-color: black
                - color: white
              name:
                - justify-self: start
                - padding-left: 16px
            type: 'custom:button-card'
          - cards:
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_fan_speed
                variables:
                  - states['sensor.deebot_fan_speed'].state
                card:
                        color: "${vars[0] === 'quiet' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:fan'
                        name: Basso
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.set_fan_speed
                          service_data:
                            entity_id: vacuum.aspirapolvere
                            fan_speed: quiet
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_fan_speed
                variables:
                  - states['sensor.deebot_fan_speed'].state
                card:
                        color: "${vars[0] === 'normal' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:fan'
                        name: Medio
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.set_fan_speed
                          service_data:
                            entity_id: vacuum.aspirapolvere
                            fan_speed: normal
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_fan_speed
                variables:
                  - states['sensor.deebot_fan_speed'].state
                card:
                        color: "${vars[0] === 'max' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:fan'
                        name: 'Alto'
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.set_fan_speed
                          service_data:
                            entity_id: vacuum.aspirapolvere
                            fan_speed: max
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_fan_speed
                variables:
                  - states['sensor.deebot_fan_speed'].state
                card:
                        color: "${vars[0] === 'max+' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:fan'
                        name: Altissimo
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.set_fan_speed
                          service_data:
                            entity_id: vacuum.aspirapolvere
                            fan_speed: max+
                        type: 'custom:button-card'
            type: horizontal-stack
          - cards:
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_water_level
                variables:
                  - states['sensor.deebot_water_level'].state
                card:
                        color: "${vars[0] === 'low' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:flask-empty-outline'
                        name: Bassa
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.send_command
                          service_data:
                            command: set_water
                            entity_id: vacuum.aspirapolvere
                            params:
                              amount: low
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_water_level
                variables:
                  - states['sensor.deebot_water_level'].state
                card:
                        color: "${vars[0] === 'medium' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:flask-outline'
                        name: Media
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.send_command
                          service_data:
                            command: set_water
                            entity_id: vacuum.aspirapolvere
                            params:
                              amount: medium
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_water_level
                variables:
                  - states['sensor.deebot_water_level'].state
                card:
                        color: "${vars[0] === 'high' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:flask-empty'
                        name: Alta
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.send_command
                          service_data:
                            command: set_water
                            entity_id: vacuum.aspirapolvere
                            params:
                              amount: high
                        type: 'custom:button-card'
              - type: 'custom:config-template-card'    
                entities:
                  - sensor.deebot_water_level
                variables:
                  - states['sensor.deebot_water_level'].state
                card:
                        color: "${vars[0] === 'ultrahigh' ? 'yellow' : 'white'}"
                        entity: null
                        icon: 'mdi:flask-empty-plus'
                        name: Altissima
                        styles:
                          card:
                            - font-size: 12px
                            - background-color: black
                            - color: white
                        tap_action:
                          action: call-service
                          service: vacuum.send_command
                          service_data:
                            command: set_water
                            entity_id: vacuum.aspirapolvere
                            params:
                              amount: ultrahigh
                        type: 'custom:button-card'
            type: horizontal-stack
        type: vertical-stack
      - card:
          entity: sensor.deebot_last_clean_image
          image: '${states[''sensor.deebot_last_clean_image''].state}'
          type: 'custom:hui-image-element'
        entities:
          - sensor.deebot_last_clean_image
        style:
          height: 5%
          left: 35%
          top: 45%
          transform: 'translate(0%,2%)'
          width: 5%
        type: 'custom:config-template-card'
    path: aspirapolvere
    title: Aspirapolvere

Script:

vacuum_clean_zone:
  alias: Pulisci zona
  sequence:
  - service: vacuum.send_command
    data_template:
      command: spot_area 
      entity_id: vacuum.aspirapolvere 
      params:
        cleanings: >
              {%- if is_state('input_boolean.deebot_times', 'on') -%}{{2|int}}{%- else
              -%}{{1|int}}{% endif %}
        rooms: >
              {{-states('input_text.idstanze')[:-1]}}
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_cucina
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_sala 
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_camera
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_bagno_grande
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_bagno_piccolo
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_corridoio
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_aurora
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_giovanni
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_times       

I was also able to integrate Google Assistant Voice Command “Hey google, clean my kitchen and my living room twice
” --> IFTTT --> WebHooks --> HA --> Deebot

Script:

clean_a_room:
  alias: Pulisci una stanza
  sequence:
   - service: input_text.set_value
     data_template:
        entity_id: input_text.valuestanze
        value: "{{room}},"
   - service: vacuum.send_command
     data_template:
      command: spot_area 
      entity_id: vacuum.aspirapolvere 
      params:
        cleanings: >
                {% set y = room %}
                {% set y = y | lower %}
                {% if "2 volte" in y or "due volte" in y %}
                {% set y = "2" %}
                {% else %}
                {% set y = "1" %}
                {% endif %}
                {{y}}        
        rooms: >
                {% set x = room %}
                {% set x = x | lower %}
                {% if "casa" in x %}
                {% set x = "1,0,2,7,8,6,5,3" %}
                {% else %}
                {% set x = x | replace(",","") %}
                {% set x = x | replace("la c","c") %}
                {% set x = x | replace("la s","s") %}
                {% set x = x | replace("il ","") %}
                {% set x = x | replace("camera di ","") %}
                {% set x = x | replace("camera ","") %}
                {% set x = x | replace("cucina","1") %}
                {% set x = x | replace("sala","0") %}
                {% set x = x | replace("da letto","3") %}
                {% set x = x | replace("bagno grande","5") %}
                {% set x = x | replace("bagno piccolo","8") %}
                {% set x = x | replace("corridoio","2") %}
                {% set x = x | replace("aurora","7") %}
                {% set x = x | replace("giovanni","6") %}
                {% set x = x | replace(" e ",",") %}
                {% set x = x | regex_replace("[^0-9,^.]","") %}
                {% endif %}
                {{x}}


Automations:

- alias: "IFTTT Pulisci Stanza"
  trigger:
  - event_data:
      action: call_service
    event_type: ifttt_webhook_received
    platform: event
  condition:
      condition: template
      value_template: "{{ trigger.event.data.servizio == 'Pulisci' }}"
  action:
    - service: script.clean_a_room
      data_template:
          room: >
             {{trigger.event.data.stanza}}

2 Likes

Modified xiaomi-vacuum-card.js

((LitElement) => {
    const html = LitElement.prototype.html;
    const css = LitElement.prototype.css;

    class XiaomiVacuumCard extends LitElement {

        static get properties() {
            return {
                _hass: {},
                _config: {},
                stateObj: {},
                state: {},
                style: {}
            }
        }

        static get styles() {
            return css`
        .background {
          background-repeat: no-repeat;
          background-position: center center;
          background-size: cover;
        }
        .title {
          font-size: 20px;
          padding: 16px 16px 0;
          text-align: center;
          white-space: nowrap;
          text-overflow: ellipsis;
          overflow: hidden;
        }
        .content {
          cursor: pointer;
        }
        .flex {
          display: flex;
          align-items: center;
          justify-content: space-evenly;
        }
        .button {
          cursor: pointer;
          padding: 16px;
        }
        .grid {
          display: grid;
          grid-template-columns: repeat(2, auto);
        }
        .grid-content {
          display: grid;
          align-content: space-between;
          grid-row-gap: 6px;
        }
        .grid-left {
          text-align: left;
          font-size: 110%;
          padding-left: 10px;
          border-left: 2px solid var(--primary-color);
        }
        .grid-right {
          text-align: right;
          padding-right: 10px;
          border-right: 2px solid var(--primary-color);
        }`;
        }

        render() {
            return html`
            <ha-card .hass="${this._hass}" .config="${this._config}" class="background" style="${this.style.background}">
              ${this.state.name ?
                html`<div class="title" style="${this.style.text}" @click="${() => this.fireEvent('hass-more-info')}">${this.state.name}</div>`
                : null}
              ${this.state.showLabels ? html`
              <div class="content grid" style="${this.style.content + this.style.text}" @click="${() => this.fireEvent('hass-more-info')}">
                <div class="grid-content grid-left">
                  <div>${this.getValue('vacuum_status')}</div>
                  <div>${this.getValue('battery', ' %')}</div>
                  <div>${this.getValue('mode')}</div>
                </div>
                ${this.state.showDetails ? html`
                <div class="grid-content grid-right" >
                  <div>${this.getValue('main_brush', ' %')}</div>
                  <div>${this.getValue('side_brush', ' %')}</div>
                  <div>${this.getValue('filter', ' %')}</div>
                  <div>${this.getValue('water_level')}</div>
                </div>` : null}
              </div>` : null}
              ${this.state.showButtons ? html`
              <div class="flex" style="${this.style.text}">
                ${Object.keys(this.state.buttons).map(this.renderButton.bind(this))}
              </div>` : null}
            </ha-card>`;
        }

        renderButton(key) {
            return this.state.buttons[key]
                ? html`<div class="button" @tap="${() => this.callService(key)}"><ha-icon icon="${this.state.icons[key]}"></ha-icon></div>`
                : null;
        }

        getValue(field, unit = '') {
            const value = (this.stateObj && this.state.attributes[field] in this.stateObj.attributes)
                ? this.stateObj.attributes[this.state.attributes[field]] + unit
                : (this._hass ? this._hass.localize('state.default.unavailable') : 'Unavailable');
            return `${this.state.labels[field]}: ${value}`;
        };

        computeValue(field) {
            if (this.state.attributes[field] === undefined || this.state.attributes[field] === false) {
                return null;
            } else if (this.stateObj && this.state.attributes[field] in this.stateObj.attributes) {
                const computed = this.state.computeValue(this.stateObj.attributes[this.state.attributes[field]]);
                const unit = typeof computed === 'number' ? ` ${this.state.labels.hours}` : '';
                return `${this.state.labels[field]}: ${computed}${unit}`;
            } else {
                return `${this.state.labels[field]}: - `;
            }
        };

        callService(service) {
            this._hass.callService('vacuum', this.state.service[service], {entity_id: this.stateObj.entity_id});
        }

        fireEvent(type, options = {}) {
            const event = new Event(type, {
                bubbles: options.bubbles || true,
                cancelable: options.cancelable || true,
                composed: options.composed || true,
            });
            event.detail = {entityId: this.stateObj.entity_id};
            this.dispatchEvent(event);
        }

        getCardSize() {
            if (this.state.name && this.state.showButtons) return 5;
            if (this.state.name || this.state.showButtons) return 4;
            return 3;
        }

        setConfig(config) {
            const labels = {
                vacuum_status: 'Stato',
                battery: 'Batteria',
                mode: 'ModalitĂ ',
                main_brush: 'Spazzola Principale',
                side_brush: 'Spazzola Laterale',
                filter: 'Filtro',
                water_level: 'Livello Acqua',
                hours: 'h',
            };

            const attributes = {
                vacuum_status: 'vacuum_status',
                battery: 'battery_level',
                mode: 'fan_speed',
                main_brush: 'component_brush',
                side_brush: 'component_sideBrush',
                filter: 'component_heap',
                water_level: 'water_level',
            };

            const services = {
                start: 'start',
                pause: 'pause',
                stop: 'stop',
                locate: 'locate',
                return: 'return_to_base',
                spot: 'clean_spot',
            };

            const buttons = {
                start: true,
                pause: true,
                stop: true,
                spot: false,
                locate: true,
                return: true,
            };

            const icons = {
                start: 'mdi:play',
                pause: 'mdi:pause',
                stop: 'mdi:stop',
                locate: 'mdi:map-marker',
                return: 'mdi:home-map-marker',
                spot: 'mdi:broom',
            };

            const vendors = {
                xiaomi: {
                    details: true,
                },
                valetudo: {
                    details: true,
                    attributes: {
                        vacuum_status: 'vacuum_status',
                        main_brush: 'mainBrush',
                        side_brush: 'sideBrush',
                        filter: 'filter',
                        sensor: 'water_level',
                    },
                },
                roomba: {
                    details: true,
                    attributes: {
                        main_brush: 'bin_present',
                        side_brush: 'bin_full',
                        filter: false,
                        sensor: false,
                    },
                    labels: {
                        main_brush: 'Bin Present',
                        side_brush: 'Bin Full',
                    },
                    computeValue: v => (v === true ? 'Yes' : (v === false ? 'No' : '-')),
                },
                robovac: {
                    details: false,
                    buttons: {
                        stop: false,
                        spot: true,
                    },
                },
                ecovacs: {
                    image: '/local/img/vacuum_ecovacs.png',
                    details: false,
                    buttons: {
                        stop: false,
                        spot: true,
                    },
                    service: {
                        start: 'turn_on',
                        pause: 'stop',
                        stop: 'turn_off',
                    },
                },
                deebot: {
                    image: '/local/img/vacuum_ecovacs.png',
                    details: true,
                    service: {
                        start: 'turn_on',
                        pause: 'stop',
                        stop: 'turn_off',
                    },
                    attributes: {
                        main_brush: 'component_brush',
                        side_brush: 'component_sideBrush',
                        filter: 'component_heap',
                        water_level: 'water_level',
                    },
                }
            };

            if (!config.entity) throw new Error('Please define an entity.');
            if (config.entity.split('.')[0] !== 'vacuum') throw new Error('Please define a vacuum entity.');
            if (config.vendor && !config.vendor in vendors) throw new Error('Please define a valid vendor.');

            const vendor = vendors[config.vendor] || vendors.xiaomi;

            this.state = {
                showDetails: vendor.details,
                showButtons: config.buttons !== false,
                showLabels: config.labels !== false,
                showName: config.name !== false,

                service: Object.assign({}, services, vendor.service),
                buttons: Object.assign({}, buttons, vendor.buttons, config.buttons),
                attributes: Object.assign({}, attributes, vendor.attributes, config.attributes),
                labels: Object.assign({}, labels, vendor.labels, config.labels),
                icons: Object.assign({}, icons, config.icons),
                computeValue: vendor.computeValue || (val => val),
            };

            this.style = {
                text: `color: ${config.image !== false ? 'white; text-shadow: 0 0 10px black;' : 'var(--primary-text-color);'}`,
                content: `padding: ${config.showButtons ? '16px 16px 4px' : '16px'};`,
                background: config.image !== false ? `background-image: url('${config.image || vendor.image || '/local/img/vacuum.png'}')` : ''
            };

            this._config = config;
        }

        set hass(hass) {
            this._hass = hass;

            if (hass && this._config) {
                this.stateObj = this._config.entity in hass.states ? hass.states[this._config.entity] : null;

                if (this.stateObj && this.state.showName) {
                    this.state.name = this._config.name || this.stateObj.attributes.friendly_name;
                }
            }
        }
    }

    customElements.define('xiaomi-vacuum-card', XiaomiVacuumCard);
})(window.LitElement || Object.getPrototypeOf(customElements.get("hui-view")));
1 Like

Thanks Stefano for sharing your excellent work.

Is anyone else using the Deebot 900 with HA?

Close, I have the 901.

I ended up having to just use the deebot integration with alexa, depedning on what integration I would use one or the other of my two deebots would work and the other not.

Hello Community,

I have a Ecovacs OZMO 900 and running HA as a Docker Container, has anyone sucessfully get it to work in a docker container?

Hey guys,

thanks for all the great work in here. Just trying to get @StefanGiu`s setup to work for me, but I am already getting stuck with setting up the custom xiaomi vacuum card. I have a 950 and the integration works, so I can see everything and get the data:

But, using the custom card, it does not uses the data:

It does not matter if I use the standard .js file from HACS itself or the one @StefanGiu provided
Here is my code:

  - icon: 'mdi:robot-vacuum'
    badges: []
    cards:
     - type: 'custom:xiaomi-vacuum-card'
       entity: vacuum.juan_son
       image: /local/deebot.jpg
       name: Juan Son
       vendor: deebot
       buttons:
         start: true
         stop: true
         locate: false
       icons:
         start: mdi:some-icon
         stop: mdi:other-icon
       labels:
         status: Etat
         battery: Batterie
         mode: Puissance
         main_brush: Brosse Principale
         side_brush: Brosse Latérale
         filter: Filtre
         sensor: Capteurs

Anyone got an idea what I am doing wrong?

Having the same issue as @marothe

i think we missed something, i read everything again, but found no solution.
The basic functions are working but no status displayed at the lovelace card.

Great to see that I am not alone :smiley: been tinkering with that one for a while. Did you use the Modified xiaomi-vacuum-card.js Stefano provided? Or the one the HACS plugin comes with? Have the feeling there might be the issue?!

I tried both, but i had the feeling that after changing the .js file nothing happend, i am not sure about the reason.

Had the same feeling! Nothing changed for me, tried all the other automations and scripts as well from Setfano but I guessed that if the basic implemenation does not work, there is no need in trying the rest or finding an error there. Maybe some of the other guys can chime in? Would be greatly appreciated! @StefanoGiu

Hey guys,

I’m completely new to hass but I’m trying to connect my Deebot 900 using steps above but for some reason the integration is not working.

configuration.yaml

vacuum:
  - platform: deebot
    username: myuseranme
    password: mypassword
    country: uk
    continent: eu
    deviceid: deviceid as per instructions

After saving and restating entities shows up but when I open it there is nothing

image

Funny thing is that I can actually see the link to my cleaning map in Developer Tools->States and when I open it is really the last one. so there is a connection of some kind with the robot.

Is there something i’m missing? Is there a way to get all data from deebot 900?

It seems that for at least some devices the data only updates after the vac is switched on. Then the info is lost after a reboot.