mirror of
https://github.com/xoseperez/espurna.git
synced 2026-03-03 06:54:16 +01:00
Added option to flash multiple devices from the ESPurna OTA Manager at once
This commit is contained in:
108
code/ota.py
108
code/ota.py
@@ -103,8 +103,48 @@ def get_boards():
|
||||
boards.append(m.group(1))
|
||||
return sorted(boards)
|
||||
|
||||
def get_empty_board():
|
||||
"""
|
||||
Returns the empty structure of a board to flash
|
||||
"""
|
||||
board = {'board': '', 'ip': '', 'size': 0, 'auth': '', 'flags': ''}
|
||||
return board
|
||||
|
||||
def flash():
|
||||
def get_board_by_index(index):
|
||||
"""
|
||||
Returns the required data to flash a given board
|
||||
"""
|
||||
board = {}
|
||||
if 1 <= index and index <= len(devices):
|
||||
device = devices[index - 1]
|
||||
board['hostname'] = device.get('hostname')
|
||||
board['board'] = device.get('device', '')
|
||||
board['ip'] = device.get('ip', '')
|
||||
board['size'] = int(device.get('mem_size', 0) if device.get('mem_size', 0) == device.get('sdk_size', 0) else 0) / 1024
|
||||
return board
|
||||
|
||||
def get_board_by_hostname(hostname):
|
||||
"""
|
||||
Returns the required data to flash a given board
|
||||
"""
|
||||
hostname = hostname.lower()
|
||||
for device in devices:
|
||||
if device.get('hostname', '').lower() == hostname:
|
||||
board = {}
|
||||
board['hostname'] = device.get('hostname')
|
||||
board['board'] = device.get('device')
|
||||
if not board['board']:
|
||||
return None
|
||||
board['ip'] = device.get('ip')
|
||||
if not board['ip']:
|
||||
return None
|
||||
board['size'] = int(device.get('sdk_size', 0)) / 1024
|
||||
if board['size'] == 0:
|
||||
return None
|
||||
return board
|
||||
return None
|
||||
|
||||
def input_board():
|
||||
"""
|
||||
Grabs info from the user about what device to flash
|
||||
"""
|
||||
@@ -118,16 +158,10 @@ def flash():
|
||||
print("Board number must be between 1 and %s\n" % str(len(devices)))
|
||||
return None
|
||||
|
||||
board = {'board': '', 'ip': '', 'size': 0, 'auth': '', 'flags': ''}
|
||||
|
||||
if index > 0:
|
||||
device = devices[index - 1]
|
||||
board['board'] = device.get('device', '')
|
||||
board['ip'] = device.get('ip', '')
|
||||
board['size'] = int(device.get('mem_size', 0) if device.get('mem_size', 0) == device.get('sdk_size', 0) else 0) / 1024
|
||||
board = get_board_by_index(index);
|
||||
|
||||
# Choose board type if none before
|
||||
if len(board['board']) == 0:
|
||||
if len(board.get('board', '')) == 0:
|
||||
|
||||
print()
|
||||
count = 1
|
||||
@@ -146,7 +180,7 @@ def flash():
|
||||
board['board'] = boards[index - 1]
|
||||
|
||||
# Choose board size of none before
|
||||
if board['size'] == 0:
|
||||
if board.get('size', 0) == 0:
|
||||
try:
|
||||
board['size'] = int(input("Board memory size (1 for 1M, 4 for 4M): "))
|
||||
except:
|
||||
@@ -154,20 +188,18 @@ def flash():
|
||||
return None
|
||||
|
||||
# Choose IP of none before
|
||||
if len(board['ip']) == 0:
|
||||
if len(board.get('ip', '')) == 0:
|
||||
try:
|
||||
board['ip'] = input("IP of the device to flash (empty for 192.168.4.1): ") or "192.168.4.1"
|
||||
except:
|
||||
print("Wrong IP")
|
||||
return None
|
||||
|
||||
board['auth'] = input("Authorization key of the device to flash: ")
|
||||
board['flags'] = input("Extra flags for the build: ")
|
||||
|
||||
return board
|
||||
|
||||
|
||||
def run(device, env):
|
||||
print("Building and flashing image over-the-air...")
|
||||
command = "export ESPURNA_IP=\"%s\"; export ESPURNA_BOARD=\"%s\"; export ESPURNA_AUTH=\"%s\"; export ESPURNA_FLAGS=\"%s\"; platformio run --silent --environment %s -t upload"
|
||||
command = command % (device['ip'], device['board'], device['auth'], device['flags'], env)
|
||||
subprocess.check_call(command, shell=True)
|
||||
@@ -181,7 +213,10 @@ if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description=description)
|
||||
parser.add_argument("-c", "--core", help="flash ESPurna core", default=0, action='count')
|
||||
parser.add_argument("-f", "--flash", help="flash device", default=0, action='count')
|
||||
parser.add_argument("-o", "--flags", help="extra flags", default='')
|
||||
parser.add_argument("-p", "--password", help="auth password", default='')
|
||||
parser.add_argument("-s", "--sort", help="sort devices list by field", default='hostname')
|
||||
parser.add_argument("hostnames", nargs='*', help="Hostnames to update")
|
||||
args = parser.parse_args()
|
||||
|
||||
print()
|
||||
@@ -210,24 +245,49 @@ if __name__ == '__main__':
|
||||
|
||||
# Flash device
|
||||
if args.flash > 0:
|
||||
device = flash()
|
||||
if device:
|
||||
|
||||
# Board(s) to flash
|
||||
queue = []
|
||||
|
||||
# Check if hostnames
|
||||
for hostname in args.hostnames:
|
||||
board = get_board_by_hostname(hostname)
|
||||
if board:
|
||||
board['auth'] = args.password
|
||||
board['flags'] = args.flags
|
||||
queue.append(board)
|
||||
|
||||
# If no boards ask the user
|
||||
if len(queue) == 0:
|
||||
board = input_board()
|
||||
if board:
|
||||
board['auth'] = args.password or input("Authorization key of the device to flash: ")
|
||||
board['flags'] = args.flags or input("Extra flags for the build: ")
|
||||
queue.append(board)
|
||||
|
||||
# If still no boards quit
|
||||
if len(queue) == 0:
|
||||
sys.exit(0)
|
||||
|
||||
# Flash eash board
|
||||
for board in queue:
|
||||
|
||||
# Flash core version?
|
||||
if args.core > 0:
|
||||
device['flags'] = "-DESPURNA_CORE " + device['flags']
|
||||
board['flags'] = "-DESPURNA_CORE " + board['flags']
|
||||
|
||||
env = "esp8266-%sm-ota" % device['size']
|
||||
env = "esp8266-%sm-ota" % board['size']
|
||||
|
||||
# Summary
|
||||
print()
|
||||
print("ESPURNA_IP = %s" % device['ip'])
|
||||
print("ESPURNA_BOARD = %s" % device['board'])
|
||||
print("ESPURNA_AUTH = %s" % device['auth'])
|
||||
print("ESPURNA_FLAGS = %s" % device['flags'])
|
||||
print("ESPURNA_ENV = %s" % env)
|
||||
print("HOST = %s" % board.get('hostname', board['ip']))
|
||||
print("IP = %s" % board['ip'])
|
||||
print("BOARD = %s" % board['board'])
|
||||
print("AUTH = %s" % board['auth'])
|
||||
print("FLAGS = %s" % board['flags'])
|
||||
print("ENV = %s" % env)
|
||||
|
||||
response = input("\nAre these values right [y/N]: ")
|
||||
print()
|
||||
if response == "y":
|
||||
run(device, env)
|
||||
run(board, env)
|
||||
|
||||
Reference in New Issue
Block a user