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
- Verify a physical eSIM-capable modem is present and enumerated (ls /dev/modem_at0, check dmesg for the modem)
- If using a plastic SIM, this tool cannot manage it — eSIM operations require an eUICC; use a carrier eSIM QR download instead
- 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()
- 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
- Gate all eSIM UI/automation behind an is_euicc() check at startup
- Confirm the modem AT device exists before launching esim tooling
- Power-cycle the modem and re-check before concluding hardware lacks eUICC
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
- AT command timed out
- Failed to open ISD-R after retries
- AT command failed: {line}
- Missing +CGLA response
- no profile at index {ref} (have {len(profiles)})
AI-assisted analysis of commaai/openpilot@516ec1e682 (2026-08-15).
Data as JSON: /api/errors/78d87ab21b9d541b.
Report an issue: GitHub.