Envoyer des commandes à sa Tesla via MQTT/BLE

Bonjour,

Voici une procédure pour configurer le service tesla_ble_mqtt_docker, permettant d’envoyer des commandes à votre Tesla depuis Home Assistant (HA), sans passer par l’API cloud de Tesla.

Introduction


En cas de problème, commencez par consulter les repos en lien et prenez connaissance de la section Support technique

À qui s’adresse cette procédure ?

Cette procédure est destinée à ceux qui souhaitent :

  • Envoyer plus de 50 commandes par jour à leur véhicule.
  • Éviter l’installation du proxy.
  • Contrôler le véhicule sans connexion internet lorsqu’il est garé chez eux.

Matériel nécessaire

  1. Un SBC de type Raspberry Pi capable de faire tourner Linux, avec antenne Bluetooth. J’utilise un Raspberry Pi 4 Model B (c’est peut-être surdimensionné mais c’est ce que j’avais sous la main).
  2. Carte Micro SD + adaptateur SD + câbles requis pour l’installation de l’OS (non détaillée dans cette procédure).

Limitations actuelles

La méthode et l’outil vienne tout juste d’être mis en ligne. De potentielles évolution et améliorations sont déjà en train d’être discutées. A ce stade, prendre en considération les points suivants:

  1. Impossible de régler le courant de charge en dessous de 5A. On en discute par ici.
    Résolu :white_check_mark:

  2. Fonctionnalités limitées à l’envoi de commandes (quaisment toutes sont implémentées). Impossible d’obtenir des informations sur l’état du véhicule. (utiliser l’intégration ou teslamate pour se faire).

Procédure d’installation

Dans ce qui suit, « RPi » désigne l’appareil sur lequel le service sera exécuté. Cette procédure est adaptée de la documentation présente sur le repo, que je vous conseille fortement de lire.

Prérequis

Sur le RPi

  • Une distribution Linux (DietPi pour mon cas). Pensez à activer le Bluetooth dans les paramètres !
  • Docker
  • Docker-compose
  • Optionnel : Portainer, utile pour voir les logs et autres détails.

Dans Home Assistant

Déployer le conteneur

  1. Se connecter au RPi, par SSH par exemple.
  2. Créer un dossier tesla_ble_mqtt_docker dans votre répertoire utilisateur et vous y rendre :
cd ~
mkdir tesla_ble_mqtt_docker
cd tesla_ble_mqtt_docker
  1. Ajouter deux fichiers docker-compose.yml et stack.env. Pour plus de faciliter, récupérer ceux du repo :
curl -O https://raw.githubusercontent.com/tesla-local-control/tesla_ble_mqtt_docker/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/tesla-local-control/tesla_ble_mqtt_docker/main/stack.env

Le docker-compose.yml devrait fonctionner en l’état. Éditez le fichier stack.env avec vos paramètres : a minima, le VIN de votre véhicules et vos identifiants mqtt.

Example de contenu pour stack.env
# Mandatory; if multiple VINs separate with |
#
VIN_LIST=XXX|XXX

# Mandatory; Hostname or IP address
#
MQTT_SERVER=192.168.1.X

# Service port # or name
#
MQTT_PORT=1883

# If no username provided, anonymous mode.
#
MQTT_USERNAME=XXX

# If you have special characters, wrap with ' at both ends; escape ' if needed
#
MQTT_PASSWORD=XXX

# Default 5 (seconds)
#
BLE_CMD_RETRY_DELAY=5

# Default 120 (seconds)
#
PRESENCE_DETECTION_LOOP_DELAY=120

# Default 240 (seconds)
#
PRESENCE_DETECTION_TTL=240

# Your timezone
# Ref: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
#
TZ='Europe/Paris'

### Default false
#
TEMPERATURE_UNIT_FAHRENHEIT=false

### Default 48
#
MAX_CURRENT=32

### Default false
#
DEBUG=false

#
# WARNING; If you run Home Assistant, keep this true unless you know what you're doing
#
ENABLE_HA_FEATURES=true
  1. Créer le volume Docker :
docker volume create tesla_ble_mqtt_model
  1. Démarrer le conteneur :
docker-compose up -d
  1. Vérifier les logs dans Portainer (ou autre). Ils devraient ressembler à ceci :
Configuration Options are:
  BLE_CMD_RETRY_DELAY=5
  DEBUG=false
  MQTT_SERVER=192.168.1.X
  MQTT_PORT=1883
  MQTT_PASSWORD=Not Shown
  MQTT_USERNAME=XXXXXX
  PRESENCE_DETECTION_LOOP_DELAY=120
  PRESENCE_DETECTION_TTL=240
  TEMPERATURE_UNIT_FAHRENHEIT=false
  VIN_LIST=LRWXXXXXXXXXXXXXX
  MAX_CURRENT=32
  ENABLE_HA_FEATURES=true
