쓸모 쓸모연구소 · 실전 노트
제 740 호이번 주 새 글 260 편2026 · 10 · 30
AI 에이전트⁠·비서
Grok · 테슬라 · GitHub

테슬라 차량 제어 에이전트 만들기, 그록 API와 플릿 API 연결

"테슬라 충전 포트 열어 줘"라고 채팅창에 치면 실제 내 차의 충전 포트가 열리는 AI 에이전트를 직접 만들 수 있습니다. 이 글은 테슬라 차량 제어 에이전트 만들기를 xAI 그록(Grok) API 키 발급부터 테슬라 공식 플릿 API(Fleet API) 앱 등록, 가상 키 페어링, 스트림릿 채팅 앱 실행, 다 쓴 뒤 정리까지 단계별로 설명합니다. 차량 소프트웨어는 건드리지 않고 테슬라가 외부 개발자에게 열어 둔 공식 통로만 씁니다.

테슬라 차량 제어 에이전트 만들기, 그록 API와 플릿 API 연결 삽화
삽화 · 쓸모연구소

이 실습은 실제 차량에 명령을 보낸다. 차가 안전한 곳에 주차돼 있고 주변에 사람이 없을 때만 따라 한다. AI는 말을 잘못 알아듣고 다른 명령을 실행하거나, 실행하지 않고 했다고 답할 수 있다.

원리: 앵무새에게 리모컨 버튼을 쥐여 준다

LLM은 다음 단어를 고르는 앵무새

GPT나 그록 같은 대형 언어 모델(LLM)은 데이터의 패턴을 학습해 흉내 내는 기술입니다. 다음에 올 만한 단어를 확률이 높은 순으로 하나씩 골라 답을 만듭니다.

그래서 "오늘 서울 날씨"를 물어도 실제로 찾아보지 않습니다. 학습한 패턴대로 말을 이어 붙일 뿐이고, 때로는 그럴듯한 거짓말(할루시네이션)을 합니다. 2026년 2월에 그록 4.1 모델에 서울 날씨를 물었더니 2024년 10월 날씨가 대체로 맑다는 식으로 답한 사례가 있습니다. 아래 Step 2에서 직접 확인해 볼 수 있습니다.

챗GPT는 엔진에 도구를 붙인 서비스

GPT는 엔진이고, 챗GPT는 그 엔진에 날씨 검색, 계산, 유튜브 검색, 코드 실행 같은 도구를 붙인 서비스입니다. 날씨 질문이 들어오면 앵무새가 직접 답하지 않습니다. 개발자가 미리 연결해 둔 날씨 검색 버튼을 누르고, 돌아온 결과를 보고 답을 만듭니다.

이번에 만드는 것

그록이라는 앵무새에게 테슬라를 조종하는 리모컨 버튼(도구)을 쥐여 줍니다. 사용자가 "테슬라 에어컨 켜줘"라고 하면 그록이 실제 에어컨 켜기 버튼을 누르고, 차가 작동하면 켰다고 보고합니다. 시뮬레이션이 아니라 실제 내 차를 움직이는 에이전트입니다.

전체 흐름과 준비물

다섯 단계 구성

  • Step 1. 그록 API 키 발급
  • Step 2. 키 작동 시험(구글 코랩)
  • Step 3. 테슬라 앱 사전 준비(암호 키 쌍 만들기, GitHub Pages에 공개 키 올리기)
  • Step 4. 테슬라 개발자 사이트에서 앱 등록, 토큰 발급, 파트너 등록
  • Step 5. 앱 실행(대시보드, 가상 키, 채팅 에이전트)

테슬라 공식 SDK 설치 과정이 조금 복잡하니, 처음이라면 이 글을 끝까지 한 번 읽고 "할 수 있겠다" 싶을 때 처음부터 따라 하는 편이 좋습니다.

준비물

  • 테슬라 차량과 테슬라 모바일 앱 계정. 개발자 사이트에도 같은 계정으로 로그인하고, 계정에 2단계 인증(MFA)이 켜져 있어야 합니다.
  • 테슬라 앱이 깔린 스마트폰(가상 키 QR 코드 스캔용)
  • 맥 또는 윈도우 컴퓨터. 테슬라 공식 SDK가 맥과 리눅스 기준이라 윈도우는 WSL(윈도우 안에서 리눅스를 돌리는 기능)이 필요합니다.
  • 구글 계정(코랩, 드라이브)
  • GitHub 계정. 처음이면 구글 계정으로 가입하면 간단합니다.
  • xAI 계정(그록 API 키 발급용)
  • 설치할 프로그램: 파이썬, VS Code, Go 언어

비용

  • 테슬라 플릿 API는 쓴 만큼 내는 방식입니다. 공식 문서 기준으로 계정마다 매달 10달러 할인이 붙어, 개인이 차 한두 대로 시험하는 정도는 대부분 이 안에서 해결됩니다.
  • 요청 종류(차량 데이터 조회, 명령, 차 깨우기, 스트리밍)마다 단가가 다르고, 절전 모드에 들어간 차를 깨우는 요청이 가장 비쌉니다. 단가는 developer.tesla.com 첫 화면의 요금표에서, 월 한도 설정은 요금⁠·한도(Billing and Limits) 문서에서 확인합니다.
  • 한 사례로 2주 동안 실습했을 때 약 5,000원이 들었습니다.
  • 그록(xAI) API는 별도 요금입니다. xAI 콘솔에서 크레딧과 모델별 단가를 시작 전에 확인합니다.

읽는 법

