FIXED: Ecovacs Deebot 2019 & OZMO Series - Working Library

A hello to everyone, finally I too after several problems I managed to install the component, Thanks to the excellent work of And3rsL. I just have some problems viewing the map, sometimes but I don’t always see it in the lower left corner but it is very nice reading more on I disabled the color and for that day it worked but now it is very small again. other problem in the logs I get this. Error calling API https://portal-eu.ecouser.net/api/iot/devmanager.do?mid=vi829v&did=6e908a39-6449-44ba-8802-151a9f21c6b2&td=q&u=ehumwrzd2a4afeb2&ct=1.67.3 1 & t = 1 StatusCode 502 Home Assistant version 0.117.6 installed. Can someone help me?

Can someone tell me, why in my deebot integration the attributes in lower parts i.e. for the brushes are missing?

Hello,

My ‘deebot_times’ didn’t work well before, but now even if I choose to clean twice, it only washes me once.
Do you have any ideas please?

Help!

I have two warnings and the deebot 500 will not connecting.


Logger: sucks
Source: /usr/local/lib/python3.8/site-packages/sucks/__init__.py:371 
First occurred: 18:08:35 (3 occurrences) 
Last logged: 18:09:36

Ping did not reach VacBot. Will retry.


Logger: sleekxmppfs.basexmpp
Source: /usr/local/lib/python3.8/site-packages/sleekxmppfs/basexmpp.py:610 
First occurred: 18:14:04 (1 occurrences) 
Last logged: 18:14:04

fulljid property deprecated. Use boundjid.resource

He @Remirz,

I had the same problem (ecovacs 650 in NL), this worked for me:

  • in your config directory create a directory called “custom_components” if you don’t have one yet.

  • download: https://github.com/Ligio/hacc-ozmo

  • place the “deebot” directory in your “custom_components” directory

  • in your config.yaml add:

deebot:
  username: YOUR_ECOVACS_USERNAME
  password: YOUR_ECOVACS_PASSWORD
  country: YOUR_TWO_LETTER_COUNTRY_CODE
  continent: YOUR_TWO_LETTER_CONTINENT_CODE
  • you can find more config options in the github repo.

Now reboot home assistant, wait about 5 minutes and voila!

1 Like

Thanks :pray:

Oftewel dankjewel het werkt :+1:

1 Like

How do you display the last_clean_image? I see there is a sensor for it, but I can’t figure out how to show it in the UI

I would also be interested

You need to create a template sensor

sensor:
  - platform: template
    sensors:
      deebot_last_clean_image:
        friendly_name: "Vacuum Last Clean"
        unit_of_measurement: ''
        value_template: "{{ states('sensor.deebot_last_clean_image') }}"

Change the sensor field with your entity id.

Then make a lovelace card with following info:

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'
1 Like