Removing single buttons to be replaced by switches & covers:
windows, charger, cherge-port, climate, trunk
delete_legacies_singles; deleting legacy single MQTT entities topics  Setting up MQTT clients with authentication
setupHADiscoveryAllVINsMain; Discarding any unread MQTT messages for topic:tesla_ble/LRW3F7FS5RC036403/config
Listening for Home Assistant Start (in background)
Entering main loop...
main loop; Lauching background listen_to_mqtt_loop...
main loop; launch BLE scanning for car presence every 120 seconds
Entering Listen to MQTT loop...
Launching listen_to_mqtt
Listening to MQTT

Activer la clé via Home Assistant

  1. Accéder à la page des intégrations dans Home Assistant et cliquer sur la case MQTT :
    image

  2. Un nouvel appareil devrait apparaître dans la liste :

  3. Accéder à la liste des entités liées à l’appareil en cliquant dessus :
    image

  4. Dans la section Configuration, cliquer sur Generate Keys. Optionnellement, vérifier les logs dans Portainer.
    image

Ajouter la clé au véhicule

Le RPi doit être à proximité du véhicule. Pour ma part, environ 5m.

  1. Se munir d’une carte-clé du véhicule.
  2. S’installer à la place du conducteur avec son téléphone ouvert sur la page Home Assistant de l’appareil MQTT. L’écran du véhicule doit être actif.
  3. Appuyer sur Deploy Key depuis l’interface HA sur votre téléphone.
    image
  4. Immédiatement, positionner la carte-clé sur la console centrale comme pour démarrer le véhicule. Un message de confirmation demandera de valider l’ajout de la clé.
  5. Renommer la clé Unknown Key nouvellement ajoutée avec un nom identifiable, comme Clé BLE.

Note : La procédure devra parfois être répétée plusieurs fois avant de fonctionner.

Tester l’envoi de commandes avec la clé BLE

  1. Depuis l’interface Home Assistant, tester les différentes commandes disponibles.

Support technique

Demander de l’aide

Trouver la procédure compliquée, c’est normal. Demander de l’aide c’est bien. Inclure les bonnes informations c’est mieux.

Pour toute demande d’aide, voici le minimum (recommandé) à inclure :

  1. Description du problème.
  2. Contenu du docker-compose.yml
  3. Logs du conteneur.

Au niveau du format, faire usage de la balise details qui évitera de surcharger les discussions

[details="Configuration et logs"]

## Docker-compose.yml
```yaml
Contenu du docker-compose.yml
``` 

## Logs
```bash
Copie du log.
```
[/details]

Ce qui renvoie :

Configuration et logs

Docker-compose.yml

Contenu du docker-compose.yml

Logs

Copie du log.

Demander de l’aide

Vérifier le contenu des messages MQTT

Pour vérifier le contenu des messages MQTT envoyés, installer le module MQTT explorer. Il vous sera ainsi possible de visualiser le via l’interface graphique du module la nature et le contenu de tous les messages captés par le broker.

Utile pour déterminer si la nature des messages liées aux commandes BLE.

Repartir de zéro pour la version standalone
  1. Arreter le conteneur : docker stop nom_du_conteneur
  2. Nettoyer docker :
    1. docker system prune
    2. docker volume prune
  3. Relire et valider le contenu de docker-compose.yml.
  4. Créér de nouveau le conteneur : docker compose pull && docker compose up -d.
1 « J'aime »

Merci :slight_smile:

ça fonctionne super bien !

1 « J'aime »

J’ai quelques fail d’envoi de commandes quand je regarde les logs :

Received MQTT message: tesla_ble/charging-amps 9
Set Charging Amps to 9 requested
Attempt 1/5
Error: ble: failed to enumerate device services: ATT request failed: input channel closed: io: read/write on closed pipe
Attempt 2/5
Error: ble: failed to enumerate device services: ATT request failed: input channel closed: io: read/write on closed pipe
Attempt 3/5
Ok
Received MQTT message: tesla_ble/charging-amps 8
Set Charging Amps to 8 requested
Attempt 1/5
Error: ble: failed to enumerate device services: ATT request failed: input channel closed: io: read/write on closed pipe
Attempt 2/5
Ok

Rien de bien grave car ça finit en général toujours par passer avant le 5e essai, mais je me demande si ça ne viendrait pas de ma clef bluetooth …

Un modèle à conseiller ?