맥 기준으로 진행합니다. 윈도우는 Step 5의 "윈도우 사용자" 부분을 함께 봅니다. 이 실습은 개인 키, 클라이언트 시크릿, 토큰, API 키를 다룹니다. 화면 공유나 업로드로 새지 않게 조심합니다.

Step 1. 그록 API 키 발급

  1. 브라우저에서 xAI 콘솔(console.x.ai)에 접속해 로그인합니다.
    • 확인: 콘솔 첫 화면이 열립니다.
  2. 처음이면 안내에 따라 팀 이름 등 필요한 정보를 입력하고, 결제 수단 등록이나 크레딧 충전을 마칩니다.
    • 확인: 콘솔 왼쪽 메뉴에 API Keys가 보입니다.
  3. API Keys에서 "Create API key"를 누르고 키 이름을 정해 만듭니다.
    • 확인: "xai-"로 시작하는 키 문자열이 만들어집니다.
  4. 키를 복사해 안전한 곳에 보관합니다.
    • 확인: 키를 다른 사람에게 보이지 않습니다.
    • 주의: API 키는 신분증 역할이라 유출되면 남이 내 크레딧으로 그록을 씁니다. 화면이 공개되는 상태라면 키를 가립니다.

Step 2. 그록 API 키 시험(구글 코랩)

구글 코랩(Colab)은 브라우저에서 파이썬 코드를 바로 실행하는 구글의 무료 노트입니다. 내 컴퓨터에 아무것도 깔지 않고 키가 제대로 작동하는지 확인할 수 있습니다.

  1. colab.research.google.com에 접속해 "새 노트"를 만듭니다. 남이 공유한 노트를 쓴다면 "파일 > 드라이브에 사본 저장"으로 내 사본을 만들어 씁니다.
    • 확인: 코드를 입력할 수 있는 셀이 보입니다.
  2. 첫 셀에 패키지 설치 코드를 넣고 Shift+Enter를 누릅니다. 설치 대상은 랭체인(langchain)과 랭체인 xAI(langchain-xai) 두 가지입니다.
프롬프트
!pip install -qU langchain langchain-xai
  • 확인: 셀 왼쪽 재생 버튼이 돌다가 멈추고, 초록색 체크와 실행 시간(초)이 표시됩니다.
  1. 다음 셀에 아래 코드를 넣고 키 자리에 Step 1의 API 키를 붙여 넣은 뒤 Shift+Enter를 누릅니다.
프롬프트
import os
os.environ["XAI_API_KEY"] = "여기에_xAI_API_키"

from langchain_xai import ChatXAI
llm = ChatXAI(model="grok-4-1-fast-non-reasoning")
print(llm.invoke("오늘 서울 날씨 어때").content)
  • 확인: 답변이 출력되면 API 키가 정상입니다. 모델 이름은 xAI 콘솔의 Models 목록에서 지금 쓸 수 있는 이름으로 바꿔도 됩니다.
  1. 답변 내용을 봅니다.
    • 확인: 날짜나 날씨를 지어낸 답이 나올 가능성이 큽니다. LLM은 실제 날씨를 찾아보지 않기 때문입니다.
    • 팁: 답이 오지 않고 오류가 나면 키를 잘못 붙였거나 크레딧이 없는 경우입니다. Step 1로 돌아가 키를 다시 만듭니다.
  2. (선택) 셀 사이에 마우스를 대고 "+ 코드"를 눌러 새 셀을 만들고, 질문을 "API가 뭐야"로 바꿔 실행해 봅니다.
    • 확인: API를 설명하는 답이 옵니다.
  3. 도구(함수)와 에이전트를 만들어 실행합니다. 이 도구는 실제 날씨를 찾는 대신 정해진 문구를 돌려줍니다. 에이전트가 도구를 쓰는지 확인하기 위한 시험입니다.
프롬프트
from langchain.tools import tool
from langchain.agents import create_agent

@tool
def get_weather(city: str) -> str:
    """도시의 현재 날씨를 알려 준다."""
    return "서울의 날씨는 현재 눈이 오고 영하 2도에 미세먼지가 매우 나쁩니다."

agent = create_agent(
    model=llm,
    tools=[get_weather],
    system_prompt="너는 날씨 비서야. 날씨는 반드시 get_weather 도구로 확인하고 답해.",
)
result = agent.invoke({"messages": [{"role": "user", "content": "서울 날씨 어때요"}]})
print(result["messages"][-1].content)
  • 확인: "서울은 지금 눈이 오고 기온은 영하 2도로 춥고 미세먼지가 매우 나쁩니다" 같은 답이 나옵니다. 그록이 스스로 지어내지 않고 도구 결과를 보고 답했다는 뜻입니다. 이 구조에서 날씨 도구 자리에 테슬라 리모컨을 넣는 것이 이번 실습의 핵심입니다.

Step 3. 테슬라 앱 사전 준비

테슬라 차량은 외부 앱이 보내는 명령에 디지털 서명이 붙어 있는지 확인합니다. 그래서 내 앱 전용 암호 키 한 쌍(개인 키와 공개 키)을 만들고, 공개 키를 인터넷 주소에 올려 테슬라가 확인할 수 있게 해야 합니다.