I still haven’t managed to display the info in the xiaomi-vacuum-card (using @Andrea_Liosi 's integration on a T8 ). Only shows battery and fan, nothing on status, brushes, etc

Tried with this

Also tried with deleting xiaomi-vacuum-card.js.gz

This worked fine, thanks. Stupid question, how do I add a card title? :slight_smile:

Hi,
is it possible to change the resolution of the map?

FYI, I got this working in a custom theme, Dwain’s dashboard. I created a page.yaml config file in a room under his theme as an addon. Big issue I have is that the custom icons/scripts for starting to clean a specific room (as well as just starting the vac) are greyed out, hard to see - it’s either the card or his theme. Am working to solve it. Here’s my code in case it helps anyone for the rooms/hallway/page.yaml addons.

- type: custom:vacuum-card
  entity: vacuum.bryan
  actions:
    - icon: 'mdi:sofa'
      name: Clean Living
      service: script.vacuum_clean_living
    - icon: 'mdi:bed'
      name: Clean Bedroom
      service: script.vacuum_clean_bedroom
    - icon: 'mdi:shower'
      name: Clean Bathroom
      service: script.vacuum_clean_bathroom
    - icon: 'mdi:piano'
      name: Clean Music Room
      service: script.vacuum_den
  buttons:
    locate: true
    start: true
    stop: true
  icons:
    start: 'mdi:some-icon'
    stop: 'mdi:other-icon'
  labels:
    battery: Battery
    filter: Filter
    main_brush: Main Brush
    mode: Mode
    side_brush: Side Brush
    water_level: Water
  name: Bryan

Thank you.

Hi
I got it working on T8 AIVI but i only get “docking” and “cleaning” states from it, does anyone know if there is any way for home assistant to know if its in the progress of returing to dock or moveing to cleaning area?

Amazing work by all here. I was frustrated that Ecovacs/Google did not support verbal commands for individual rooms. But, Home Assistant and HA Community to the rescue. I wanted to share my complete (for now) setup. I am using @Andrea_Liosi HACS repo on a Ozmo T5. I also used @StefanoGiu guidance for a dashboard, scripts, and IFTTT automation based on this post. I made some changes (besides converting to English) to address a lack of understanding on my part as to how to implement idstanze and valuestanze.

Features working:

  • Main buttons (Find, Auto, Rooms, Pause, Return to Dock)
  • Toggle Rooms
  • Fan and Water settings
  • Number of Times (1 or 2)
  • Google via IFTTT
  • Last Map

GUI
This uses the modified custom:xiaomi-vacuum-card provided by @StefanoGiu here
This uses custom: button-card and custom:config-template-card via HACS frontend.
Note: we named our deebot Roomba :stuck_out_tongue_winking_eye:

# Remote Control
cards:
  - buttons:
      locate: false
      pause: false
      return: false
      spot: false
      start: false
      stop: false
    entity: vacuum.roomba
    name: Roomba
    type: 'custom:xiaomi-vacuum-card'
    vendor: deebot
  - cards:
      - color: white
        entity: null
        icon: 'mdi:map-marker-radius'
        name: Find
        styles:
          card:
            - font-size: 12px
            - background-color: black
            - color: white
        tap_action:
          action: call-service
          service: vacuum.locate
          service_data:
            entity_id: vacuum.roomba
        type: 'custom:button-card'
      - color: white
        entity: null
        icon: 'mdi:play'
        name: Auto
        styles:
          card:
            - font-size: 12px
            - background-color: black
            - color: white
        tap_action:
          action: call-service
          service: vacuum.start
          service_data:
            entity_id: vacuum.roomba
        type: 'custom:button-card'
      - type: 'custom:config-template-card'
        entities:
          - input_boolean.deebot_dining_room
          - input_boolean.deebot_kitchen
          - input_boolean.deebot_living_room
          - input_boolean.deebot_bedroom
          - input_boolean.deebot_bathroom
          - input_boolean.deebot_closet
          - input_boolean.deebot_back_hall
          - input_boolean.deebot_entry
        card:
          type: 'custom:button-card'
          color: white
          entity: null
          icon: 'mdi:view-dashboard-outline'
          name: Rooms
          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: Pause
        styles:
          card:
            - font-size: 12px
            - background-color: black
            - color: white
        tap_action:
          action: call-service
          service: vacuum.pause
          service_data:
            entity_id: vacuum.roomba
        type: 'custom:button-card'
      - color: white
        entity: null
        icon: 'mdi:robot-vacuum'
        name: Dock
        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.roomba
        type: 'custom:button-card'
    type: horizontal-stack
  - color: black
    entity: null
    icon: null
    name: |
      [[[ 
          var strText = "Rooms to clean: "
          if(states['input_boolean.deebot_kitchen'].state=="on") 
            strText = strText + "Kitchen, "
          if(states['input_boolean.deebot_living_room'].state=="on") 
            strText = strText + "Family, "
          if(states['input_boolean.deebot_bedroom'].state=="on") 
            strText = strText + "Bedroom, "
          if(states['input_boolean.deebot_bathroom'].state=="on") 
            strText = strText + "Bathroom, "
          if(states['input_boolean.deebot_closet'].state=="on") 
            strText = strText + "Closet, "
          if(states['input_boolean.deebot_back_hall'].state=="on") 
            strText = strText + "Hallway, "
          if(states['input_boolean.deebot_entry'].state=="on") 
            strText = strText + "Foyer, "
          if(states['input_boolean.deebot_dining_room'].state=="on") 
            strText = strText + "Dining Room, "
          return strText.substring(0,strText.length-2)
      ]]]
    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_kitchen
        icon: 'mdi:toaster-oven'
        name: Kitchen
        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_living_room
        icon: 'mdi:sofa'
        name: Family Room
        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_bedroom
        icon: 'mdi:bed-king'
        name: Bedroom
        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_bathroom
        icon: 'mdi:shower'
        name: Bathroom
        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_closet
        icon: 'mdi:hanger'
        name: Closet
        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_back_hall
        icon: 'mdi:toilet'
        name: Guest Hallway
        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_entry
        icon: 'mdi:door-open'
        name: Foyer
        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_dining_room
        icon: 'mdi:silverware-variant'
        name: Dining Room
        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:
      - 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: Quiet
          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.roomba
              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: Normal
          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.roomba
              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: Max
          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.roomba
              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: Max+
          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.roomba
              fan_speed: max+
          type: 'custom:button-card'
      - color: 'rgb(0, 255, 0)'
        entity: input_boolean.deebot_times
        icon: 'mdi:numeric-2'
        name: Clean Cycles
        state:
          - color: 'rgb(255, 0, 0)'
            value: 'off'
            icon: 'mdi:numeric-1'
        styles:
          card:
            - font-size: 12px
            - background-color: black
            - color: white
        type: 'custom:button-card'
    type: horizontal-stack
  - cards:
      - type: 'custom:config-template-card'
        entities:
          - sensor.roomba_water_level
        variables:
          - 'states[''sensor.roomba_water_level''].state'
        card:
          color: '${vars[0] === ''low'' ? ''yellow'' : ''white''}'
          entity: null
          icon: 'mdi:flask-empty-outline'
          name: Low
          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.roomba
              params:
                amount: low
          type: 'custom:button-card'
      - type: 'custom:config-template-card'
        entities:
          - sensor.roomba_water_level
        variables:
          - 'states[''sensor.roomba_water_level''].state'
        card:
          color: '${vars[0] === ''medium'' ? ''yellow'' : ''white''}'
          entity: null
          icon: 'mdi:flask-outline'
          name: Medium
          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.roomba
              params:
                amount: medium
          type: 'custom:button-card'
      - type: 'custom:config-template-card'
        entities:
          - sensor.roomba_water_level
        variables:
          - 'states[''sensor.roomba_water_level''].state'
        card:
          color: '${vars[0] === ''high'' ? ''yellow'' : ''white''}'
          entity: null
          icon: 'mdi:flask-empty'
          name: High
          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.roomba
              params:
                amount: high
          type: 'custom:button-card'
      - type: 'custom:config-template-card'
        entities:
          - sensor.roomba_water_level
        variables:
          - 'states[''sensor.roomba_water_level''].state'
        card:
          color: '${vars[0] === ''ultrahigh'' ? ''yellow'' : ''white''}'
          entity: null
          icon: 'mdi:flask-empty-plus'
          name: Ultrahigh
          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.roomba
              params:
                amount: ultrahigh
          type: 'custom:button-card'
    type: horizontal-stack
type: vertical-stack

# Show Last Map
card:
  entity: sensor.roomba_last_clean_image
  image: '${states[''sensor.roomba_last_clean_image''].state}'
  type: 'custom:hui-image-element'
entities:
  - sensor.roomba_last_clean_image
style:
  height: 5%
  left: 35%
  top: 45%
  transform: 'translate(0%,2%)'
  width: 5%
type: 'custom:config-template-card'

Modifications to configuration.yaml

deebot:
  username: **************
  password: ***************
  country: us
  continent: na
  deviceid:
    - E02*****************

  # Not sure this is working
  live_map: True                    # Enable Live Map.. may cause issues on low power hardware | Default: True
  show_color_rooms: False           # Enable draw room colors as in the app | Default: False
  livemappath: 'www/' 
  
camera:
  - platform: generic
    name: Deebot_live_map
    still_image_url: "https://MYIPADDRESS/local/Roomba_liveMap.png" #Example configuration for livemappath: 'www/live_map.png'
    verify_ssl: false

input_boolean:
  deebot_dining_room:
    name: Dining Room
    initial: off
  deebot_kitchen:
    initial: off
  deebot_living_room:
    initial: off
  deebot_bedroom:
    initial: off
  deebot_bathroom:
    initial: off
  deebot_closet:
    initial: off
  deebot_back_hall:
    initial: off
  deebot_entry:
    initial: off
  deebot_times:
    initial: off

# Edited this post on Feb 17 because I forgot this
sensor:
  - platform: template
    sensors:
      deebot_fan_speed:
        friendly_name: "fan speed"
        value_template: "{{ state_attr('vacuum.roomba', 'fan_speed') }}"
      deebot_water_level:
        friendly_name: "water level"
        value_template: "{{ state_attr('vacuum.roomba', 'water_level') }}"
  - platform: template
    sensors:
      deebot_last_clean_image:
        friendly_name: "Last Clean Image"
        unit_of_measurement: ''
        value_template: "{{ state_attr('vacuum.roomba', 'last_clean_image') }}"

scripts.yaml

vacuum_clean_zone:
  alias: Clean Zone
  sequence:
  - service: vacuum.send_command
    data_template:
      command: spot_area 
      entity_id: vacuum.roomba 
      params:
        cleanings: >
          {%- if is_state('input_boolean.deebot_times', 'on') -%}{{2|int}}{%- else -%}{{1|int}}{% endif %}
        rooms: >
          {%- if is_state('input_boolean.deebot_kitchen', 'on') -%}
            15,
          {%- endif -%}  
          {%- if is_state('input_boolean.deebot_bedroom', 'on') -%}
            13,
          {%- endif -%}
          {%- if is_state('input_boolean.deebot_living_room', 'on') -%}
            11,
          {%- endif -%}
          {%- if is_state('input_boolean.deebot_bathroom', 'on') -%}
            3,
          {%- endif -%}
          {%- if is_state('input_boolean.deebot_back_hall', 'on') -%}
            12,
          {%- endif -%}
          {%- if is_state('input_boolean.deebot_entry', 'on') -%}
            10,
          {%- endif -%}
          {%- if is_state('input_boolean.deebot_closet', 'on') -%}
            5,
          {%- endif -%}            
          {%- if is_state('input_boolean.deebot_dining_room', 'on') -%}
            0,
          {%- endif -%}
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_kitchen
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_bedroom 
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_bathroom
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_living_room
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_dining_room
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_back_hall
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_entry
  - service: input_boolean.turn_off
    data:
       entity_id: input_boolean.deebot_times       

#Used for Google Home/IFTTT Integration
clean_a_room:
  alias: Clean a Room
  sequence:
   - service: vacuum.send_command
     data_template:
      command: spot_area 
      entity_id: vacuum.roomba
      params:
        cleanings: >
                {% set y = room %}
                {% set y = y | lower %}
                {% if "2" in y or "twice" in y %}
                {% set y = "2" %}
                {% else %}
                {% set y = "1" %}
                {% endif %}
                {{y}}        
        rooms: >
                {% set x = room %}
                {% set x = x | lower %}
                {% if "house" in x %}
                {% set x = "1,0,2,7,8,6,5,3" %}
                {% else %}
                {% set x = x | replace(",","") %}
                {% set x = x | replace("master ","") %}
                {% set x = x | replace("2","") %}
                {% set x = x | replace("bedroom","13,") %}
                {% set x = x | replace("family room","11,") %}
                {% set x = x | replace("living room","11,") %}
                {% set x = x | replace("dining room ","0,") %}
                {% set x = x | replace("kitchen","15,") %}
                {% set x = x | replace("guest bathroom","12,") %}
                {% set x = x | replace("guest bath","12,") %}
                {% set x = x | replace("bathroom","3,") %}
                {% set x = x | replace("closet","5,") %}
                {% set x = x | replace("back hall","12,") %}
                {% set x = x | replace("hallway","12,") %}
                {% set x = x | replace("entry","10,") %}
                {% set x = x | replace("foyer","10,") %}
                {% set x = x | replace(" times","") %}
                {% set x = x | replace(" twice","") %}
                {% set x = x | replace(" and ","") %}
                {% set x = x | replace("the ","") %}
                {% set x = x | regex_replace("[^0-9,]","") %}
                {% endif %}
                {{x}}

automations.yaml (for IFTTT, don’t forget https on your URL for webhook)

- id: ifttt
  alias: "IFTTT"
  trigger:
    event_type: ifttt_webhook_received
    platform: event
  condition:
      - condition: template
        value_template: "{{ trigger.event.data.service == 'VACUUM' }}"
  action:
    - service: script.clean_a_room
      data:
          room: >
             {{trigger.event.data.rooms}}

Here is my IFTTT applet:

Again, many thanks to all who have contributed to this wonderful thread and resource. Happy to answer any questions as best I can.

2 Likes

Thanks very much to everyone involved in this so far - it is great to have my 950 working well in Home Assistant. I have scrolled through and couldn’t find a similar issue and hoping someone may know.

I have a two level house, and I am trying to work on selective cleaning for rooms on each floor. The Deebot app handles multiple floors, but I can’t seem to get the room IDs back from the vacuum sensor. Currently, I am pulling back:

room_corridor: 0
room_bedroom: 6
room_study: 1
room_laundry: 5

Which looks like the downstairs area. Moving the deebot between floors doesn’t appear to update the rooms with the currently active map.

I was hoping that the room id’s would be unique and I can just call them based on where I know the vacuum is.

Sorry if I missed a similar question.

Hello, great works but I have problems with map that not shows on my lovelace card.
Can someone help me?

Below is my configuration:

deebot:
  username: [email protected]
  password: xxxxxxx
  country: IT
  continent: EU
  deviceid:
    - ADDDBCDXXXXXXXXXXXXX
  live_map: True
  show_color_rooms: True
  livemappath: 'www/robot_liveMap.png'

camera:
  - platform: generic
    name: "Ultima pulizia"
    still_image_url: "https://xxxxxxx.duckdns.org:1111/local/robot_liveMap.png"
    still_image_url: "https://xxxxxxx.duckdns.org:1111/local/robot.png"

and in Lovelace card::

type: picture-entity
entity: vacuum.robot
aspect_ratio: 50%
camera_image: camera.ultima_pulizia

The result is:
camera
Can help me?

Have you looked in your www folder to see if an image file is being created?

I am no expert, but from my experience, there may be 2 issues:

  1. The livemappath should not include a file name. livemappath: 'www/'
  2. The file name is automatically generated based on the name of your vacuum from the ecovacs app. In my app, I have named my vacuum Roomba. So the file name for my vacuum is Roomba_liveMap.png

Hope that helps.

The error that I see in the log is:

Logger: homeassistant.helpers.entity
Source: custom_components/deebot/vacuum.py:209
First occurred: 23:43:52 (1 occurrences)
Last logged: 23:43:52
Update for vacuum.deebot_ozmo_950_series fails

Traceback (most recent call last):
  File "/srv/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 278, in async_update_ha_state
    await self.async_device_update()
  File "/srv/homeassistant/lib/python3.8/site-packages/homeassistant/helpers/entity.py", line 474, in async_device_update
    raise exc
  File "/home/homeassistant/.homeassistant/custom_components/deebot/vacuum.py", line 209, in async_update
    with open(self._live_map_path, "wb") as fh:
FileNotFoundError: [Errno 2] No such file or directory: 'www/DEEBOT OZMO 950 Series_liveMap.png'

If I check [sensor.deebot_ozmo_950_series_last_clean_image], I see the image and link is ok but then not generate image on www folder

Ah, maybe the issue is your vacuum name, which appears to be DEEBOT OZMO 950 Series in the app.

This line: No such file or directory: 'www/DEEBOT OZMO 950 Series_liveMap.png' shows that the URL is not encoding the SPACES. As a result the url fails to load. (Modern browsers handle spaces if you just type the URL in, but I am guessing HA doesn’t).

You might try just changing the vacuum name (in the app).