def update_firmware(vac: miio.Vacuum, url: str, md5: str, ip: str): """Update device firmware. If `url` starts with http* it is expected to be an URL. In that case md5sum of the file has to be given. `--ip` can be used to override automatically detected IP address for the device to contact for the update. """ # TODO Check that the device is in updateable state. click.echo("Going to update from %s" % url) if url.lower().startswith("http"): if md5 is None: click.echo("You need to pass md5 when using URL for updating.") return click.echo("Using %s (md5: %s)" % (url, md5)) else: server = OneShotServer(url) url = server.url(ip) t = threading.Thread(target=server.serve_once) t.start() click.echo("Hosting file at %s" % url) md5 = server.md5 update_res = vac.update(url, md5) if update_res: click.echo("Update started!") else: click.echo("Starting the update failed: %s" % update_res) with tqdm(total=100) as t: state = vac.update_state() while state == UpdateState.Downloading: try: state = vac.update_state() progress = vac.update_progress() except: # noqa # nosec # we may not get our messages through during uploads continue if state == UpdateState.Installing: click.echo( "Installation started, please wait until the vacuum reboots" ) break t.update(progress - t.n) t.set_description("%s" % state.name) time.sleep(1)
def install_sound(vac: RoborockVacuum, url: str, md5sum: str, sid: int, ip: str): """Install a sound. When passing a local file this will create a self-hosting server for the given file and the md5sum will be calculated automatically. For URLs you have to specify the md5sum manually. `--ip` can be used to override automatically detected IP address for the device to contact for the update. """ click.echo(f"Installing from {url} (md5: {md5sum}) for id {sid}") local_url = None server = None if url.startswith("http"): if md5sum is None: click.echo("You need to pass md5 when using URL for updating.") return local_url = url else: server = OneShotServer(url) local_url = server.url(ip) md5sum = server.md5 t = threading.Thread(target=server.serve_once) t.start() click.echo("Hosting file at %s" % local_url) click.echo(vac.install_sound(local_url, md5sum, sid)) progress = vac.sound_install_progress() while progress.is_installing: progress = vac.sound_install_progress() click.echo(f"{progress.state.name} ({progress.progress} %)") time.sleep(1) progress = vac.sound_install_progress() if progress.is_errored: click.echo("Error during installation: %s" % progress.error) else: click.echo("Installation of sid '%s' complete!" % sid) if server is not None: t.join()