3-1. 프로그램 설치와 작업 폴더

  1. 컴퓨터에 파이썬(python.org)과 VS Code(code.visualstudio.com)를 설치합니다.
    • 확인: 터미널에서 python3 --version을 치면 버전이 나옵니다.
  2. 바탕화면에 tesla_agent 폴더를 만듭니다.
    • 확인: 폴더가 보입니다.
  3. VS Code를 켜고 "파일 > 폴더 열기"로 tesla_agent 폴더를 엽니다.
    • 확인: VS Code 왼쪽에 그 폴더가 열립니다.
    • 팁: 화면을 반으로 나눠 왼쪽에 VS Code, 오른쪽에 이 글을 띄워 두면 편합니다.
  4. VS Code 위쪽 "터미널 > 새 터미널"을 누릅니다.
    • 확인: 아래쪽에 터미널이 열리고 현재 위치가 tesla_agent 폴더입니다.

3-2. 가상환경 만들기

순서는 가상환경 만들기, 켜기, 패키지 설치, 파일 실행입니다. 가상환경(이 폴더 전용 파이썬 설치 공간) 없이 설치하면 컴퓨터 전체에 패키지가 깔려 프로젝트가 끝난 뒤에도 남습니다.

  1. 터미널에 아래 명령을 입력하고 Enter를 누릅니다(맥은 python3로 쳐야 할 수도 있습니다).
명령어
python -m venv venv
  • 확인: 잠시 뒤 왼쪽에 venv 폴더가 생깁니다.
  1. 가상환경을 켭니다. 맥은 source venv/bin/activate, 윈도우는 venv\Scripts\activate를 입력합니다.
    • 확인: 터미널 줄 맨 앞에 (venv)가 표시됩니다.
  2. 암호 키를 만드는 패키지를 설치합니다.
명령어
pip install cryptography
  • 확인: 설치가 끝나고 오류가 없습니다.

3-3. 키 쌍 만들기

  1. VS Code 왼쪽 폴더에서 새 파일 아이콘을 눌러 create_keys.py를 만들고 아래 코드를 붙여 넣은 뒤 Ctrl+S(맥은 Cmd+S)로 저장합니다. 테슬라가 요구하는 prime256v1(SECP256R1) 타원곡선 키를 만듭니다.
프롬프트
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization

key = ec.generate_private_key(ec.SECP256R1())
with open("private-key.pem", "wb") as f:
    f.write(key.private_bytes(serialization.Encoding.PEM,
        serialization.PrivateFormat.TraditionalOpenSSL,
        serialization.NoEncryption()))
with open("public-key.pem", "wb") as f:
    f.write(key.public_key().public_bytes(serialization.Encoding.PEM,
        serialization.PublicFormat.SubjectPublicKeyInfo))
print("키 생성 완료")
  1. 터미널에서 파일을 실행합니다.
명령어
python create_keys.py
  • 확인: "키 생성 완료"가 나오고 왼쪽에 private-key.pem(개인 키)과 public-key.pem(공개 키)이 생깁니다.
  • 주의: 공개 키는 공개해도 되지만 개인 키는 절대 유출되면 안 됩니다. 개인 키가 있으면 누구든 내 앱 이름으로 차에 서명된 명령을 보낼 수 있습니다.

터미널에 익숙하다면 공식 문서의 openssl 명령으로 같은 키를 만들 수도 있습니다. openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem 다음에 openssl ec -in private-key.pem -pubout -out public-key.pem을 실행합니다.

3-4. GitHub 저장소에 공개 키 올리기

테슬라는 앱의 도메인(인터넷 주소) 아래 정해진 경로에서 공개 키를 찾습니다. 개인 도메인이 없어도 GitHub Pages(GitHub가 무료로 주는 정적 웹사이트 주소)를 쓰면 됩니다.

  1. github.com에 로그인합니다. 처음이면 오른쪽 위 "Sign up"으로 가입합니다.
    • 확인: 로그인 상태가 됩니다.
  2. 오른쪽 위 "+" 버튼에서 "New repository"를 누릅니다.
    • 확인: 새 저장소 만들기 화면이 열립니다.
  3. 저장소 이름에 내아이디.github.io를 입력합니다. 앞부분은 왼쪽에 보이는 내 GitHub 아이디와 똑같아야 합니다.
    • 확인: 이름이 아이디.github.io 형식입니다.
  4. 공개 범위(Visibility)는 Public 그대로 두고, "Add README"를 켠 뒤 "Create repository"를 누릅니다.
    • 확인: 저장소가 만들어집니다.
  5. 저장소 화면에서 "Add file > Create new file"을 누르고, 파일 이름 칸에 아래 경로를 그대로 입력합니다. 슬래시(/)를 치면 폴더가 저절로 만들어집니다.
프롬프트
.well-known/appspecific/com.tesla.3p.public-key.pem
  1. VS Code에서 public-key.pem을 열어 내용 전체(BEGIN PUBLIC KEY 줄부터 END PUBLIC KEY 줄까지)를 복사해 GitHub 파일 내용 칸에 붙여 넣습니다.
    • 확인: 공개 키 내용이 들어갑니다. 개인 키가 아닌지 다시 확인합니다.
  2. 오른쪽 위 "Commit changes"를 누르고, 뜨는 창에서 한 번 더 "Commit changes"를 누릅니다.
    • 확인: 공개 키 파일이 저장소에 만들어집니다.
  3. 다시 "Add file > Create new file"을 누르고 파일 이름을 .nojekyll로 입력한 뒤 내용 없이 커밋합니다. 맨 앞의 점까지 반드시 붙입니다.
    • 확인: 내용 없는 .nojekyll 파일이 생깁니다. GitHub Pages는 기본으로 점으로 시작하는 폴더(.well-known)를 숨기는데, 이 파일이 있으면 그대로 공개합니다.

