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 update_status(vac: miio.Vacuum): """Return update state and progress.""" update_state = vac.update_state() click.echo("Update state: %s" % update_state) if update_state == UpdateState.Downloading: click.echo("Update progress: %s" % vac.update_progress())