def _firmware_upload_task(self): firmware = ( '0x1000', os.path.join(gm_firmware_dir(),'bootloader.bin'), '0x10000', os.path.join(gm_firmware_dir(), 'NodeMCU.bin'), '0x8000', os.path.join(gm_firmware_dir(), 'partitions_singleapp.bin') ) args = FirmwareUploadArgs(self.serial_monitor.port,firmware) initial_baud = min(ESPLoader.ESP_ROM_BAUD, args.baud) try: self.serial_monitor.stop(log=False) self.panel_writeln('Firmware Start Update ...') esp_set_log(self.panel_writeln) esp = ESPLoader.detect_chip(args.port, initial_baud, args.before) self.panel_writeln("Chip is %s" % (esp.get_chip_description())) esp = esp.run_stub() if args.baud > initial_baud: try: esp.change_baud(args.baud) except NotImplementedInROMError: self.panel_writeln("WARNING: ROM doesn't support changing baud rate. Keeping initial baud rate %d" % initial_baud) if hasattr(args, "flash_size"): self.panel_writeln("Configuring flash size...") detect_flash_size(esp, args) esp.flash_set_parameters(flash_size_bytes(args.flash_size)) write_flash(esp, args) esp.hard_reset() esp._port.close() self.serial_monitor.start() except Exception as e: self.panel_writeln(str(e)) finally: self.serial_monitor.start(log=False)
def erase_board(self, progress, device, baudrate=460800): progress.emit(self.tr('Connecting...'), 0) init_baud = min(ESPLoader.ESP_ROM_BAUD, baudrate) esp = ESPLoader.detect_chip(device, init_baud, 'default_reset', False) progress.emit(self.tr('Connected. Chip type: {chip_type}').format( chip_type=esp.get_chip_description()), 0) esp = esp.run_stub() esp.change_baud(baudrate) esp.erase_flash() progress.emit(self.tr('Erasing complete!'), 100)
def erase_flash(self, port): try: self.esp8266 = ESPLoader.detect_chip(port=port, baud=FLASH_BAUD) read_mac(self.esp8266, None) self.esp8266 = self.esp8266.run_stub() except serial.serialutil.SerialException as _: self.show_log(u'串口读写失败,请检查是否有其他程序占用了指定串口') self.flash_result_sig.emit(1, u'串口读写失败') return erase_flash(self.esp8266, None) self.show_log('flash 清除完毕') self.complete_erase_flash_sig.emit() self.esp8266.close_serial()
def run(self): try: print("esptool.py v%s" % esptool.__version__) initial_baud = min(ESPLoader.ESP_ROM_BAUD, self._config.baud) if self._config.port.startswith(__auto_select__): esp = self.connect_to_esp(initial_baud) else: esp = ESPLoader.detect_chip(self._config.port, initial_baud) print("Chip is %s" % (esp.get_chip_description())) print("Features: %s" % ", ".join(esp.get_chip_features())) esptool.read_mac(esp, Namespace()) esp = esp.run_stub() if self._config.baud > initial_baud: try: esp.change_baud(self._config.baud) except NotImplementedInROMError: print( "WARNING: ROM doesn't support changing baud rate. Keeping initial baud rate %d." % initial_baud) args = Namespace() args.flash_size = "detect" args.flash_mode = self._config.mode args.flash_freq = "40m" args.no_progress = False args.no_stub = False args.verify = False # TRUE is deprecated args.compress = True args.addr_filename = [[ int("0x00000", 0), open(self._config.firmware_path, 'rb') ]] print("Configuring flash size...") esptool.detect_flash_size(esp, args) esp.flash_set_parameters(esptool.flash_size_bytes(args.flash_size)) if self._config.erase_before_flash: esptool.erase_flash(esp, args) esptool.write_flash(esp, args) # The last line printed by esptool is "Leaving..." -> some indication that the process is done is needed print("\nDone. Unplug/replug or reset device.") esp._port.close() except SerialException as e: self._parent.report_error(e.strerror) raise e
def begin_flash(self, firmware): port = firmware['port'] self._is_abort = False try: self.esp8266 = ESPLoader.detect_chip(port=port, baud=FLASH_BAUD) self.esp8266 = self.esp8266.run_stub() except serial.serialutil.SerialException as _: self.show_log(u'串口读写失败,请检查是否有其他程序占用了指定串口') self.flash_result_sig.emit(1, u'串口读写失败') return # self._flash_write(comport, firmwares) self.write_flash(firmware) self.flash_result_sig.emit(0, u'成功') self.esp8266.close_serial()
def connect_to_esp(initial_baud): # stripped down version of esptool.py:2537 ser_list = sorted(ports.device for ports in list_ports.comports()) print("Found %d serial ports" % len(ser_list)) esp = None for each_port in reversed(ser_list): print("Testing serial port %s" % each_port) try: esp = ESPLoader.detect_chip(each_port, initial_baud) break # on the first detected Espressif device except (FatalError, OSError) as err: print("%s failed to connect: %s" % (each_port, err)) esp = None if esp is None: print("\nAll of the %d available serial ports could not connect to a Espressif device." % len(ser_list)) raise FatalError('No serial port with ESP') return esp
def flash_board(self, progress, device, binary_uri, baudrate=460800): if binary_uri.startswith(ALLOWED_PROTO): binary_uri = self.cache_download(progress, binary_uri) progress.emit(self.tr('Connecting...'), 0) init_baud = min(ESPLoader.ESP_ROM_BAUD, baudrate) esp = ESPLoader.detect_chip(device, init_baud, 'default_reset', False) progress.emit( self.tr('Connected. Chip type: {chip_type}').format( chip_type=esp.get_chip_description()), 0) esp = esp.run_stub() esp.change_baud(baudrate) with open(binary_uri, 'rb') as fd: uncimage = fd.read() image = zlib.compress(uncimage, 9) address = 0x0 blocks = esp.flash_defl_begin(len(uncimage), len(image), address) seq = 0 written = 0 t = time.time() while len(image) > 0: current_addr = address + seq * esp.FLASH_WRITE_SIZE progress.emit( self.tr('Writing at 0x{address:08x}...').format( address=current_addr), 100 * (seq + 1) // blocks) block = image[0:esp.FLASH_WRITE_SIZE] esp.flash_defl_block(block, seq, timeout=3.0) image = image[esp.FLASH_WRITE_SIZE:] seq += 1 written += len(block) t = time.time() - t deviceName = str(hex(esp.chip_id())) deviceName = deviceName.replace("0x", "") deviceName = deviceName.upper() deviceName = "Smogomierz-" + deviceName progress.emit( self.tr( 'Finished in {time:.2f} seconds. Name: {sensor_id}').format( time=t, sensor_id=(deviceName)), 100)
def write_config(self, progress, device, path, baudrate=460800): progress.emit(self.tr('Connecting...'), 0) init_baud = min(ESPLoader.ESP_ROM_BAUD, baudrate) esp = ESPLoader.detect_chip(device, init_baud, 'default_reset', False) progress.emit( self.tr('Connected. Chip type: {chip_type}').format( chip_type=esp.get_chip_description()), 0) esp = esp.run_stub() esp.change_baud(baudrate) with open(path, 'rb') as fd: uncimagespiffs = fd.read() imagespiffs = zlib.compress(uncimagespiffs, 0) address = 0x100000 blocks = esp.flash_defl_begin(len(uncimagespiffs), len(imagespiffs), address) seq = 0 written = 0 t = time.time() while len(imagespiffs) > 0: current_addr = address + seq * esp.FLASH_WRITE_SIZE progress.emit( self.tr('Writing at 0x{address:08x}...').format( address=current_addr), 100 * (seq + 1) // blocks) block = imagespiffs[0:esp.FLASH_WRITE_SIZE] esp.flash_defl_block(block, seq, timeout=3.0) imagespiffs = imagespiffs[esp.FLASH_WRITE_SIZE:] seq += 1 written += len(block) #print("iteration "+str(seq)) t = time.time() - t progress.emit( self.tr('Finished in {time:.2f} seconds. Sensor ID: {sensor_id}'). format(time=t, sensor_id=esp.chip_id()), 100) esp.flash_finish(True)
def run(self): try: initial_baud = min(ESPLoader.ESP_ROM_BAUD, self._config.baud) esp = ESPLoader.detect_chip(self._config.port, initial_baud) print("Chip is %s" % (esp.get_chip_description())) esp = esp.run_stub() if self._config.baud > initial_baud: try: esp.change_baud(self._config.baud) except NotImplementedInROMError: print( "WARNING: ROM doesn't support changing baud rate. Keeping initial baud rate %d" % initial_baud) args = Namespace() args.flash_size = "detect" args.flash_mode = self._config.mode args.flash_freq = "40m" args.no_progress = False args.no_stub = False args.verify = False # TRUE is deprecated args.compress = True args.addr_filename = [[ int("0x00000", 0), open(self._config.firmware_path, 'rb') ]] print("Configuring flash size...") esptool.detect_flash_size(esp, args) esp.flash_set_parameters(esptool.flash_size_bytes(args.flash_size)) if self._config.erase_before_flash: esptool.erase_flash(esp, args) esptool.write_flash(esp, args) self._parent.log_message( "Hard resetting...") # replicate behavior from esptool.py:2111 esp.hard_reset() except SerialException as e: self._parent.report_error(e.strerror) raise e
def erase_board(self, progress, device, baudrate=460800): progress.emit(self.tr('Connecting...'), 0) init_baud = min(ESPLoader.ESP_ROM_BAUD, baudrate) esp = ESPLoader.detect_chip(device, init_baud, 'default_reset', False) progress.emit( self.tr('Connected. Chip type: {chip_type}').format( chip_type=esp.get_chip_description()), 0) esp = esp.run_stub() esp.change_baud(baudrate) address = 0x0 # TODO: esp.erase_flash !! #esptool.py --port /dev/cu.wchusbserial1410 erase_flash #esp = esp.erase_flash #esp.erase_flash esp.erase_flash() progress.emit(self.tr('Erasing complet!'), 100)
def run(self): try: initial_baud = min(ESPLoader.ESP_ROM_BAUD, self._config.baud) esp = ESPLoader.detect_chip(self._config.port, initial_baud) print("芯片类型: %s" % (esp.get_chip_description())) esp = esp.run_stub() if self._config.baud > initial_baud: try: esp.change_baud(self._config.baud) except NotImplementedInROMError: print("警告: ROM 不支持改变波特率. 请保持初始波特率 %d." % initial_baud) args = Namespace() args.flash_size = "detect" args.flash_mode = self._config.mode args.flash_freq = "40m" args.no_progress = False args.no_stub = False args.verify = False # TRUE is deprecated args.compress = True args.addr_filename = [[ int("0x00000", 0), open(self._config.firmware_path, 'rb') ]] print("Configuring flash size...") esptool.detect_flash_size(esp, args) esp.flash_set_parameters(esptool.flash_size_bytes(args.flash_size)) if self._config.erase_before_flash: esptool.erase_flash(esp, args) esptool.write_flash(esp, args) # The last line printed by esptool is "Leaving..." -> some indication that the process is done is needed print("\nDone.") except SerialException as e: self._parent.report_error(e.strerror) raise e
def flash_board(self, progress, device, binary_uri, baudrate=460800): if binary_uri.startswith(ALLOWED_PROTO): binary_uri = self.cache_download(progress, binary_uri) progress.emit(self.tr('Connecting...'), 0) init_baud = min(ESPLoader.ESP_ROM_BAUD, baudrate) esp = ESPLoader.detect_chip(device, init_baud, 'default_reset', False) progress.emit( self.tr('Connected. Chip type: {chip_type}').format( chip_type=esp.get_chip_description()), 0) esp = esp.run_stub() esp.change_baud(baudrate) t = time.time() if zipfile.is_zipfile(binary_uri): with zipfile.ZipFile(binary_uri) as myzip: for fname in myzip.namelist(): if fname.startswith("0x"): addr = int(fname, 16) with myzip.open(fname) as myfile: data = myfile.read() print("Segment: " + fname + " / " + str(addr) + " Size: " + str(len(data))) self.flashBlock(data, progress, esp, addr) else: print("Cannot handle " + fname) else: with open(binary_uri, 'rb') as fd: uncimage = fd.read() self.flashBlock(uncimage, progress, esp, 0x0) t = time.time() - t esp.flash_finish(True) progress.emit( self.tr('Finished in {time:.2f} seconds.').format(time=t), 100)
sys.path.append(homeDir + "/esptool/") from esptool import ESP8266ROM, ESPLoader import filecmp import urllib.request import html import os import subprocess namePrefix = "droneAir" gcloudProject = "drone-302200" droneRegion = "europe-west1" droneRegistry = "droneDeviceProduction" chipId = ESP8266ROM.chip_id(ESPLoader.detect_chip(port="/dev/ttyUSB1")) deviceNamePostfix = str(chipId) deviceName = namePrefix + "_" + deviceNamePostfix devicePrivateKeyPem = deviceNamePostfix + "_private.pem" devicePrivateKeyDer = deviceNamePostfix + "_private.der" devicePrivateKeyCsr = deviceNamePostfix + "_private.csr" devicePublicKeyPem = deviceNamePostfix + "_public.pem" deviceQRFilePath = deviceNamePostfix + "_qr.png" deviceFilePath = "device_LitttleFS/data/id/" privateKeyFilePath = deviceFilePath + devicePrivateKeyDer publicKeyFilePath = deviceFilePath + devicePublicKeyPem qRFilePath = deviceFilePath + deviceQRFilePath def areKeyFilesSame(): p = os.popen(publicKeyFilePath)
def on_wifiButton_clicked(self): self.statusbar.clearMessage() ssid = self.wifiSSID.text() pw = self.wifiPW.text() if not ssid: self.statusbar.showMessage(self.tr("No SSID typed.")) return if not pw: self.statusbar.showMessage(self.tr("No PW type.")) return esp = ESPLoader.detect_chip(self.boardBox.currentData(ROLE_DEVICE), min(ESPLoader.ESP_ROM_BAUD, 460800), 'default_reset', False) jsonPart1 = '{"SOFTWARE_VERSION":"NRZ-2020-133","current_lang":"EN","wlanssid":"' jsonPart2 = '","wlanpwd":"' jsonPart3 = '","www_username":"******","www_password":"","fs_ssid":"' jsonPart4 = '","fs_pwd":"","www_basicauth_enabled":false,"dht_read":false,"htu21d_read":false,"ppd_read":false,"sds_read":true,"pms_read":false,"hpm_read":false,"npm_read":false,"sps30_read":false,"bmp_read":false,"bmx280_read":true,"sht3x_read":false,"ds18b20_read":false,"dnms_read":false,"dnms_correction":"0.0","temp_correction":"0.0","gps_read":false,"send2dusti":true,"ssl_dusti":false,"send2madavi":true,"ssl_madavi":false,"send2sensemap":false,"send2fsapp":false,"send2aircms":false,"send2csv":false,"auto_update":true,"use_beta":false,"has_display":false,"has_sh1106":false,"has_flipped_display":false,"has_lcd1602":false,"has_lcd1602_27":false,"has_lcd2004":false,"has_lcd2004_27":false,"display_wifi_info":true,"display_device_info":true,"debug":3,"sending_intervall_ms":145000,"time_for_wifi_config":600000,"senseboxid":"","send2custom":false,"host_custom":"192.168.234.1","url_custom":"/data.php","port_custom":80,"user_custom":"","pwd_custom":"","ssl_custom":false,"send2influx":false,"host_influx":"influx.server","url_influx":"/write?db=sensorcommunity","port_influx":8086,"user_influx":"","pwd_influx":"","measurement_name_influx":"feinstaub","ssl_influx":false}' jsonTest = jsonPart1 + ssid + jsonPart2 + pw + jsonPart3 + "airRohr-" + str( esp.chip_id()) + jsonPart4 if not self.is_json(jsonTest): self.statusbar.showMessage(self.tr("Created invalid json.")) return else: self.jsonFinal = jsonPart1 + ssid + jsonPart2 + pw + jsonPart3 + "airRohr-" + str( esp.chip_id()) + jsonPart4 self.statusbar.showMessage(self.tr("Created valid json.")) print(self.jsonFinal) #self.cachedirspiffs = tempfile.TemporaryDirectory() self.statusbar.showMessage( self.tr("Opening temporary json directory.")) jsonfile = open(self.cachedirjson.name + "/config.json", "w") self.statusbar.showMessage( self.tr("Write json in temporay json directory.")) jsonfile.write(self.jsonFinal) jsonfile.close() #self.cachedirspiffs = tempfile.TemporaryDirectory() #python3 spiffsgen.py --page-size 256 --block-size 8192 --no-magic-len --aligned-obj-ix-tables --meta-len=0 $((0xFFA000-0x100000)) path/to/files image.bin #args = ["--page-size 256","--block-size 8192","--no-magic-len","--aligned-obj-ix-tables","--meta-len=0 $((0xFFA000-0x100000))", path/to/files image.bin] self.statusbar.showMessage(self.tr("Make SPIFFS bin")) args = [] args.extend([ "spiffsgen.py", "--page-size", "256", "--block-size", "8192", "--meta-len=0", "0x100000" ]) args.append("--no-magic-len") args.append("--aligned-obj-ix-tables") args.extend([ self.cachedirjson.name, self.cachedirspiffs.name + "/spiffs.bin" ]) sys.argv = args spiffsgen.main() self.statusbar.showMessage(self.tr("spiffs.bin done!")) self.statusbar.clearMessage() device = self.boardBox.currentData(ROLE_DEVICE) if not device: self.statusbar.showMessage(self.tr("No device selected.")) return if self.write_config.running(): self.statusbar.showMessage(self.tr("Work in progess...")) return self.write_config(self.uploadProgress, device, self.cachedirspiffs.name + "/spiffs.bin", error=self.errorSignal)
def doFlashTasmota(self, room: str, espType: str, siteId: str): port = self.findUSBPort(timeout=60) if not port: self.MqttManager.say(text=self.TalkManager.randomTalk('noESPFound', skill='AliceCore'), client=siteId) self._broadcastFlag.clear() return self.MqttManager.say(text=self.TalkManager.randomTalk('usbDeviceFound', skill='AliceCore'), client=siteId) try: mac = ESPLoader.detect_chip(port=port, baud=115200).read_mac() mac = ':'.join([f'{x:02x}' for x in mac]) cmd = [ '--port', port, '--baud', '115200', '--after', 'no_reset', 'write_flash', '--flash_mode', 'dout', '0x00000', 'sonoff.bin', '--erase-all' ] esptool.main(cmd) except Exception as e: self.logError(f'Something went wrong flashing esp device: {e}') self.MqttManager.say(text=self.TalkManager.randomTalk('espFailed', skill='AliceCore'), client=siteId) self._broadcastFlag.clear() return self.logInfo('Tasmota flash done') self.MqttManager.say(text=self.TalkManager.randomTalk('espFlashedUnplugReplug', skill='AliceCore'), client=siteId) found = self.findUSBPort(timeout=60) if found: self.MqttManager.say(text=self.TalkManager.randomTalk('espFoundReadyForConf', skill='AliceCore'), client=siteId) time.sleep(10) uid = self._getFreeUID(mac) tasmotaConfigs = TasmotaConfigs(deviceType=espType, uid=uid) confs = tasmotaConfigs.getBacklogConfigs(room) if not confs: self.logError('Something went wrong getting tasmota configuration') self.MqttManager.say(text=self.TalkManager.randomTalk('espFailed', skill='AliceCore'), client=siteId) else: ser = serial.Serial() ser.baudrate = 115200 ser.port = port ser.open() try: for group in confs: cmd = ';'.join(group['cmds']) if len(group['cmds']) > 1: cmd = f'Backlog {cmd}' arr = list() if len(cmd) > 50: while len(cmd) > 50: arr.append(cmd[:50]) cmd = cmd[50:] arr.append(f'{cmd}\r\n') else: arr.append(f'{cmd}\r\n') for piece in arr: ser.write(piece.encode()) self.logInfo('Sent {}'.format(piece.replace('\r\n', ''))) time.sleep(0.5) time.sleep(group['waitAfter']) ser.close() self.logInfo('Tasmota flashing and configuring done') self.MqttManager.say(text=self.TalkManager.randomTalk('espFlashingDone', skill='AliceCore'), client=siteId) self.addNewDevice(espType, room, uid) self._broadcastFlag.clear() except Exception as e: self.logError(f'Something went wrong writting configuration to esp device: {e}') self.MqttManager.say(text=self.TalkManager.randomTalk('espFailed', skill='AliceCore'), client=siteId) self._broadcastFlag.clear() ser.close() else: self.MqttManager.say(text=self.TalkManager.randomTalk('espFailed', skill='AliceCore'), client=siteId) self._broadcastFlag.clear() return
def run(self): print("You are using esptool version %s" % esptool.__version__) esptool = ESPLoader.detect_chip() print("Chip ID: %s" % progFW.CHIP_NAME) print(esptool.get_chip_description()) print(esptool.get_chip_features()) # get MAC address and print it mac = esptool.read_mac() print("The %s has the MAC address" % progFW.CHIP_NAME, end=' ') for i in range(0, 6): if i != 5: print("%x" % mac[i], end=':') else: print("%x" % mac[i]) flashID = progFW.flash_id() print("Flash id:0x%x" % flashID) print("user firmware esptool created and thread started") # self.connect(esptool,SIGNAL("percentchange"),self.updateFirmwarePer) # self.connect(esptool,SIGNAL("eraseStart"),self.eraseStart) self.sig_percentChange.connect(self.updateFirmwarePer) #esptool.sig_eraseStart.connect(self.eraseStart) if self.iserase == "yes": print("erase flag is set") else: print("erase flag is NOT set") print("iserase: %s" % self.iserase) if self.iserase == "yes": self.erasetimer = threading.Timer(0.1, self.eraseTimer) self.erasetimer.start() try: print("Starting to burn board %s " % self.board) print("Burn task momentarily disabled") #Esp.Burn(esptool,str(self.board),self.savepath,self.com,True) time.sleep(1) self.erasePer = 100 # self.emit(SIGNAL("sig_firmwareAnyErase"),self.erasePer) self.sig_firmwareAnyErase.emit(self.erasePer) self.erasetimer.cancel() except: time.sleep(1) self.erasePer = -1 # self.emit(SIGNAL("sig_firmwareAnyErase"),self.erasePer) self.sig_firmwareAnyErase.emit(self.erasePer) self.erasetimer.cancel() self.erasestart = False self.exit() return if self.iserase == "yes": # self.emit(SIGNAL("sig_firmwareAnyErase"),100) self.sig_firmwareAnyErase.emit(100) try: if self.board == "esp32" or self.board == "esp8266" or self.board == "TPYBoardV202": print("Took away burn") #Esp.Burn(esptool,str(self.board),self.savepath,self.com,False,self.burnaddr) else: #microbit print("In threaddownloadfirmware:savepath=%s" % self.savepath) # self.emit(SIGNAL("sig_firmwareAnyUpdate"),-2) self.sig_firmwareAnyUpdate.emit(-2) time.sleep(0.5) # self.emit(SIGNAL("sig_goMicrobitUpdate")) self.sig_goMicrobitUpdate.emit() except: # self.emit(SIGNAL("sig_firmwareAnyUpdate"),-1) self.sig_firmwareAnyUpdate.emit(-1) self.exit() return if self.board == "esp8266": Esp.downOkReset() self.exit()
def doFlashTasmota(self, room: str, espType: str, siteId: str): port = self.findUSBPort(timeout=60) if port: self.MqttManager.say(text=self.TalkManager.randomTalk( 'usbDeviceFound', module='AliceCore'), client=siteId) try: mac = ESPLoader.detect_chip(port=port, baud=115200).read_mac() mac = '%s' % (':'.join(map(lambda x: '%02x' % x, mac))) cmd = list() cmd.append('--port') cmd.append(port) cmd.append('--baud') cmd.append('115200') cmd.append('--after') cmd.append('no_reset') cmd.append('write_flash') cmd.append('--flash_mode') cmd.append('dout') cmd.append('0x00000') cmd.append('sonoff.bin') cmd.append('--erase-all') esptool.main(cmd) except Exception as e: self._logger.error( '[{}] Something went wrong flashing esp device: {}'.format( self.name, e)) self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFailed', module='AliceCore'), client=siteId) self._broadcastFlag.clear() return else: self.MqttManager.say(text=self.TalkManager.randomTalk( 'noESPFound', module='AliceCore'), client=siteId) self._broadcastFlag.clear() return self._logger.info('[{}] Tasmota flash done'.format(self.name)) self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFlashedUnplugReplug', module='AliceCore'), client=siteId) found = self.findUSBPort(timeout=60) if found: self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFoundReadyForConf', module='AliceCore'), client=siteId) time.sleep(10) uid = self._getFreeUID(mac) tasmotaConfigs = TasmotaConfigs(deviceType=espType, uid=uid) confs = tasmotaConfigs.getBacklogConfigs(room) if not confs: self._logger.error( '[{}] Something went wrong getting tasmota configuration'. format(self.name)) self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFailed', module='AliceCore'), client=siteId) else: serial = Serial() serial.baudrate = 115200 serial.port = port serial.open() try: for group in confs: cmd = ';'.join(group['cmds']) if len(group['cmds']) > 1: cmd = 'Backlog {}'.format(cmd) arr = list() if len(cmd) > 50: while len(cmd) > 50: arr.append(cmd[:50]) cmd = cmd[50:] arr.append('{}\r\n'.format(cmd)) else: arr.append('{}\r\n'.format(cmd)) for piece in arr: serial.write(piece.encode()) self._logger.info('[{}] Sent {}'.format( self.name, piece.replace('\r\n', ''))) time.sleep(0.5) time.sleep(group['waitAfter']) serial.close() self._logger.info( '[{}] Tasmota flashing and configuring done'.format( self.name)) self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFlashingDone', module='AliceCore'), client=siteId) self.addNewDevice(espType, room, uid) self._broadcastFlag.clear() except Exception as e: self._logger.error( '[{}] Something went wrong writting configuration to esp device: {}' .format(self.name, e)) self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFailed', module='AliceCore'), client=siteId) self._broadcastFlag.clear() serial.close() else: self.MqttManager.say(text=self.TalkManager.randomTalk( 'espFailed', module='AliceCore'), client=siteId) self._broadcastFlag.clear() return