3-5. GitHub Pages 배포와 확인

  1. 저장소 위쪽 "Settings"를 누르고 왼쪽 메뉴에서 "Pages"를 엽니다.
    • 확인: Pages 설정이 보입니다.
  2. Branch가 main인지 확인합니다. None이면 main으로 바꾸고 "Save"를 누릅니다.
    • 확인: 1~2분 뒤 "Your site is live"와 주소가 표시됩니다. 안 보이면 새로고침합니다.
  3. 브라우저 새 탭에 아래 주소를 아이디만 바꿔 입력합니다.
프롬프트
https://내아이디.github.io/.well-known/appspecific/com.tesla.3p.public-key.pem
  • 확인: 공개 키 파일이 내려받아지거나 화면에 키 내용이 보이면 Step 3 성공입니다. 404가 뜨면 .nojekyll 파일과 경로 철자를 확인하고 1~2분 더 기다립니다.

Step 4. 테슬라 앱 등록과 토큰 발급

순서는 앱 등록, 사용자 토큰 발급, 토큰 자동 갱신, 파트너 등록입니다.

4-1. 개발자 사이트에서 앱 등록

  1. developer.tesla.com에 접속해 테슬라 앱에서 쓰던 계정으로 로그인합니다.
    • 확인: 아이디⁠·비밀번호 다음에 2단계 인증 코드(OTP)를 요구합니다. 계정에 2단계 인증이 꺼져 있다면 테슬라 계정 설정에서 먼저 켭니다.
  2. 앱 만들기(애플리케이션 액세스 요청)를 시작하고 약관 동의에 체크합니다.
    • 확인: 체크가 표시됩니다.
  3. 법인이 아니라 개인으로 쓸 때는 개인 사용을 고르고 "다음"을 누릅니다.
    • 확인: 애플리케이션 세부 정보 입력 화면이 열립니다.
  4. 애플리케이션 이름, 설명(예: "내 차 모니터링 앱"), 사용 목적(예: "개인 차량 모니터링과 원격 제어 시험")을 입력하고 "다음"을 누릅니다.
    • 확인: 클라이언트 세부 정보(OAuth) 입력 화면으로 넘어갑니다. 이미 있는 앱 이름은 거절될 수 있으니 나만의 이름을 씁니다.
  5. 인증 방식은 기본으로 선택된 인증 코드(authorization code)와 머신 투 머신(client credentials) 방식을 그대로 둡니다.
    • 확인: 두 방식이 선택돼 있습니다.
  6. "허용되는 출처 URL" 칸에 https://내아이디.github.io를 입력합니다.
    • 확인: Step 3에서 만든 GitHub Pages 주소와 같습니다.
  7. "허용되는 리디렉션 URI" 칸에 http://localhost:3000/callback을 입력하고 "다음"을 누릅니다.
    • 확인: 권한 범위 선택 화면이 열립니다.
  8. 권한 범위에서 프로필 정보, 차량 정보, 차량 위치, 차량 명령, 충전 정보 다섯 개를 체크합니다.
    • 확인: 다섯 개가 체크돼 있습니다.
  9. 결제 정보 칸이 나오면 월 사용 한도를 5,000원 안팎처럼 낮게 정해 둡니다.
    • 확인: 한도가 설정돼, 코드 실수로 요청이 폭주해도 요금이 크게 나오지 않습니다.
  10. "제출하기"를 누릅니다.
    • 확인: 완료 화면으로 넘어가고 앱 목록에 내 앱이 보입니다.
  11. 앱의 "세부 내역 확인"을 눌러 클라이언트 ID(고객 아이디)와 클라이언트 시크릿(고객 번호)을 확인합니다.
    • 확인: 두 값이 보입니다. 시크릿은 비밀번호처럼 다룹니다.

4-2. 사용자 토큰 발급

토큰은 "이 사용자가 이 앱에 자기 차를 맡기는 데 동의했다"는 증표입니다. 내 컴퓨터에 작은 로그인 서버를 띄워 테슬라 로그인 화면으로 보내고, 돌아온 코드를 토큰으로 바꿉니다.

  1. 필요한 패키지를 설치합니다. FastAPI(파이썬 웹 서버 도구), uvicorn(서버 실행기), requests(인터넷 요청 도구), python-dotenv(.env 파일 읽기 도구)입니다.
명령어
pip install fastapi uvicorn requests python-dotenv
  • 확인: 설치가 끝나고 오류가 없습니다.
  1. tesla_agent 폴더 바로 아래에 .env 파일을 만들고 아래 내용을 채웁니다. 키와 토큰을 코드에 직접 쓰지 않고 이 파일에만 두면, AI 에이전트에게 비밀값이 그대로 넘어가 새는 일을 줄일 수 있습니다.
프롬프트
TESLA_CLIENT_ID=여기에_클라이언트_ID
TESLA_CLIENT_SECRET=여기에_클라이언트_시크릿
TESLA_DOMAIN=내아이디.github.io
XAI_API_KEY=여기에_xAI_API_키
  • 확인: 저장했고, 클라이언트 ID와 시크릿 자리가 서로 바뀌지 않았습니다. 두 값을 바꿔 붙이는 실수가 가장 흔합니다.
  1. 로그인 서버 코드 oauth.py를 만듭니다. 직접 짜기 어렵다면 아래 요청을 챗GPT나 클로드, 제미나이에 그대로 붙여 넣어 코드를 받습니다.