J’ai également des erreurs de ce type. C’est lié, entre autre, à :

  • La distance entre le véhicule et le SBC.
  • Des interférences entre WiFi et Bluetooth, sur des SBC comme le RPI c’est un problème connu.
  • Des interférences liées au cloisons que le signal doit traverser. J’ai une dalle en béton armé entre le RDC et le garage, ca à son petit effet négatif.

Pour l’heure, mis à part rapprocher le SBC des voitures, ou déporter l’antenne bluetooth, je n’envisage rien d’autre : le projet est encore trop jeune pour que j’investisse dans du matériel.

Cependant, l’idéal serait à ce stade selon moi un SOC du type RPI Zero avec un shield POE, pour se passer du WiFI et éviter les interférences. On en a discuté ici et le fait de désactiver le WiFi semble corriger le problème.

Sinon passer en 5GHz comme évoqué dans la discussion, je n’ai pas eu le temps de me pencher dessus mais il me semble que c’est ok pour un RPI4, je ferai des tests.

1 « J'aime »

Bonjour à tous,

Merci beaucoup pour ce tuto qui marche vraiment bien.
Je l’ai exécuté sur un RPi 3.

1 « J'aime »

Merci pour le tuto. Je n’y connais rien en docker mais j’ai tenté et quand je lance un sudo docker-compose up j’ai un message d’erreur

tesla_ble_mqtt_model_3 | mkdir: can’t create directory ‹ /share/tesla_ble_mqtt ›: No such file or directory

Je n’arrive pas à comprendre le problème ? J’ai essayé de voir dans les GitHub mais c’est en pleine effervescence sur le sujet, difficile de s’y retrouver :smiley:

Pourriez-vous vous poster votre config ?

Le repo est effectivement en pleine mutation : un Addon vient d’être créé pour faire tourner le service directement dans HA.

Je vais mettre la doc à jour quand les changements auront été portés.

Oui pardon, c’est sur raspberry os lite sur un rpi4.

Par config j’entends le contenu du docker-compose (masquer le VIN)

Même problème ici, après avoir mis à jour l’image docker :frowning:

@Vladvonvidden Qu’as tu dans le répertoire /share/tesla_ble_mqtt ?

Mon docker-compose :

volumes:
  tesla_ble_mqtt_model_3:
    external: true

services:   
  tesla_ble_mqtt_model_3:
    container_name: tesla_ble_mqtt_model_3
    image: "iainbullock/tesla_ble_mqtt:latest"

    environment:
      - TZ='Europe/Paris'
      - TESLA_VIN1=mon_vin
      - MQTT_IP=192.168.0.199
      - MQTT_PORT=1883
      - MQTT_USER=user
      - MQTT_PWD=pwd

    stdin_open: true
    tty: true    

    entrypoint: "/app/run.sh"
    working_dir: /data

    volumes:
      - tesla_ble_mqtt_model_3:/data
      - /run/dbus:/run/dbus

    network_mode: host
    privileged: true

    restart: unless-stopped
carmelo@teslapi:~/tesla_ble_m

J’ai celui de la première page, aucune modif :confused:

J’ai pu refaire fonctionner :

  • il faut créer le répertoire /share/tesla_ble_mqtt/

  • ajouter dans les volumes du fichier docker compose la ligne -/share/tesla_ble_mqtt:/share/tesla_ble_mqtt

  • dans le docker compose, modifier la ligne TESLA_VIN par TESLA_VIN1

  • et enfin, il faut renommer les fichiers private.pem et public.pem en XP7Yxxxxxxxxxxx_private.pem et XP7Yxxxxxxxxxxx_public.pem

