ESP32/flash_all_serial_config.py

73 lines
2.6 KiB
Python

#!/usr/bin/env python3
import os
import sys
import argparse
import serial
import time
from pathlib import Path
def send_cfg(port, ssid, password, dhcp, start_ip, mask, gw):
print(f"Connecting to {port}...")
with serial.Serial(port, baudrate=115200, timeout=2) as ser:
time.sleep(0.5)
ser.reset_input_buffer()
ser.write(b"CFG\n")
ser.write(f"SSID:{ssid}\n".encode())
ser.write(f"PASS:{password}\n".encode())
if dhcp == 0:
ser.write(f"IP:{start_ip}\n".encode())
ser.write(f"MASK:{mask}\n".encode())
ser.write(f"GW:{gw}\n".encode())
ser.write(f"DHCP:{dhcp}\n".encode())
ser.write(b"END\n")
time.sleep(0.3)
print("\nDevice response:")
while ser.in_waiting:
sys.stdout.write(ser.read(ser.in_waiting).decode(errors='ignore'))
sys.stdout.flush()
time.sleep(0.1)
print("\n✅ Configuration sent successfully.")
def main():
parser = argparse.ArgumentParser(description="Configure ESP32 Wi-Fi settings over serial")
parser.add_argument("--project", help="ESP-IDF project path (defaults to current working directory)")
parser.add_argument("--ssid", required=True)
parser.add_argument("--password", required=True)
parser.add_argument("--start-ip", help="Static IP address")
parser.add_argument("--mask", default="255.255.255.0")
parser.add_argument("--gw", help="Gateway address")
parser.add_argument("--dhcp", type=int, choices=[0,1], default=1)
parser.add_argument("--baud", type=int, default=460800)
parser.add_argument("--cfg-baud", type=int, default=115200)
parser.add_argument("--ports", nargs='+', help="Serial port(s), e.g., /dev/ttyUSB0 /dev/ttyUSB1")
parser.add_argument("--port", help="Single serial port (shorthand for --ports PORT)")
parser.add_argument("--dry-run", action="store_true")
args = parser.parse_args()
# Default to current working directory
project_path = args.project or os.getcwd()
print(f"Using project directory: {project_path}")
# Resolve ports
ports = []
if args.port:
ports.append(args.port)
elif args.ports:
ports = args.ports
else:
print("❌ No serial port specified. Use --port or --ports.")
sys.exit(1)
# Apply configuration
for port in ports:
if args.dry_run:
print(f"[DRY RUN] Would send Wi-Fi config to {port}")
else:
send_cfg(port, args.ssid, args.password, args.dhcp, args.start_ip, args.mask, args.gw)
if __name__ == "__main__":
main()