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!
Thanks
Oftewel dankjewel het werkt
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'
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?
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
# 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.
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:
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:
- The
livemappath
should not include a file name.livemappath: 'www/'
- 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).