Le principe de la connexion BLE (Bluetooth Low Energy) repose sur l’établissement d’un canal de communication local, sécurisé et à faible consommation, permettant à un appareil externe (souvent via un outil ou une application personnalisée) d’envoyer des commandes directement au véhicule. Cette approche est idéale entre un véhicule Tesla et l’application EnergyBoard.

Voici les points essentiels à utiliser la liaison BLE sur un véhicule Tesla :
- Communication à courte portée et faible consommation
Le BLE est conçu pour des échanges de données sur de courtes distances, ce qui est idéal pour communiquer avec un véhicule à proximité (par exemple, lors de l’utilisation d’un smartphone ou d’un dispositif embarqué). - Découverte des services et appariement
Le véhicule expose des services BLE spécifiques. L’outil (comme celui proposé dans le dépôt vehicle-command) scanne ces services et procède à un appariement ou à une authentification. Pour garantir la sécurité, cette phase d’appariement repose souvent sur l’échange de clés cryptographiques. - Authentification par échange de clés
Afin de s’assurer que seules les requêtes authentifiées parviennent au véhicule, le mécanisme implique l’utilisation d’une paire de clés publique/privée. Par exemple, la commandetesla-control -vin YOUR_VIN -ble -key-file BLE-private.pem wake
illustre comment une clé privée est utilisée pour signer ou authentifier une commande envoyée via BLE. Ce processus assure que seul un utilisateur autorisé peut exécuter des commandes sensibles (comme le réveil du véhicule, le verrouillage ou le démarrage de la charge). - Exécution des commandes
Une fois la connexion établie et l’authentification réussie, l’appareil externe peut envoyer des commandes spécifiques (par exemple, pour réveiller le véhicule, obtenir son état, verrouiller/déverrouiller, etc.). Ces commandes sont interprétées par le système du véhicule et traduites en actions réelles. - Sécurité et contrôle
L’utilisation du BLE dans ce contexte permet de limiter la portée de la communication et d’exploiter un protocole conçu pour être économe en énergie. De plus, la sécurisation par clé cryptographique protège contre toute tentative d’intrusion non autorisée.
En résumé, la connexion BLE sur une Tesla, telle qu’illustrée dans le projet vehicle-command, consiste à établir un lien local entre un appareil et le véhicule, authentifier cette communication via un échange de clés, puis permettre l’envoi de commandes sécurisées pour contrôler diverses fonctions du véhicule.
Ce mécanisme offre un moyen efficace et sûr de gérer certaines opérations du véhicule sans passer par les serveurs Tesla.
Quelles sont les différentes étapes pour faire fonctionner BLE ?
Voici la liste des étapes que nous allons faire ensemble :
- Etape 0 – Rappel des prérequis
- Etape I – Mise à jour de Go
- Etape II – Installation de vehicle-command
- Etape III – Création de la clef virtuelle BLE
- Etape IV – Test de la clef virtuelle BLE
- Etape V – Configuration BLE pour EnergyBoard
Etape 0 – Rappel des prérequis :
Pour mettre en place la connexion BLE à votre environnement Raspberry Pi 5, il vous faudra disposer de :
- Un Raspberry Pi 5
- Un accès SSH à votre environnement
Commençons par récupérer le programme officiel Tesla pour le protocole BLE, et développé en Go.
Etape I – Mise à jour de Go :
Téléchargez l’archive de Go version 1.23.0 pour Raspberry Pi 5 (ARM) :
wget https://go.dev/dl/go1.23.0.linux-arm64.tar.gz

Décompressez l’archive Go téléchargée dans le répertoire /usr/local
:
sudo tar -C /usr/local -xzf go1.23.*.gz

Ouvrez le fichier de configuration Bash à l’aide de l’éditeur de texte en mode terminal Vi :
vi ~/.bashrc

Descendez en bas du fichier, puis ajoutez la ligne suivante grâce à la touche i :
export PATH=$PATH:/usr/local/go/bin
Enregistrez et quitter l’éditeur vi grâce à la commande suivante :
:wq

Forcez le rechargement du fichier de configuration Bash :
source ~/.bashrc
Affichez la version de Go actuellement installée :
go version

Etape II – Installation de vehicle-command :
Créez un nouveau répertoire nommé tesla dans le répertoire courant, puis déplacez-vous :
mkdir tesla
cd tesla
Clonez le dépôt GitHub du projet vehicle-command de Tesla dans un répertoire nommé vehicle-command
dans le répertoire courant :
git clone https://github.com/teslamotors/vehicle-command.git
cd vehicle-command

Téléchargez l’ensemble des dépendances requises :
go get ./...

Compilez l’ensemble des package :
go build ./...
Installez l’ensemble des packages :
go install ./...
Exécutez la commande suivante pour vérifier le bon lancement du programme :
tesla-control -h

Etape III – Création de la clef virtuelle BLE :
Remontez dans le répertoire parent, créez un dossier nommé secrets, puis accédez -y :
cd ..
mkdir secrets
cd secrets/

Utilisez OpenSSL pour générer une clé privée EC à l’aide de la courbe prime256v1 :
openssl ecparam -genkey -name prime256v1 -noout > BLE-private.pem
openssl ec -in BLE-private.pem -pubout > BLE-public.pem

Attribuez à l’exécutable tesla-control
la capacité réseau d’administration :
sudo setcap 'cap_net_admin=eip' "$(which tesla-control)"