프롬프트
테슬라 플릿 API용 OAuth 로그인 서버를 FastAPI로 만들어 줘. 파일 이름은 oauth.py.
- .env에서 TESLA_CLIENT_ID, TESLA_CLIENT_SECRET을 읽어
- http://localhost:3000 첫 화면에 "테슬라 로그인 & 토큰 발급" 버튼을 보여 줘
- 버튼을 누르면 https://auth.tesla.com/oauth2/v3/authorize 로 보내. response_type=code, redirect_uri=http://localhost:3000/callback, scope는 "openid offline_access user_data vehicle_device_data vehicle_location vehicle_cmds vehicle_charging_cmds", state는 무작위 값
- /callback 에서 받은 code를 https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token 에 grant_type=authorization_code 로 보내 토큰으로 바꿔. audience는 https://fleet-api.prd.na.vn.cloud.tesla.com
- 받은 access_token, refresh_token, expires_in과 발급 시각을 tokens.json에 저장하고 "인증 성공"을 보여 줘
- uvicorn으로 3000번 포트에서 실행되게 if __name__ == "__main__" 부분도 넣어 줘
  • 확인: 받은 코드를 oauth.py로 저장했습니다.
  1. 터미널에서 서버를 실행합니다(python oauth.py).
    • 확인: 터미널에 서버 시작 메시지와 http://localhost:3000이 나옵니다.
  2. 그 주소를 Cmd 또는 Ctrl을 누른 채 클릭해 엽니다.
    • 확인: "테슬라 로그인 & 토큰 발급" 버튼이 있는 페이지가 열립니다.
  3. 버튼을 누르고 테슬라 계정으로 로그인합니다.
    • 확인: 앱에 줄 권한을 고르는 화면이 나옵니다.
  4. 화면의 권한 항목을 모두 선택하고 "Allow(허용)"를 누릅니다.
    • 확인: "인증 성공"이 뜨고 VS Code 왼쪽에 tokens.json 파일이 생깁니다.
  5. 터미널을 클릭하고 Ctrl+C를 눌러 서버를 끕니다.
    • 확인: 터미널이 다시 명령을 받을 수 있는 상태가 됩니다.

한국 차량은 북미⁠·아시아태평양 리전(fleet-api.prd.na.vn.cloud.tesla.com)을 씁니다. 유럽⁠·중동⁠·아프리카는 eu 주소, 중국은 별도 주소입니다.

4-3. 토큰 자동 갱신(토큰 매니저)

액세스 토큰은 발급 뒤 8시간이 지나면 만료됩니다. 매번 다시 로그인하지 않도록, 만료가 가까우면 리프레시 토큰으로 새 토큰을 받는 코드를 둡니다.

  1. token_manager.py를 만듭니다. AI에게 줄 요청 예시입니다.
프롬프트
token_manager.py를 만들어 줘. tokens.json을 읽어서 액세스 토큰이 만료 10분 전이거나 지났으면 https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token 에 grant_type=refresh_token, client_id, refresh_token을 보내 새 토큰을 받아 tokens.json을 갱신해 줘. 응답에 새 refresh_token이 오면 그것으로 바꿔 저장해. 다른 파일에서 get_access_token() 함수로 쓸 수 있게 하고, 직접 실행하면 "사용 가능한 토큰"과 OK를 출력해 줘. client_id는 .env에서 읽어.
  1. 터미널에서 python token_manager.py를 실행합니다.
    • 확인: "사용 가능한 토큰"과 OK가 출력되면 4-3 완료입니다.

4-4. 파트너 등록(도메인 등록)

앱을 실제로 쓰려면 리전마다 한 번 파트너 등록을 해야 합니다. 테슬라가 내 도메인의 공개 키를 확인하고 앱을 그 리전에 등록하는 절차입니다.

  1. register_partner.py를 만듭니다. AI에게 줄 요청 예시입니다.
프롬프트
register_partner.py를 만들어 줘. .env의 TESLA_CLIENT_ID, TESLA_CLIENT_SECRET, TESLA_DOMAIN을 읽어.
1) https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token 에 grant_type=client_credentials, scope="openid vehicle_device_data vehicle_cmds vehicle_charging_cmds vehicle_location", audience=https://fleet-api.prd.na.vn.cloud.tesla.com 로 파트너 토큰을 받아
2) 그 토큰으로 https://fleet-api.prd.na.vn.cloud.tesla.com/api/1/partner_accounts 에 {"domain": TESLA_DOMAIN} 을 POST 해
3) 성공하면 "성공적으로 도메인이 등록됐습니다", 실패하면 상태 코드와 응답 내용을 그대로 출력해 줘
  1. 터미널에서 python register_partner.py를 실행합니다.
    • 확인: "성공적으로 도메인이 등록됐습니다"가 나오면 완료입니다.
    • 팁: 실패하면 출력된 오류를 봅니다. 인증 오류면 .env의 시크릿을 다시 복사해 붙여 넣고 저장한 뒤 같은 명령을 다시 실행합니다. 공개 키를 찾지 못했다는 오류면 Step 3의 30번 주소가 열리는지 확인합니다.

Step 5. 앱 실행

5-1. 대시보드로 연결 확인

채팅 에이전트 전에, 차량 정보를 읽어 오는지부터 확인합니다.

  1. dashboard.py를 만듭니다. AI에게 줄 요청 예시입니다.
