commaai/openpilot · error · SystemExit

no eUICC detected

Error message

no eUICC detected

What it means

Before dispatching any subcommand, the esim CLI obtains the LPA backend from HARDWARE.get_sim_lpa() and checks lpa.is_euicc(). If the modem/SIM stack reports no eUICC (no eSIM-capable chip on the active interface), the tool aborts with SystemExit('no eUICC detected') because every subsequent operation requires the eUICC's ISD-R.

Source

Thrown at openpilot/common/esim/esim.py:67

  p_switch = sub.add_parser('switch', help='switch to profile')
  p_switch.add_argument('profile', help='iccid or 1-based index from `list`')

  p_delete = sub.add_parser('delete', help='delete profile (warning: this cannot be undone)')
  p_delete.add_argument('profile', help='iccid or 1-based index from `list`')

  p_download = sub.add_parser('download', help='download a profile using QR code (format: LPA:1$rsp.truphone.com$QRF-SPEEDTEST)')
  p_download.add_argument('qr')
  p_download.add_argument('name')

  p_nickname = sub.add_parser('nickname', help='update the nickname for a profile')
  p_nickname.add_argument('profile', help='iccid or 1-based index from `list`')
  p_nickname.add_argument('name')

  args = parser.parse_args()

  lpa = HARDWARE.get_sim_lpa()
  if not lpa.is_euicc():
    raise SystemExit("no eUICC detected")
  if args.cmd == 'switch':
    iccid = resolve_iccid(lpa, args.profile)
    execute_and_process_notifications(lpa, lambda: lpa.switch_profile(iccid))
  elif args.cmd == 'delete':
    iccid = resolve_iccid(lpa, args.profile)
    confirm = input(f'are you sure you want to delete profile {iccid}? (y/N) ')
    if confirm == 'y':
      execute_and_process_notifications(lpa, lambda: lpa.delete_profile(iccid))
    else:
      print('cancelled')
      exit(0)
  elif args.cmd == 'download':
    execute_and_process_notifications(lpa, lambda: lpa.download_profile(args.qr, args.name))
  elif args.cmd == 'nickname':
    lpa.nickname_profile(resolve_iccid(lpa, args.profile), args.name)
  else:
    if args.cmd is None:
      parser.print_help()

View on GitHub (pinned to 516ec1e682)

Solutions

  1. Verify a physical eSIM-capable modem is present and enumerated (ls /dev/modem_at0, check dmesg for the modem)
  2. If using a plastic SIM, this tool cannot manage it — eSIM operations require an eUICC; use a carrier eSIM QR download instead
  3. Reboot/power-cycle the modem (or run the lte start script /dev/comma/lte/lte.sh start) and retry, since a hung modem can fail is_euicc()
  4. Confirm HARDWARE.get_sim_lpa() returns the LPA matching your actual modem type on this device

Example fix

# before
python -m openpilot.common.esim.esim list   # SystemExit: no eUICC detected

# after — check the modem is up first
import subprocess
subprocess.run(['/usr/comma/lte/lte.sh', 'start'], capture_output=True)
# verify the AT port exists, then retry
import os
assert os.path.exists('/dev/modem_at0'), 'modem AT port missing'
python -m openpilot.common.esim.esim list
Defensive patterns

Strategy: validation

Validate before calling

lpa = HARDWARE.get_sim_lpa()
if not lpa.is_euicc():
  raise SystemExit('this device/SIM has no eUICC; eSIM tools unavailable')

Type guard

def euicc_available() -> bool:
  try:
    return HARDWARE.get_sim_lpa().is_euicc()
  except Exception:
    return False

Prevention

When it happens

Trigger: Running any esim.py subcommand on hardware whose modem does not expose an eUICC: a physical plastic SIM in the slot, a modem without eSIM support, a missing/unresponsive modem (e.g. /dev/modem_at0 absent), or a device whose HARDWARE abstraction returns a non-eUICC LPA.

Common situations: Testing on a dev board or PC without a cellular modem; a device shipped with plastic SIM only; the modem is in a bad state so the eUICC inquiry fails; a typo/failure in udev so the AT serial device isn't present.

Related errors


AI-assisted analysis of commaai/openpilot@516ec1e682 (2026-08-15). Data as JSON: /api/errors/78d87ab21b9d541b. Report an issue: GitHub.