#!/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()