프롬프트
dashboard.py를 스트림릿이 아니라 FastAPI로 간단히 만들어 줘. token_manager.py의 get_access_token()으로 토큰을 받아 https://fleet-api.prd.na.vn.cloud.tesla.com/api/1/vehicles 로 내 차 목록을 가져오고, 첫 번째 차의 vehicle_data에서 배터리 잔량, 실내 온도, 주행거리, 잠금 상태, 타이어 공기압을 보여 줘. 차가 잠들어 있으면 wake_up을 한 번만 보내고 깨어날 때까지 기다려. 화면은 60초마다 새로고침하고 8888번 포트에서 실행해 줘.
  1. 터미널에서 python dashboard.py를 실행하고, 나온 http://localhost:8888 주소를 엽니다.
    • 확인: 차를 깨우는 동안 잠시 대기 화면이 보이다가 배터리, 실내 온도, 주행거리 같은 차량 정보가 나타납니다.
    • 주의: 데이터 요청도 건마다 요금이 붙고, 잠든 차를 깨우는 요청은 특히 비쌉니다. 새로고침 간격을 몇 초 단위로 짧게 두지 않습니다.
  2. 대시보드가 잘 나오면 터미널에서 Ctrl+C로 서버를 끕니다.
    • 확인: 서버가 종료됩니다.
  3. 테슬라 개발자 사이트의 내 앱에서 "애플리케이션 사용량" 탭을 열고 새로고침합니다.
    • 확인: 방금 요청분의 사용량과 비용이 표시됩니다. 실습 중에는 이 탭을 수시로 봅니다.

5-2. 가상 키 페어링

테슬라 입장에서 이 앱은 제3자(서드파티) 앱이라, 차에 명령을 보내려면 내 앱의 공개 키를 차에 "가상 키"로 등록해야 합니다.

  1. 브라우저 주소창에 아래 주소를 아이디만 바꿔 입력합니다. 차가 여러 대면 끝에 ?vin=차대번호를 붙여 차를 지정합니다.
프롬프트
https://tesla.com/_ak/내아이디.github.io
  • 확인: 가상 키를 페어링하라는 화면과 QR 코드가 보입니다. 휴대폰에서 이 주소를 직접 열어도 됩니다.
  1. 테슬라 앱이 깔린 휴대폰 카메라로 QR 코드를 스캔합니다.
    • 확인: 테슬라 앱에 승인⁠·거부 화면이 나옵니다.
  2. 앱에서 "승인"을 누릅니다. 차 안의 키 카드를 대라는 안내가 나오면 따릅니다.
    • 확인: "성공" 화면이 나오고, 차량 화면의 잠금(Locks) 메뉴 키 목록에 내 앱 이름이 보입니다.

5-3. 테슬라 공식 SDK 설치(맥)

차량 명령에는 개인 키로 만든 서명이 붙어야 합니다. 테슬라가 GitHub에 공개한 vehicle-command 저장소의 tesla-control 도구가 이 서명을 대신 붙여 줍니다. Go 언어로 만들어져 있어 Go를 먼저 설치합니다.

  1. go.dev/dl에서 맥용 Go 설치 파일(애플 실리콘은 arm64)을 받아 설치합니다.
    • 확인: 새 터미널에서 go version을 치면 버전이 나옵니다.
  2. VS Code 터미널에서 저장소를 내려받고 폴더로 들어갑니다.
명령어
git clone https://github.com/teslamotors/vehicle-command.git
cd vehicle-command
  • 확인: tesla_agent 안에 vehicle-command 폴더가 생기고 현재 위치가 그 폴더로 바뀝니다. cd는 폴더를 옮겨 가는 명령입니다.
  1. 의존 패키지를 받고 설치합니다.
프롬프트
go get ./...
go build ./...
go install ./...
  • 확인: 오류 없이 끝나고, ls ~/go/bin을 치면 tesla-control이 보입니다.
  1. 다시 tesla_agent 폴더로 돌아옵니다(cd ..).
    • 확인: 터미널 위치가 tesla_agent입니다. 이후 만드는 app.py가 이 폴더에 있어야 합니다.

5-3W. 윈도우 사용자

tesla-control은 맥과 리눅스 기준이라 윈도우에서는 WSL의 우분투(Ubuntu) 안에서 설치합니다.

W1단계. 윈도우 검색창에 cmd를 입력하고 명령 프롬프트를 관리자 권한으로 엽니다.

  • 확인: 명령 프롬프트 창이 열립니다.

W2단계. 아래 명령을 입력하고 Enter를 누릅니다.

프롬프트
wsl --install
  • 확인: 우분투가 설치됩니다. 안내가 나오면 컴퓨터를 다시 시작하고 우분투 사용자 이름과 비밀번호를 만듭니다.

W3단계. 우분투 터미널에서 git을 설치하고(sudo apt update, sudo apt install -y git), go.dev/dl의 리눅스용 Go를 안내대로 설치합니다.

  • 확인: go version과 git --version이 모두 버전을 출력합니다.

W4단계. cd ~로 홈 폴더로 간 뒤, 맥의 62~63단계와 같은 명령으로 저장소를 받고 설치합니다.

  • 확인: ~/go/bin/tesla-control이 생깁니다.

W5단계. 이후의 app.py 작업과 실행도 우분투 터미널 안에서 합니다. VS Code에 WSL 확장을 깔면 우분투 폴더를 그대로 열 수 있습니다.

  • 확인: VS Code 왼쪽 아래에 WSL 연결 표시가 보입니다.

5-4. 채팅 에이전트 앱 만들기

채팅 화면은 스트림릿(Streamlit, 파이썬으로 웹 화면을 쉽게 만드는 도구)으로 만듭니다.

  1. tesla_agent 폴더에 .streamlit 폴더를 만들고(맨 앞 점 포함), 그 안에 config.toml 파일을 만들어 아래 내용을 넣고 저장합니다.
프롬프트
[server]
headless = true
port = 8501

[theme]
base = "dark"
  • 확인: config.toml이 .streamlit 폴더 안에 있습니다. 바깥 폴더에 생겼다면 끌어다 .streamlit 폴더로 옮깁니다.
  1. 앱에 필요한 패키지를 설치합니다.
