From 2ee455ae5535f6d8a53189852fdf69df972f0923 Mon Sep 17 00:00:00 2001 From: Wandersalamander <31392979+Wandersalamander@users.noreply.github.com> Date: Sun, 19 Jan 2020 13:33:14 +0100 Subject: [PATCH] Added pause, resume, fixed stop Added command line arguments pause, resume and corresponding classes. Fixed stop command, which was not working my robot. Tested with Deebot 900 --- dist/sucks-0.9.3-py3.7.egg | Bin 0 -> 36363 bytes sucks/__init__.py | 24 ++++++++++++++---- sucks/cli.py | 50 +++++++++++++++++++++++++++---------- 3 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 dist/sucks-0.9.3-py3.7.egg diff --git a/dist/sucks-0.9.3-py3.7.egg b/dist/sucks-0.9.3-py3.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..86e2d5bdb6065c7f4f9007dbe76de4da9e508252 GIT binary patch literal 36363 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 literal 0 HcmV?d00001 diff --git a/sucks/__init__.py b/sucks/__init__.py index e129da3..33c2450 100644 --- a/sucks/__init__.py +++ b/sucks/__init__.py @@ -30,6 +30,7 @@ CLEAN_MODE_SPOT_AREA = 'spot_area' CLEAN_MODE_SINGLE_ROOM = 'single_room' CLEAN_MODE_STOP = 'stop' +CLEAN_MODE_PAUSE = 'pause' CLEAN_ACTION_START = 'start' CLEAN_ACTION_PAUSE = 'pause' @@ -61,7 +62,8 @@ CLEAN_MODE_SPOT: 'spot', CLEAN_MODE_SPOT_AREA: 'SpotArea', CLEAN_MODE_SINGLE_ROOM: 'singleroom', - CLEAN_MODE_STOP: 'stop' + CLEAN_MODE_STOP: 'stop', + CLEAN_MODE_PAUSE: 'pause', } CLEAN_ACTION_TO_ECOVACS = { @@ -85,7 +87,8 @@ 'spot_area': CLEAN_MODE_SPOT_AREA, 'singleroom': CLEAN_MODE_SINGLE_ROOM, 'stop': CLEAN_MODE_STOP, - 'going': CHARGE_MODE_RETURNING + 'going': CHARGE_MODE_RETURNING, + 'pause': CLEAN_MODE_PAUSE, } FAN_SPEED_TO_ECOVACS = { @@ -727,8 +730,9 @@ def send_ping(self): return False def send_command(self, action, recipient): - if action.name == "Clean": #For handling Clean when action not specified (i.e. CLI) - action.args['clean']['act'] = CLEAN_ACTION_TO_ECOVACS['start'] #Inject a start action + # these lines cause pause commands to not work, so it is disabled + # if action.name == "Clean": #For handling Clean when action not specified (i.e. CLI) + # action.args['clean']['act'] = CLEAN_ACTION_TO_ECOVACS['start'] #Inject a start action c = self._wrap_command(action, recipient) _LOGGER.debug('Sending command {0}'.format(c)) self._handle_ctl_api(action, @@ -1044,7 +1048,17 @@ def __init__(self): class Stop(Clean): def __init__(self): - super().__init__('stop', 'normal') + super().__init__(mode='stop', action="stop") + +class Pause(Clean): + def __init__(self): + super().__init__(mode="pause",action='pause') + + +class Resume(Clean): + def __init__(self): + super().__init__(mode="auto",action='resume') + class SpotArea(Clean): def __init__(self, action='start', area='', map_position='', cleanings='1'): diff --git a/sucks/cli.py b/sucks/cli.py index 843cc5a..7b4f08b 100644 --- a/sucks/cli.py +++ b/sucks/cli.py @@ -8,8 +8,9 @@ import click from pycountry_convert import country_alpha2_to_continent_code +import sucks from sucks import * - +print(sucks.__file__) _LOGGER = logging.getLogger(__name__) @@ -67,12 +68,15 @@ def __init__(self, wait_on, wait_for): def wait(self, bot): if not hasattr(bot, self.wait_on): - raise ValueError("object " + bot + " does not have method " + self.wait_on) - _LOGGER.debug("waiting on " + self.wait_on + " for value " + self.wait_for) + raise ValueError("object " + bot + + " does not have method " + self.wait_on) + _LOGGER.debug("waiting on " + self.wait_on + + " for value " + self.wait_for) while getattr(bot, self.wait_on) != self.wait_for: time.sleep(0.5) - _LOGGER.debug("wait complete; " + self.wait_on + " is now " + self.wait_for) + _LOGGER.debug("wait complete; " + self.wait_on + + " is now " + self.wait_for) class CliAction: @@ -96,7 +100,8 @@ def config_file_exists(): def read_config(): parser = configparser.ConfigParser() with open(config_file()) as fp: - parser.read_file(itertools.chain(['[global]'], fp), source=config_file()) + parser.read_file(itertools.chain( + ['[global]'], fp), source=config_file()) return parser['global'] @@ -124,7 +129,8 @@ def should_run(frequency): return True n = random.random() result = n <= frequency - _LOGGER.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format(n, frequency, result)) + _LOGGER.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format( + n, frequency, result)) return result @@ -150,7 +156,8 @@ def login(email, password, country_code, continent_code, verify_ssl): password_hash = EcoVacsAPI.md5(password) device_id = EcoVacsAPI.md5(str(time.time())) try: - EcoVacsAPI(device_id, email, password_hash, country_code, continent_code, verify_ssl) + EcoVacsAPI(device_id, email, password_hash, + country_code, continent_code, verify_ssl) except ValueError as e: click.echo(e.args[0]) exit(1) @@ -169,7 +176,7 @@ def login(email, password, country_code, continent_code, verify_ssl): @click.option('--frequency', '-f', type=FREQUENCY, help='frequency with which to run; e.g. 0.5 or 3/7') @click.argument('minutes', type=click.FLOAT) def clean(frequency, minutes): - waiter = StatusWait('charge_status', 'charging') + waiter = StatusWait('charge_status', 'charging') if minutes > 0: waiter = TimeWait(minutes * 60) @@ -185,15 +192,16 @@ def edge(frequency, minutes): return CliAction(Edge(), wait=TimeWait(minutes * 60)) -@cli.command(help='cleans provided area(s), ex: "0,1"',context_settings={"ignore_unknown_options": True}) #ignore_unknown for map coordinates with negatives -@click.option("--map-position","-p", is_flag=True, help='clean provided map position instead of area, ex: "-602,1812,800,723"') +# ignore_unknown for map coordinates with negatives +@cli.command(help='cleans provided area(s), ex: "0,1"', context_settings={"ignore_unknown_options": True}) +@click.option("--map-position", "-p", is_flag=True, help='clean provided map position instead of area, ex: "-602,1812,800,723"') @click.argument('area', type=click.STRING, required=True) def area(area, map_position): if map_position: - return CliAction(SpotArea('start', map_position=area), wait=StatusWait('charge_status', 'returning')) + return CliAction(SpotArea('start', map_position=area), wait=StatusWait('charge_status', 'returning')) else: return CliAction(SpotArea('start', area=area), wait=StatusWait('charge_status', 'returning')) - + @cli.command(help='returns to charger') def charge(): @@ -209,6 +217,21 @@ def stop(): return CliAction(Stop(), terminal=True, wait=StatusWait('clean_status', 'stop')) +@cli.command(help='pause the robot in its current position') +def pause(): + return CliAction(Pause(), terminal=True, wait=StatusWait('clean_status', 'pause')) + + +@cli.command(help='Resume job') +def resume(): + return CliAction(Resume(), terminal=True, wait=StatusWait('charge_status', 'charging')) + + +@cli.command(help='get the current state of the robot') +def state(): + return CliAction(GetCleanState(), terminal=True, wait=TimeWait(10)) + + @cli.resultcallback() def run(actions, debug): actions = list(filter(None.__ne__, actions)) @@ -227,7 +250,8 @@ def run(actions, debug): api = EcoVacsAPI(config['device_id'], config['email'], config['password_hash'], config['country'], config['continent'], verify_ssl=config['verify_ssl']) vacuum = api.devices()[0] - vacbot = VacBot(api.uid, api.REALM, api.resource, api.user_access_token, vacuum, config['continent'], verify_ssl=config['verify_ssl']) + vacbot = VacBot(api.uid, api.REALM, api.resource, api.user_access_token, + vacuum, config['continent'], verify_ssl=config['verify_ssl']) vacbot.connect_and_wait_until_ready() for action in actions: