119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
|
"""Support for Deebot Vaccums."""
|
||
|
import asyncio
|
||
|
import logging
|
||
|
import async_timeout
|
||
|
import time
|
||
|
import random
|
||
|
import string
|
||
|
import base64
|
||
|
import voluptuous as vol
|
||
|
import homeassistant.helpers.config_validation as cv
|
||
|
from datetime import timedelta
|
||
|
from deebotozmo import *
|
||
|
from homeassistant.util import Throttle
|
||
|
from homeassistant.helpers import discovery
|
||
|
from homeassistant.helpers.entity import Entity
|
||
|
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, EVENT_HOMEASSISTANT_STOP
|
||
|
|
||
|
REQUIREMENTS = ['deebotozmo==1.7.8']
|
||
|
|
||
|
CONF_COUNTRY = "country"
|
||
|
CONF_CONTINENT = "continent"
|
||
|
CONF_DEVICEID = "deviceid"
|
||
|
CONF_LIVEMAPPATH = "livemappath"
|
||
|
CONF_LIVEMAP = "live_map"
|
||
|
CONF_SHOWCOLORROOMS = "show_color_rooms"
|
||
|
DEEBOT_DEVICES = "deebot_devices"
|
||
|
|
||
|
# Generate a random device ID on each bootup
|
||
|
DEEBOT_API_DEVICEID = "".join(
|
||
|
random.choice(string.ascii_uppercase + string.digits) for _ in range(8)
|
||
|
)
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
HUB = None
|
||
|
DOMAIN = 'deebot'
|
||
|
|
||
|
CONFIG_SCHEMA = vol.Schema({
|
||
|
DOMAIN: vol.Schema({
|
||
|
vol.Required(CONF_USERNAME): cv.string,
|
||
|
vol.Required(CONF_PASSWORD): cv.string,
|
||
|
vol.Required(CONF_COUNTRY): vol.All(vol.Lower, cv.string),
|
||
|
vol.Required(CONF_CONTINENT): vol.All(vol.Lower, cv.string),
|
||
|
vol.Required(CONF_DEVICEID): vol.All(cv.ensure_list, [cv.string]),
|
||
|
vol.Optional(CONF_LIVEMAP, default=True): cv.boolean,
|
||
|
vol.Optional(CONF_SHOWCOLORROOMS, default=False): cv.boolean,
|
||
|
vol.Optional(CONF_LIVEMAPPATH, default='www/'): cv.string
|
||
|
}),
|
||
|
}, extra=vol.ALLOW_EXTRA)
|
||
|
|
||
|
def setup(hass, config):
|
||
|
"""Set up the Deebot."""
|
||
|
global HUB
|
||
|
|
||
|
HUB = DeebotHub(config[DOMAIN])
|
||
|
|
||
|
for component in ('sensor', 'binary_sensor', 'vacuum'):
|
||
|
discovery.load_platform(hass, component, DOMAIN, {}, config)
|
||
|
|
||
|
return True
|
||
|
|
||
|
class DeebotHub(Entity):
|
||
|
"""Deebot Hub"""
|
||
|
|
||
|
def __init__(self, domain_config):
|
||
|
"""Initialize the Deebot Vacuum."""
|
||
|
|
||
|
self.config = domain_config
|
||
|
self._lock = threading.Lock()
|
||
|
|
||
|
self.ecovacs_api = EcoVacsAPI(
|
||
|
DEEBOT_API_DEVICEID,
|
||
|
domain_config.get(CONF_USERNAME),
|
||
|
EcoVacsAPI.md5(domain_config.get(CONF_PASSWORD)),
|
||
|
domain_config.get(CONF_COUNTRY),
|
||
|
domain_config.get(CONF_CONTINENT)
|
||
|
)
|
||
|
|
||
|
devices = self.ecovacs_api.devices()
|
||
|
liveMapEnabled = domain_config.get(CONF_LIVEMAP)
|
||
|
liveMapRooms = domain_config.get(CONF_SHOWCOLORROOMS)
|
||
|
country = domain_config.get(CONF_COUNTRY).lower()
|
||
|
continent = domain_config.get(CONF_CONTINENT).lower()
|
||
|
self.vacbots = []
|
||
|
|
||
|
# CREATE VACBOT FOR EACH DEVICE
|
||
|
for device in devices:
|
||
|
if device['name'] in domain_config.get(CONF_DEVICEID):
|
||
|
vacbot = VacBot(
|
||
|
self.ecovacs_api.uid,
|
||
|
self.ecovacs_api.resource,
|
||
|
self.ecovacs_api.user_access_token,
|
||
|
device,
|
||
|
country,
|
||
|
continent,
|
||
|
liveMapEnabled,
|
||
|
liveMapRooms
|
||
|
)
|
||
|
|
||
|
_LOGGER.debug("New vacbot found: " + device['name'])
|
||
|
|
||
|
self.vacbots.append(vacbot)
|
||
|
|
||
|
_LOGGER.debug("Hub initialized")
|
||
|
|
||
|
@Throttle(timedelta(seconds=10))
|
||
|
def update(self):
|
||
|
""" Update all statuses. """
|
||
|
try:
|
||
|
for vacbot in self.vacbots:
|
||
|
vacbot.request_all_statuses()
|
||
|
except Exception as ex:
|
||
|
_LOGGER.error('Update failed: %s', ex)
|
||
|
raise
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
""" Return the name of the hub."""
|
||
|
return "Deebot Hub"
|