명령어
pip install streamlit langchain langchain-xai python-dotenv requests
  • 확인: 설치가 끝납니다.
  1. 최종 앱 app.py를 만듭니다. AI에게 줄 요청 예시입니다.
프롬프트
app.py를 스트림릿 채팅 앱으로 만들어 줘. 제목은 "테슬라 그록".
- .env에서 XAI_API_KEY를 읽고, langchain-xai의 ChatXAI로 그록 모델을 쓰는 랭체인 create_agent 에이전트를 만들어
- 도구는 두 종류야. (1) 차량 상태 조회: token_manager.get_access_token()으로 플릿 API vehicle_data를 읽어 배터리, 온도, 잠금, 충전 상태를 돌려줘. (2) 차량 명령: subprocess로 tesla-control을 실행해. TOOL_PATH 변수에 tesla-control 경로를 적게 비워 두고, -vin, -key-file private-key.pem, -token-file 옵션을 써
- 명령 도구: 문 잠금·열기, 경적, 라이트 깜빡임, 에어컨 켜기·끄기, 실내 온도 설정, 앞·뒤 트렁크 열기·닫기, 충전 포트 열기·닫기, 센트리 모드 켜기·끄기
- 시스템 프롬프트: 너는 테슬라 차량 비서다. 상태는 반드시 도구로 확인하고 답한다. 문 열기, 트렁크·프렁크 열기처럼 사람이 다칠 수 있는 명령은 실행 전에 사용자에게 한 번 더 확인을 받는다. 도구가 실패하면 성공했다고 말하지 않는다
- 대화 기록을 st.session_state에 남겨 앞 대화 맥락을 기억하게 해 줘
- API 키, 토큰, 시크릿은 절대 화면이나 모델 입력에 넣지 마
  • 확인: 받은 코드를 app.py로 저장했습니다.
  1. app.py에서 TOOL_PATH의 따옴표 사이에 tesla-control 경로를 넣습니다. 맥은 보통 /Users/내사용자이름/go/bin/tesla-control입니다. 터미널에서 echo ~/go/bin/tesla-control을 치면 내 컴퓨터의 정확한 경로가 나옵니다.
    • 확인: 따옴표 사이에 경로가 들어 있고 저장했습니다.
    • 팁: 실행이 안 되면 SDK가 다른 경로에 설치됐을 수 있습니다. which tesla-control이나 ls ~/go/bin으로 위치를 찾습니다.
  2. 터미널 위치가 tesla_agent 폴더인지 확인하고 앱을 실행합니다.
명령어
python -m streamlit run app.py
  • 확인: 브라우저에 "테슬라 그록" 채팅 앱이 열립니다.

5-5. 앱 시험하기

여기서부터 명령은 실제 차량에 전달됩니다. 차가 안전한 곳에 있고 주변에 사람이 없는지 다시 확인합니다.

  1. 채팅창에 안녕을 입력하고 Enter를 누릅니다.
    • 확인: "안녕하세요. 테슬라 관련 도움이 필요하시면 말씀해 주세요" 같은 답이 옵니다.
  2. 차량 상태 어때를 입력합니다.
    • 확인: 에이전트가 차에 상태를 요청해 받은 값을 바탕으로 답합니다.
  3. 충전이 필요하려나를 입력합니다.
    • 확인: 앞 대화 맥락을 이어 답합니다. 예를 들어 배터리가 21%라면 충전이 필요해 보인다고 답합니다.
  4. 차량 충전 포트 열어줘를 입력합니다. 여기서부터 상태 조회가 아니라 실제 제어입니다.
    • 확인: "충전 포트 열었어요. 케이블을 연결해 보세요" 같은 답이 옵니다.
  5. 테슬라 모바일 앱에서 충전 포트가 실제로 열렸는지 봅니다.
    • 확인: 충전 포트가 열려 있습니다. 에이전트의 답만 믿지 않고 앱으로 확인하는 습관이 중요합니다.
  6. 충전 끝났으니까 포트 다시 닫아줘를 입력합니다.
    • 확인: tesla-control이 서명한 명령이 차에 가고 "충전 포트 잘 닫았어요" 같은 답이 옵니다.

5-6. 기능 늘리기와 이름 바꾸기

  1. (선택) 테슬라 공식 문서(developer.tesla.com의 Fleet API 문서)에서 원하는 기능의 엔드포인트를 찾고, 기존 app.py와 함께 AI에게 주며 "이 문서를 기반으로 이 기능을 도구로 추가해 줘"라고 요청합니다.
    • 확인: 새 도구가 추가된 코드가 나옵니다.
    • 주의: 새 기능도 실제 차에 명령을 보냅니다. 실행 전에 주차 상태와 주변을 먼저 확인합니다.
  2. (선택) app.py에서 제목 "테슬라 그록"이 적힌 st.title 줄을 찾아 테슬라 에이전트로 고치고 저장합니다.
    • 확인: 브라우저를 새로고침하면 앱 이름이 바뀝니다.
  3. (선택) 시스템 프롬프트를 고쳐 에이전트의 역할과 말투를 더 자세히 정합니다. 예: "출근 전 '차 데워 놔'라고 하면 공조를 켜고 22도로 맞추고 운전석 열선을 켠다"
    • 확인: 안녕을 다시 입력하면 바뀐 역할에 맞는 첫인사가 나옵니다.

다 쓴 뒤 정리하기

