Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Control Tesla vehicles from macOS via the Tesla Owner API using teslapy (auth, list cars, status, lock/unlock, climate, charging, location, and extras). Use when you want to check your car state or run safe remote commands. Designed for Parth Maniar (@officialpm) with local-only auth caching, confirmation gates for disruptive actions, and chat-friendly status output.
.claude/skills/sundial-org-my-tesla/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 171% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 412% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 782% | 0% |
Author: Parth Maniar — @officialpm
A practical Tesla control skill for Clawdbot built on teslapy.
TESLA_EMAIL env var set (your Tesla account email)bashTESLA_EMAIL="you@email.com" python3 {baseDir}/scripts/tesla.py auth
This opens a Tesla login URL. Log in, then paste the callback URL back into the CLI.
~/.tesla_cache.json (local only; best-effort chmod 0600)MY_TESLA_DEFAULT_CAR to a vehicle display name to pick a default car via env varpython3 {baseDir}/scripts/tesla.py default-car "Name" (writes ~/.my_tesla.json; best-effort chmod 0600)bash# List vehicles python3 {baseDir}/scripts/tesla.py list python3 {baseDir}/scripts/tesla.py list --json # machine-readable, privacy-safe # Version python3 {baseDir}/scripts/tesla.py version python3 {baseDir}/scripts/tesla.py --version # Debugging # If something fails unexpectedly, add --debug for a full traceback # (or set MY_TESLA_DEBUG=1) python3 {baseDir}/scripts/tesla.py --debug status --no-wake # Pick a car (optional) # --car accepts: exact name, partial name (substring match), or a 1-based index from `list` python3 {baseDir}/scripts/tesla.py --car "Model" status python3 {baseDir}/scripts/tesla.py --car 1 report # Set a default car (used when --car is not passed) python3 {baseDir}/scripts/tesla.py default-car "My Model 3" # One-line summary (best for chat) python3 {baseDir}/scripts/tesla.py summary python3 {baseDir}/scripts/tesla.py summary --no-wake # don't wake a sleeping car # Summary as JSON (privacy-safe) # Unlike `status --json`, this emits a small sanitized object (no location). # Includes `usable_level_percent` when the vehicle reports it. python3 {baseDir}/scripts/tesla.py summary --json python3 {baseDir}/scripts/tesla.py summary --json --raw-json # raw vehicle_data (may include location) # One-screen report (chat friendly, more detail) # Includes battery/charging/climate + (when available) TPMS tire pressures. # Includes "Usable battery" when the vehicle reports it (helpful for health/degradation). # Also includes a quick openings summary (doors/trunk/frunk/windows) when available. # When available, includes a compact seat heater summary line. # When the vehicle reports it, includes scheduled departure / preconditioning / off-peak charging status. python3 {baseDir}/scripts/tesla.py report python3 {baseDir}/scripts/tesla.py report --no-wake # Detailed status python3 {baseDir}/scripts/tesla.py status python3 {baseDir}/scripts/tesla.py status --no-wake python3 {baseDir}/scripts/tesla.py status --summary # include one-line summary + detailed output python3 {baseDir}/scripts/tesla.py --car "My Model 3" status # JSON output (prints ONLY JSON; good for piping/parsing) # NOTE: `status --json` outputs *raw* `vehicle_data`, which may include location/drive_state. # Prefer `summary --json` (sanitized) or `report --json` (sanitized) unless you explicitly need the raw payload. python3 {baseDir}/scripts/tesla.py summary --json # sanitized summary object (no location) python3 {baseDir}/scripts/tesla.py report --json # sanitized report object (no location; includes scheduled charging + charge port state) python3 {baseDir}/scripts/tesla.py status --json # raw vehicle_data (may include location) python3 {baseDir}/scripts/tesla.py report --json --raw-json # raw vehicle_data (may include location) python3 {baseDir}/scripts/tesla.py summary --json --raw-json # raw vehicle_data (may include location) python3 {baseDir}/scripts/tesla.py charge status --json # includes usable battery + (when charging) power details (kW/V/A) # Lock / unlock python3 {baseDir}/scripts/tesla.py lock python3 {baseDir}/scripts/tesla.py unlock # Climate (status is read-only) python3 {baseDir}/scripts/tesla.py climate status python3 {baseDir}/scripts/tesla.py climate status --no-wake python3 {baseDir}/scripts/tesla.py climate on python3 {baseDir}/scripts/tesla.py climate off python3 {baseDir}/scripts/tesla.py climate defrost on python3 {baseDir}/scripts/tesla.py climate defrost off python3 {baseDir}/scripts/tesla.py climate temp 72 # default: °F python3 {baseDir}/scripts/tesla.py climate temp 22 --celsius # Charging python3 {baseDir}/scripts/tesla.py charge status python3 {baseDir}/scripts/tesla.py charge status --no-wake python3 {baseDir}/scripts/tesla.py charge start --yes python3 {baseDir}/scripts/tesla.py charge stop --yes python3 {baseDir}/scripts/tesla.py charge limit 80 --yes # 50–100 python3 {baseDir}/scripts/tesla.py charge amps 16 --yes # 1–48 (conservative guardrail) # Scheduled charging (set/off are safety gated) python3 {baseDir}/scripts/tesla.py scheduled-charging status python3 {baseDir}/scripts/tesla.py scheduled-charging status --no-wake python3 {baseDir}/scripts/tesla.py scheduled-charging set 23:30 --yes python3 {baseDir}/scripts/tesla.py scheduled-charging off --yes # Scheduled departure (read-only) # Shows scheduled departure, preconditioning, and off-peak charging flags (when the vehicle reports them). python3 {baseDir}/scripts/tesla.py scheduled-departure status python3 {baseDir}/scripts/tesla.py scheduled-departure status --no-wake python3 {baseDir}/scripts/tesla.py --json scheduled-departure status # Location (approx by default; use --yes for precise coordinates) python3 {baseDir}/scripts/tesla.py location python3 {baseDir}/scripts/tesla.py location --no-wake python3 {baseDir}/scripts/tesla.py location --digits 1 # coarser rounding python3 {baseDir}/scripts/tesla.py location --digits 3 # a bit more precise (still approximate) python3 {baseDir}/scripts/tesla.py location --yes # Tire pressures (TPMS) python3 {baseDir}/scripts/tesla.py tires python3 {baseDir}/scripts/tesla.py tires --no-wake # Openings (doors/trunks/windows) python3 {baseDir}/scripts/tesla.py openings python3 {baseDir}/scripts/tesla.py openings --no-wake python3 {baseDir}/scripts/tesla.py openings --json # Trunk / frunk (safety gated) python3 {baseDir}/scripts/tesla.py trunk trunk --yes python3 {baseDir}/scripts/tesla.py trunk frunk --yes # Windows python3 {baseDir}/scripts/tesla.py windows status python3 {baseDir}/scripts/tesla.py windows status --no-wake python3 {baseDir}/scripts/tesla.py windows status --json # Windows (safety gated) python3 {baseDir}/scripts/tesla.py windows vent --yes python3 {baseDir}/scripts/tesla.py windows close --yes # Seat heaters python3 {baseDir}/scripts/tesla.py seats status python3 {baseDir}/scripts/tesla.py seats status --no-wake python3 {baseDir}/scripts/tesla.py seats status --json # Seat heaters (safety gated) # seat: driver|passenger|rear-left|rear-center|rear-right|3rd-left|3rd-right (or 0–6) # level: 0–3 (0=off) python3 {baseDir}/scripts/tesla.py seats set driver 3 --yes # Sentry Mode (status is read-only; on/off safety gated) python3 {baseDir}/scripts/tesla.py sentry status python3 {baseDir}/scripts/tesla.py sentry status --no-wake python3 {baseDir}/scripts/tesla.py sentry on --yes python3 {baseDir}/scripts/tesla.py sentry off --yes # Charge port door python3 {baseDir}/scripts/tesla.py charge-port status python3 {baseDir}/scripts/tesla.py charge-port status --no-wake python3 {baseDir}/scripts/tesla.py charge-port status --json # Mileage tracking (odometer) — local SQLite python3 {baseDir}/scripts/tesla.py mileage init python3 {baseDir}/scripts/tesla.py mileage record --no-wake --auto-wake-after-hours 24 python3 {baseDir}/scripts/tesla.py mileage status python3 {baseDir}/scripts/tesla.py mileage export --format csv python3 {baseDir}/scripts/tesla.py mileage export --format csv --since-days 7 python3 {baseDir}/scripts/tesla.py mileage export --format json python3 {baseDir}/scripts/tesla.py mileage export --format json --since-ts 1738195200 # Charge port door open/close (safety gated) python3 {baseDir}/scripts/tesla.py charge-port open --yes python3 {baseDir}/scripts/tesla.py charge-port close --yes # Fun / attention-grabbing python3 {baseDir}/scripts/tesla.py honk --yes python3 {baseDir}/scripts/tesla.py flash --yes
Some actions require an explicit confirmation flag:
unlock, charge start|stop|limit|amps, trunk, windows, seats set, sentry on|off, honk, flash, charge-port open|close, and scheduled-charging set|off require --yeslocation is approximate by default; add --yes for precise coordinates (or --digits N to control rounding)~/.tesla_cache.json).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,770 | 16,528 | +338% | 1 | 1 | 0% | 495 | 4,601 | +829% | 0 | 0 | — |
case-02 | fail→fail | 5,482 | 5,815 | +6% | 1 | 1 | 0% | 776 | 2,830 | +265% | 0 | 0 | — |
case-03 | fail→fail | 13,284 | 7,130 | -46% | 1 | 1 | 0% | 2,682 | 2,906 | +8% | 0 | 0 | — |
case-04 | fail→pass | 11,940 | 3,562 | -70% | 1 | 1 | 0% | 1,852 | 3,095 | +67% | 0 | 0 | — |
case-05 | fail→pass | 9,007 | 3,091 | -66% | 1 | 1 | 0% | 1,458 | 3,051 | +109% | 0 | 0 | — |
case-06 | fail→fail | 10,599 | 5,378 | -49% | 1 | 1 | 0% | 1,759 | 2,747 | +56% | 0 | 0 | — |
case-07 | fail→fail | 3,320 | 9,458 | +185% | 1 | 1 | 0% | 479 | 3,379 | +605% | 0 | 0 | — |
case-08 | fail→fail | 4,836 | 5,206 | +8% | 1 | 1 | 0% | 688 | 2,798 | +307% | 0 | 0 | — |
case-09 | fail→fail | 3,092 | 5,951 | +92% | 1 | 1 | 0% | 397 | 2,891 | +628% | 0 | 0 | — |
case-10 | fail→pass | 7,250 | 4,936 | -32% | 1 | 1 | 0% | 1,209 | 3,274 | +171% | 0 | 0 | — |
case-11 | fail→fail | 3,348 | 6,129 | +83% | 1 | 1 | 0% | 429 | 2,823 | +558% | 0 | 0 | — |
case-12 | pass→pass | 9,410 | 8,486 | -10% | 1 | 1 | 0% | 1,705 | 4,124 | +142% | 0 | 0 | — |
case-13 | fail→pass | 5,158 | 8,697 | +69% | 1 | 1 | 0% | 749 | 3,832 | +412% | 0 | 0 | — |
case-14 | fail→fail | 3,319 | 7,977 | +140% | 1 | 1 | 0% | 474 | 3,081 | +550% | 0 | 0 | — |
case-15 | fail→pass | 2,925 | 5,297 | +81% | 1 | 1 | 0% | 373 | 3,289 | +782% | 0 | 0 | — |
case-16 | fail→pass | 3,488 | 5,287 | +52% | 1 | 1 | 0% | 442 | 2,887 | +553% | 0 | 0 | — |
case-17 | fail→pass | 9,782 | 2,064 | -79% | 1 | 1 | 0% | 1,449 | 2,810 | +94% | 0 | 0 | — |
case-18 | fail→pass | 9,260 | 6,834 | -26% | 1 | 1 | 0% | 1,498 | 3,639 | +143% | 0 | 0 | — |
case-19 | fail→fail | 6,741 | 5,692 | -16% | 1 | 1 | 0% | 1,021 | 2,833 | +177% | 0 | 0 | — |
case-20 | fail→fail | 3,275 | 5,597 | +71% | 1 | 1 | 0% | 461 | 2,813 | +510% | 0 | 0 | — |
case-21 | fail→pass | 4,147 | 5,253 | +27% | 1 | 1 | 0% | 580 | 3,328 | +474% | 0 | 0 | — |
case-22 | pass→pass | 9,974 | 9,276 | -7% | 1 | 1 | 0% | 1,589 | 4,003 | +152% | 0 | 0 | — |
case-23 | pass→pass | 9,610 | 6,246 | -35% | 1 | 1 | 0% | 1,725 | 3,478 | +102% | 0 | 0 | — |
case-24 | fail→fail | 12,285 | 5,849 | -52% | 1 | 1 | 0% | 2,242 | 2,765 | +23% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 12 counted toward the lift figure. The other 12 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +38 percentage points is the difference between those two pass rates over the 12 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.