Exécutez tesla-control
en mode Bluetooth pour le véhicule identifié par le VIN afin de lancer la commande add-key-request
en utilisant le fichier BLE-public.pem
pour envoyer une requête d’ajout de clé associée à l’identité ou au rôle « owner » et à la clé identifiée par cloud_key
:
tesla-control -vin YOUR_VIN -ble add-key-request BLE-public.pem owner cloud_key

Confirmez l’action d’association en couchant la carte NFC Tesla sur la console centrale de la voiture.
Etape IV – Test de la clef virtuelle BLE :
Pour tester le bon fonctionnement d’un ordre à la voiture, envoyez la commande de réveil au véhicule, en utilisant le fichier BLE-private.pem
pour l’authentification.
tesla-control -vin YOUR_VIN -ble -key-file BLE-private.pem wake
L’absence de retour de la part de l’application équivaut à un succès de l’opération :

Dans votre navigateur internet, accédez à l’adresse http://ADRESSE_IP:4000 afin de constater une actualisation du statut de la voiture réveillée :

Testez au besoin d’autres commandes sur la Tesla parmi les commandes disponibles :
add-keyAdd PUBLIC_KEY to vehicle whitelist with ROLE and FORM_FACTOR
add-key-requestRequest NFC-card approval for a enrolling PUBLIC_KEY with ROLE and FORM_FACTOR
auto-seat-and-climateTurn on automatic seat heating and HVAC
autosecure-modelxClose falcon-wing doors and lock vehicle. Model X only.
body-controller-stateFetch limited vehicle state information. Works over BLE when infotainment is asleep.
charge-port-closeClose charge port
charge-port-open Open charge port
charging-scheduleSchedule charging to MINS minutes after midnight and enable daily scheduling
charging-schedule-addSchedule charge for DAYS START_TIME-END_TIME at LATITUDE LONGITUDE. The END_TIME may be on the following day.
charging-schedule-cancel Cancel scheduled charge start
charging-schedule-remove Removes charging schedule of TYPE [ID]
charging-set-ampsSet charge current to AMPS
charging-set-limit Set charge limit to PERCENT
charging-start Start charging
charging-stopStop charging
climate-offTurn off climate control
climate-on Turn on climate control
climate-set-temp Set temperature (Celsius)
driveRemote start vehicle
erase-guest-data Erase Guest Mode user data
flash-lights Flash lights
frunk-open Open vehicle frunk. Note that there's no frunk-close command!
getGET an owner API http ENDPOINT. Hostname will be taken from -config.
guest-mode-off Disable Guest Mode.
guest-mode-onEnable Guest Mode.
honk Honk horn
list-keysList public keys enrolled on vehicle
lock Lock vehicle
media-set-volume Set volume
media-toggle-playbackToggle between play/pause
ping Ping vehicle
post POST to ENDPOINT the contents of FILE. Hostname will be taken from -config.
precondition-schedule-addSchedule precondition for DAYS TIME at LATITUDE LONGITUDE.
precondition-schedule-remove Removes precondition schedule of TYPE [ID]
product-info Print JSON product info
remove-key Remove PUBLIC_KEY from vehicle whitelist
rename-key Change the human-readable metadata of PUBLIC_KEY to NAME, MODEL, KIND
seat-heaterSet seat heater at POSITION to LEVEL
sentry-modeSet sentry mode to STATE ('on' or 'off')
session-info Retrieve session info for PUBLIC_KEY from DOMAIN
software-update-cancel Cancel a pending software update
software-update-startStart software update after DELAY
stateFetch vehicle state over BLE.
steering-wheel-heaterSet steering wheel mode to STATE ('on' or 'off')
tonneau-closeClose Cybertruck tonneau.
tonneau-open Open Cybertruck tonneau.
tonneau-stop Stop moving Cybertruck tonneau.
trunk-closeCloses vehicle trunk. Only available on certain vehicle types.
trunk-move Toggle trunk open/closed. Closing is only available on certain vehicle types.
trunk-open Open vehicle trunk. Note that trunk-close only works on certain vehicle types.
unlock Unlock vehicle
valet-mode-off Disable valet mode
valet-mode-onEnable valet mode
wake Wake up vehicle
windows-closeClose all windows
windows-vent Vent all windows
Testez au besoin d’autres commandes sur votre Tesla via BLE :

Votre Tesla est maintenant prête à recevoir des ordres via BLE. Il ne nous reste qu’à configurer EnergyBoard pour activer cette fonction.
Etape V – Configuration BLE pour EnergyBoard :
Renseignez les informations suivantes pour qu’EnergyBoard exploite le service de communication BLE avec la voiture Tesla :

Pensez à sauvegarder le fichier de configuration via la commande suivante :
:wq
Arrêter l’application EnergyBoard :
pm2 stop energyboard

Démarrer l’application EnergyBoard :
pm2 start energyboard

La connexion Bluetooth entre EnergyBoard et la Tesla est maintenant fonctionnelle. Si vous le souhaitez, vous pouvez passer à l’étape facultative suivante, consistant à configurer le lien API entre EnergyBoard et le serveurs Tesla. Ce dernier va nous permettre de :
- Envoyer des ordres Tesla via API grâce au conteneur Proxy HTTP quand la liaison Bluetooth n’est pas disponible.