더 이상 쓰지 않는다면 보안을 위해 아래를 정리합니다.

  1. tokens.json, .env, private-key.pem처럼 비밀값이 든 파일을 지웁니다.
    • 확인: 해당 파일이 폴더에서 사라졌고, 휴지통도 비웠습니다.
  2. 용량이 큰 venv 폴더를 지웁니다.
    • 확인: 가상환경 폴더가 사라집니다.
  3. (윈도우) 더 쓰지 않을 WSL 우분투는 윈도우 설정 > 앱에서 제거합니다. 우분투 안의 파일도 함께 사라집니다.
    • 확인: 앱 목록에서 우분투가 사라집니다.
  4. xAI 콘솔의 API Keys에서 발급한 키 오른쪽 점 세 개(더보기) 버튼을 누르고 "Delete key"를 누릅니다.
    • 확인: 키가 목록에서 사라집니다.
  5. 테슬라 개발자 사이트 앱 목록에서 점 세 개 버튼을 누르고 "애플리케이션 보관하기"를 누릅니다.
    • 확인: 앱 상태가 보관으로 바뀌고 약 10분 뒤 최종 종료됩니다. 보관한 앱을 다시 쓰려면 새로 등록해야 할 수 있습니다.
  6. 차량 화면의 잠금(Locks) 메뉴에서 내 앱의 가상 키를 지웁니다.
    • 확인: 키 목록에 내 앱이 없습니다.

다 됐는지 점검하기

  • 코랩에서 그록이 질문에 답했다
  • 도구 연결 시험에서 정해진 날씨 문구로 답했다
  • GitHub Pages 주소에서 공개 키 파일이 열린다
  • tokens.json이 생겼다
  • 토큰 매니저에서 "사용 가능한 토큰"과 OK가 나왔다
  • 파트너 도메인 등록 성공 메시지가 나왔다
  • 대시보드에 차량 정보가 보였다
  • 가상 키 페어링 "성공" 화면을 봤고 차량 키 목록에 내 앱이 있다
  • 채팅 앱에서 "충전 포트 열어줘/닫아줘"가 실제 차에 반영됐다
  • 쓰지 않을 때 키, 앱, 비밀 파일을 정리했다

막혔을 때

코랩에서 답이 오지 않는다

API 키를 잘못 붙였거나 xAI 크레딧이 없는 경우가 대부분입니다. 콘솔에서 크레딧을 확인하고, 안 되면 키를 새로 만들어 다시 붙입니다.

파트너 등록에서 실패가 뜬다

클라이언트 시크릿 자리에 클라이언트 ID를 붙여 넣는 식의 복사 실수가 가장 흔합니다. .env를 다시 확인해 저장한 뒤 같은 명령을 다시 실행합니다. 공개 키 관련 오류라면 GitHub Pages 주소에서 키 파일이 열리는지부터 봅니다.

GitHub 주소에서 키 파일이 열리지 않는다

.nojekyll 파일이 없거나, 파일 이름 앞의 점이 빠졌거나, 배포를 기다린 시간이 짧은 경우입니다. 이름과 경로를 확인하고 1~2분 기다렸다가 다시 엽니다.

채팅 앱에서 명령이 실패한다

TOOL_PATH의 tesla-control 경로가 틀렸거나, 가상 키 페어링이 안 된 경우가 많습니다. ls ~/go/bin으로 경로를 다시 확인하고, 차량 잠금 메뉴의 키 목록에 내 앱이 있는지 봅니다.

키나 토큰이 노출됐다

xAI 키는 바로 삭제하고 새로 만듭니다. 테슬라 쪽은 앱을 "애플리케이션 보관하기"로 처리하고, 차량 키 목록에서 가상 키를 지운 뒤 새로 등록합니다.

파일이 엉뚱한 폴더에 만들어졌다

config.toml이 .streamlit 대신 바깥 폴더에 생겼다면 끌어다 .streamlit 폴더로 옮깁니다.

자주 묻는 질문

테슬라를 그록으로 조종하는 것은 공식적으로 허용된 방법인가요?

허용된 방법입니다. 테슬라가 외부 개발자에게 공개한 플릿 API와 가상 키를 쓰고, 차량 소프트웨어는 건드리지 않습니다. 다만 명령이 실제 차에 전달되므로 주차 상태와 주변 안전을 확인한 뒤 시험해야 합니다.

테슬라 플릿 API는 돈이 드나요?

쓴 만큼 요금이 붙습니다. 계정마다 매달 10달러 할인이 있어 개인 시험은 대부분 그 안에서 끝나지만, 잠든 차를 자주 깨우거나 몇 초마다 상태를 조회하면 금방 넘을 수 있습니다. 개발자 사이트의 사용량 탭과 월 한도 설정을 활용합니다.

가상 키는 왜 필요한가요?

요즘 테슬라 차량은 외부 앱의 명령에 그 앱의 디지털 서명이 있어야 실행합니다. 가상 키 페어링은 내 앱의 공개 키를 차에 등록하는 절차이고, 차량 잠금 메뉴에서 언제든 지울 수 있습니다.

윈도우에서도 만들 수 있나요?

만들 수 있습니다. 테슬라 공식 SDK의 tesla-control이 맥과 리눅스 기준이라, 윈도우에서는 wsl --install로 우분투를 깔고 그 안에서 Go와 SDK를 설치해 앱을 실행합니다.

이 글의 본문은 아래 원본 유튜브 영상의 내용을 바탕으로 쓸모연구소가 다시 정리해 쓴 것입니다. 세부 내용과 최신 정보는 원본 영상과 공식 안내에서 확인해 주세요.

원본 영상 보러가기 ↗