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)
示例#2
0
    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)
示例#3
0
 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()
示例#4
0
    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
示例#5
0
    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()
示例#6
0
 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
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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
示例#10
0
    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)
示例#11
0
    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
示例#12
0
    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)
示例#13
0
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)
示例#14
0
    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)
示例#15
0
	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
示例#16
0
    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()
示例#17
0
    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