Relancer un docker compose up -d et ça devrait le faire (avec plein plein de commandes dispos sous HA :slight_smile:

J’ai fait autrement :laughing:

Je suis allée chercher le docker-compose du github, il m’a demandé de refaire un nouveau volume docker et c’est parti. Je test la charge avec le surplus solaire.

Le docker sera relancé à chaque démarrage du PI ou il y’a quelque chose de particulier à faire ? Merci :slight_smile:

Avec restart: unless-stopped le conteneur sera relancé en cas d’arrêt du RPI.

Je vais faire une mise à jour de la procédure : le repo est en train d’être migré sur celui d’un Addon pour faciliter le déploiement, directement dans HA ou sur un autre client.

Beaucoup de changements sont en train d’être implémentés, je me laisse jusqu’au milieu de semaine pour maj.

Pour ceux qui ont plusieurs véhicules, une prochaine maj devrait régler les soucis actuels.

Bonjour a tous,

Je suis un des 3 « apprentis devs » qui essayons de faire marcher ce tesla-control. C’est en effervescence en effet, avec beaucoup de quick & dirty…

Notamment je me suis occupé de la partie Plug-in home assistant. J’utilise ça directement sur mon RPi 4B avec HAOS qui est dans mon garage. La performance n’est pas super fiable.

Quelqu’un s’y connait en programmation sur ESP? Soyons ambitieux, ce serait pour transférer la partie BLE du Tesla SDK sur un ESP…

Bonjour, je ne suis pas un pro sur linux,
j’ai tout fait comme dans le tuto mais j’ai le meme message d’erreur :
tesla_ble_mqtt_model_3 | mkdir: can’t create directory ‹ /share/tesla_ble_mqtt ›: No such file or directory

Desolé de demander mais pourrais tu detailler un peu plus les manips a réaliser ?

creation des repertoir ? comment ?
idem pour les volumes ?
Tesla_VIN1 c’est bon :slight_smile:
je ne te parle pas des fichiers private…

Merci par avance pour ton aide !

tu dois créer le répertoire /share/tesla_ble_mqtt :
sudo mkdir /share/tesla_ble_mqtt

Ensuite, dans ton fichier docker-compose.yml tu dois avoir la ligne suivante dans la partie volumes :
-/share/tesla_ble_mqtt:/share/tesla_ble_mqtt

Merci !
j’ai avancé !
ca démarre bien, mais je ne retrouve pas le docker dans HA ?
j’ai le message d’erreur time out

tesla_ble_mqtt_model_3  | ------------------------------------------------------------------------------------------------------------------------------
tesla_ble_mqtt_model_3  | tesla_ble_mqtt_docker by Iain Bullock 2024 https://github.com/iainbullock/tesla_ble_mqtt_docker
tesla_ble_mqtt_model_3  | Inspiration by Raphael Murray https://github.com/raphmur
tesla_ble_mqtt_model_3  | Instructions by Shankar Kumarasamy https://shankarkumarasamy.blog/2024/01/28/tesla-developer-api-guide-ble-key-pair-auth-and-vehicle-commands-part-3
tesla_ble_mqtt_model_3  | Configuration Options are:
tesla_ble_mqtt_model_3  | TESLA_VIN1=xxxxxxxxxxxxx
tesla_ble_mqtt_model_3  | TESLA_VIN2=
tesla_ble_mqtt_model_3  | TESLA_VIN3=
tesla_ble_mqtt_model_3  | BLE_MAC=
tesla_ble_mqtt_model_3  | MQTT_IP=xxxxxxxxxx
tesla_ble_mqtt_model_3  | MQTT_PORT=1883
tesla_ble_mqtt_model_3  | MQTT_USER=xxxxxxxxxxx
tesla_ble_mqtt_model_3  | MQTT_PWD=Not Shown
tesla_ble_mqtt_model_3  | SEND_CMD_RETRY_DELAY=
tesla_ble_mqtt_model_3  | Include subroutines
tesla_ble_mqtt_model_3  | /share/tesla_ble_mqtt already exists, existing BLE keys can be reused
tesla_ble_mqtt_model_3  | Setting up auto discovery for Home Assistant
tesla_ble_mqtt_model_3  | Setting up HA auto discovery for xxxxxxxxx
tesla_ble_mqtt_model_3  | DEV_ID=tesla_ble_mqtt_xxxxxxxxxxx
tesla_ble_mqtt_model_3  | DEV_NAME=Tesla_BLE_MQTT_xxxxxxxxxxxxxxxxx
tesla_ble_mqtt_model_3  | TOPIC_ROOT=tesla_ble_mqtt/xxxxxxxxxxxxx
tesla_ble_mqtt_model_3  | Error: Operation timed out
tesla_ble_mqtt_model_3 exited with code 0

La config de l’addon a été modifiée, je dois màj la procédure, j’essaye ce midi. Pourriez vous poster votre config (docker-compose.yml) & logs de la manière présentée ci dessous ? Ca évite de surcharger la discussion avec des posts trop longs.

Configuration & logs

Docker-compose.yml

Votre configuration

Docker-compose.yml

Vos logs

Markdown pour se faire :

<details>
  <summary>Configuration & logs</summary>

  ### Docker-compose.yml
  ```yaml
  Votre configuration
  ```
  ### Logs
  ```bash
  Vos logs
  ```
</details>

Dans HA, le véhicule sera disponible sous l’intégration MQTT (pas l’addon) qu’il vous faudra ajouter si ce n’est déjà fait.

Vérifier l’état du conteneur, soit via portainer ou avec docker ps -a sur la machine qui fait tourner le service.