ESP32/identiy_port.py

86 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""
identify_port.py
Tool to identify a specific physical device's port name.
1. Lists all connected USB Serial devices.
2. Asks you to power down or unplug ONE device.
3. Tells you exactly which /dev/ttyUSBx port disappeared.
"""
import time
import sys
from serial.tools import list_ports
class Colors:
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
RESET = '\033[0m'
def get_current_ports():
"""
Returns a set of all detected USB/ACM serial ports.
We look for standard USB-to-Serial drivers.
"""
# Grab all ports that look like USB serial adapters
ports = list(list_ports.grep("USB|ACM|CP210|FT232"))
# Return a set of device paths (e.g. {'/dev/ttyUSB0', '/dev/ttyUSB1'})
return set(p.device for p in ports)
def main():
print(f"{Colors.BLUE}{'='*60}{Colors.RESET}")
print(f" USB Port Identifier")
print(f"{Colors.BLUE}{'='*60}{Colors.RESET}")
# 1. Initial Scan
print("Scanning for connected devices...", end='', flush=True)
initial_ports = get_current_ports()
print(f" Found {len(initial_ports)} devices.")
if not initial_ports:
print(f"{Colors.RED}No USB serial devices found!{Colors.RESET}")
sys.exit(1)
# Print current list nicely
sorted_ports = sorted(list(initial_ports))
print(f"\n{Colors.GREEN}Active Ports:{Colors.RESET}")
for p in sorted_ports:
print(f" - {p}")
# 2. Prompt User
print(f"\n{Colors.YELLOW}>>> ACTION REQUIRED: Power down (or unplug) the device you want to identify.{Colors.RESET}")
input(f"{Colors.YELLOW}>>> Press ENTER once the device is off...{Colors.RESET}")
# 3. Final Scan
print("Rescanning...", end='', flush=True)
# Give the OS a moment to deregister the device if it was just pulled
time.sleep(1.0)
final_ports = get_current_ports()
print(" Done.")
# 4. Calculate Difference
removed_ports = initial_ports - final_ports
added_ports = final_ports - initial_ports
print(f"\n{Colors.BLUE}{'='*60}{Colors.RESET}")
print(f" Result")
print(f"{Colors.BLUE}{'='*60}{Colors.RESET}")
if len(removed_ports) == 1:
target = list(removed_ports)[0]
print(f"The device you powered down was: {Colors.RED}{target}{Colors.RESET}")
elif len(removed_ports) > 1:
print(f"{Colors.RED}Multiple ports disappeared!{Colors.RESET}")
for p in removed_ports:
print(f" - {p}")
elif len(added_ports) > 0:
print(f"{Colors.YELLOW}No ports removed, but new ones appeared?{Colors.RESET}")
for p in added_ports:
print(f" + {p}")
else:
print(f"{Colors.YELLOW}No changes detected. Did you power it down?{Colors.RESET}")
if __name__ == '__main__':
main()