Page 1 sur 2

Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 18 août 2025 17:36
par fastm3
Tesla est toujours en avance et a toujours « mis a dispo » une API ( retroengineering en fait au debut ). Aujourd’hui l’API est publique mais est « limitée » dans sa version gratuite. En nombre d’appels et donc aussi en réactivité . Il existe des solutions commerciales payantes mais elles sont en fait aussi limitées et payante.
Des projets sont apparus pour communiquer alors directement par l’intermediaire de la puce bluetooth BLE de la tesla. D’abord a base de PC, raspberry puis microcontrolleur esp32. La solution esp est desormais parfaitement fonctionnelle.
La solution avec esp m’a tout de suite interpellé car j’ai déjà un peu partout des esps chez moi , facile a deployer et pas cher. Je n’avais plus de tesla par contre…Des que ce petit soucis a été réglé , j’ai voulu testé le projet github :
https://github.com/yoziru/esphome-tesla-ble
En gros, on place un microcontrolleur a coté de la tesla et celui-ci permet de remonter toute les infos au système domotique Home Assistant. L’avantage est que la communication est locale BLE et on est donc plus limité en nombre d’appels de l’api et le retour est temps reel.
Ca vous donnera plein d’infos sur votre voiture en local. L’interet principal ( mais pas que ) est le contrôle de la charge de manière automatisé et a partir de 1A seulement. ( meme si pas vraiment utile )
Manque de chance, le projet initial a un probleme de compilation avec la derniere version d’esphome, ca complique et tous les tutos actuels qu’on peut trouver ( souvent partiels ) ne peuvent plus marcher. En voici un ok en Aout 2025.

Quelques images des infos ou controles alors accessibles :
Image
Image
Image

Prerequis :
1 – Un microcontrolleur ESP.
Le projet a semble été testé intensivement avec un M5 stack S3 et M5 nano C6
- Je n’avais pas ca chez moi. Donc je ne pourrai pas valider la portée de ceux-ci. Apres avoir testé un un simple esp32 dev kit ( sans antenne externe ) , je me suis apercu que la distance ok entre la tesla et l’esp est ridiculement petite
- J’avais un seul modele avec antenne externe donc mes tests ont été fait avec un XIAO espC3 que j’avais chez moi et avec une petite antenne externe. La portee n’est pas ouf mais ca fonctionne en placant l’esp dans mon sous sol et la tesla a l’exterieur a quelques metres de la porte de garage fermée. Ca rends l’usage facile pour moi, je valide donc ce module traversant un mur de beton meme si pas ideal pour utiliser wifi et ble en meme temps. Au pire on peut l'equiper d'une plus grosse antenne si necessaire.
- Un lot de 3 coute 18€ - 3€ de coupon soit 5€ l’unite ce jour sur https://s.click.aliexpress.com/e/_c3PkGdxt

Il doit y avoir mieux. ( une carte esp poe avec ethernet et antenne ble externe separée par exemple ) . Mais ca sera plus cher et ca ne compilera pas forcement sans modif.
Un esp32devkit avec une portee ok si dans la meme pièce est possible aussi:
https://s.click.aliexpress.com/e/_c3LELowb

2- Une install Home assistant. Je ne vais pas detailler ce point mais HAOS s’installe en 5 minutes assez facilement sur toute machine virtuelle ou petit pc dédié. Un petit domaine perso en https pour le flashage facilitera un peu les chose mais ca n’est pas indispensable. Attention, une fois installé , on veut tout automatiser…
3- Dernier detail, une tesla… :clin:
C’est tout…Et cela vous permettra de faire des scenarios reellement « smart » ( avec 5€ ) pour la charge, pourtant impossible a faire pour les bornes « smart » ( depassant les 1000€ )😊 . Ca fonctionnera néanmoins en complement de celles-ci utilisées alors en chargeur basique.


1- La compilation du firmware esp-home. Recup param vehicule
a. Plusieurs methodes mais je vais indiquer ici celle qui me semble la plus simple pour quelqu’un ne connaissant rien en esp. Il faut noter que la version du github ne compile pas sans erreur actuellement pouvant decourager les testeurs.
b. Recup du VIN : Aller juste sur votre app tesla ou compte tesla pour recuperer votre VIN. Exemple "XP7YGCEL0PBXXXX92"
c. Recup mac address BLE de votre vehicule . Le plus simple est d’installer une app android ( ou ios ) . BLE scanner fait ca tres bien sur android. . Ca sera quelque chose comme : 74:46:B3:66:XX:XX Assez simple a determiner car juste a coté , ca sera le signal le plus fort et le nom BLE devrait ressemble a « S___________C »
2- Installer l’addon esphome dans home assistant ou mettre a jour .
3- Editer secrets.yaml ( en haut a droite) et ajouter/modifier les lignes suivantes

Code : Tout sélectionner

# Your Wi-Fi SSID and password si pas existant
wifi_ssid: "ssidcustom"
wifi_password: "pass"
# pour la mise a jour par wifi, sans est ok si non parano
ota_password: ""
# en cas de probleme connection a votre reseau wifi, un hotspot est emis par l'esp pour s'yconnecter et corriger mais le plus simple est d'avoir une config correcte.
wifi_hotspot_password: "pass"
# tesla
ble_mac_address: "74:46:B3:66:XX:XX"
tesla_vin: "XP7YGCEL0PB09XXXX"
# a personnaliser, garder la votre
api_encryption_key: "t4W2Jays5nttJVmOU2ylDOu+4tYNtl4BSji0+5xt+dE=" 
4- Creer le fichier de config suivant ( verifier ok au 18/8 sur derniere version esphome ). La version du repo yoziry ne compilera pas actuellement sans modif. Le fork de PedroKTFC est ok.

Code : Tout sélectionner

substitutions:
  # all substitutions for this project
  friendly_name: Tesla BLE
  device_name: "tesla-ble-sous-sol"
  device_description: Tesla BLE
  ble_mac_address: !secret ble_mac_address
  tesla_vin: !secret tesla_vin
  charging_amps_max: "32"

esp32:
  board: esp32dev  # set as needed for your board
  # si besoin de traverser un mur en beton ou portee plus grande, ce module ci dessous avec antenne externe y arrive, pas le esp32 dev kit, decommenter les 2 lignes en dessous et commenter la ligne ci dessus
  #board: seeed_xiao_esp32c3
  #variant: esp32c3
  framework:
    type: esp-idf

api:
  encryption:
    key: !secret api_encryption_key

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

external_components:
  source: github://PedroKTFC/esphome-tesla-ble

packages:
  base:  github://PedroKTFC/esphome-tesla-ble/packages/base.yml
  common: github://PedroKTFC/esphome-tesla-ble/packages/common.yml
  project: github://PedroKTFC/esphome-tesla-ble/packages/project.yml
  client: github://PedroKTFC/esphome-tesla-ble/packages/client.yml
  # listener: github://PedroKTFC/esphome-tesla-ble/packages/listener.yml # Uncomment this to scan find your VIN BLE MAC address

esphome:
  name: ${device_name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}
  libraries:
    - TeslaBLE=https://github.com/PedroKTFC/tesla-ble.git

tesla_ble_vehicle:
  odometer: # miles by default, edit the entity in home assistant if you need km
    name: "Compteur" # Rename if desired
# At the time of writing, these are set to the default values. If you require a different value, uncomment and edit the value
#  update_interval: 2s # Base polling interval, used for VCSEC sensors
#  post_wake_poll_time: 300 # How long to poll for data after car awakes (s)
#  poll_data_period: 60 # Normal period when polling for data when not asleep (s)
#  poll_charging_period: 2 # Period to poll for data when charging (s)
5- Upload du firmware.
a. Connecter l’esp a votre PC et suivez la procedure de l’addon esp home. A un moment, remplacer le fichier de config initialisé par celui-ci-dessus et relancer l’install. Si vous n’etes pas en https, choisissez « manual download » et vous pourrez l’installer sur votre esp a partir du site https://web.esphome.io/ . On pourra choisir ensuite une mise a jour par wifi.

6- Retourner sur les intégrations home assistant, home assistant devrait avoir trouvé votre nouvel esp une fois relancé avec ce firmware juste compilé , vous pouvez l’ajouter à HA.
7- Si vous allez ensuite sur les devices de home assistant en cherchant votre esp , vous arriverez a la page de config du device. Il faut valider que le signal wifi est correct ainsi que le signal ble. ( > -80db , donc -60db est ok )
8- Le plus dur est fait si connecté au wifi et le signal ble est correct . Un bon signal est necessaire pour la procedure d’appairage. Redemarrer votre esp, aller sur la page du device home assistant , cliquer sur « pair key » , votre tesla devrait vous proposer d’ajouter une clé en placant votre carte sur l’endroit dédié. Accepter sur la tesla. ( J’ai du faire la manip 2 fois et le redémarrage de l’esp a aidé ). Soyez patient, le message sur la tesla peut ne pas etre immediat. Renommer la clé ajoutée sur votre tesla pour vous souvenir de son usage.
9- Ca y est , c’est fait, la page du device sur HA vous permet de controler votre tesla localement sans limite ou de remonter les infos de votre tesla dans home assistant . Un petit coup de klaxon permet de verifier a distance…J’essaierai de faire un tuto pour un exemple de scripting du contrôle de la charge un peu plus tard…

Recharge à 1A en cours possible...
Image

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 18 août 2025 17:39
par fastm3
Bon , vous pouvez desormais controler la charge de votre tesla dynamiquement. L'usage le plus judicieux est d'utiliser votre surplus solaire pour charger votre Tesla "gratuitement" avec votre petit controleur à 5€.
A noter que les bornes "smart" ont besoin d'un talon minimum a 5A, les premiers 1200W de surplus ne sont donc pas utilisables avec ces bornes. Avec notre esp à 5€ , nous , on peut... :like:

Je vais juste montrer brievement comment faire mais l'idee est de personnaliser en fonction de votre systeme et de votre logique. Pour faire cela, il faudra bien sur dans votre systeme, avoir les sensor d'info de surplus . J'ai une batterie domestique et suis en zero export donc mon surplus est indiqué par la puissance de charge ou decharge de ma batterie LFP.
Pour l'instant, je donne juste la priorité a la batterie domestique jusqu'a un pourcentage donné. ( environ 50% pour moi , ce qui me permet d'etre alors 100% autonome aussi pour la nuit ). On peut inverser les priorités ou ajouter plusieurs niveaux de priorité en cascade facilement. Je verifie aussi que mon onduleur n'est pas au max de sa puissance et je limite alors la charge a ce moment la. ( une sorte de delestage automatique )
J'ai une "technique" de programmation particuliere sur home assistant des qu'on a besoin d'un peu de code ou scripting. Libre a vous de separer comme moi dans un script a part la logique ou de laisser cela dans l'automatisation.
Je fais cela pour 2 raisons:
La lisibilité. La logique fait juste quelques lignes et est facilement modifiable meme par quelqu'un d'autre.
Le "debug". Je passe par les variables home assistant. Apres une execution, on va dans l'historique du script et on selectionne la derniere. Dans la partie variable modifié, j'ai toutes les valeurs clairement visibles permettant de voir instantanement si il y a eu une erreur de logique.
J'ai un peu de mal avec les automatisations tout a la souris ou nodered des que ca devient enorme. C'est illisible sans devoir tout regarder individuellement chaque etape. c'est ok pour des taches relativement simples mais des qu'il y a un peu de logique , le script avec variables intermediaires s'impose pour moi. ( Passé de développeur logiciel...)
Dernier conseil generique ( nouveau pour moi , testé avec ce projet ) . En cas de pb de syntaxe, demander a chatgpt : corrige ce code : <code> et c'est souvent ultra efficace juste pour cette partie de syntaxe. Je ne demande pas de generer le code ou de le remodifier car moins lisible. Je prefere garder ma lisibilité.
La version est simple ( pas de mode different, pas de helper variable pour modifier en dynamique les variables inputs ) juste pour qu'elle soit facile a lire et reproduire mais aussi a faire evoluer.

Bon voila mon automatisation pour le surplus, ultra simple . Aller dans parametres, automatisation, creer une automatisation
On l'execute toutes les 30 secs. On lance seulement a une plage horaire ou il y a potentiellement du surplus pour ne pas interferer avec une charge nocturne . On verifie que la tesla est a la maison pour charger. ( avec le sensor de l'integration tesla officielle mais teslamate est aussi possible ) . Pas vraiment necessaire car en ble , on est forcement local. On verifie que notre petit sensor.tesla_ble_charging_state est dans l'etat charging ou stopped depuis 5 minutes. Si ces conditions sont remplises, on lance notre script ou se trouve la logique de calcul de l'amperage de charge. Ca se fait en clic-clic mais voila le yaml pour info pour la partie automatisation.

Code : Tout sélectionner

alias: Gestion charge Tesla en mode solaire ou autre
description: ""
triggers:
  - id: tick
    trigger: time_pattern
    seconds: /30
conditions:
  - condition: state
    alias: La voiture est a la maison
    entity_id: device_tracker.m_y_perf_location_tracker
    state: home
  - alias: Charging ou Stopped depuis 5min
    condition: or
    conditions:
      - condition: state
        entity_id: sensor.tesla_ble_charging_state
        state: Charging
      - condition: state
        entity_id: sensor.tesla_ble_charging_state
        state: Stopped
        for:
          hours: 0
          minutes: 5
          seconds: 0
  - condition: time
    after: "09:00:00"
    before: "20:00:00"
actions:
  - action: script.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: script.calcul_amperage_charge_tesla
mode: single
Et voila le script visuellement et en yaml ( parametres, automatisation, onglet script, creer un script )
Image

Code : Tout sélectionner

sequence:
  - variables:
      description: Calculer l'amperage  de charge et l'affecter
      valeur_pourcentage_minimal_batterie_maison: 46
      valeur_puissance_batterie: "{{ states('sensor.deye8_battery_power') | float(0) }}"
      soc_batterie_maison: "{{ states('sensor.deye8_battery_soc') | float(0)}}"
      courant_charge_actuel: "{{ states('sensor.tesla_ble_charge_current') | float(0)}}"
      valeur_output_puissance_deye: "{{ states('sensor.deye8_Power_nonessential_excluding_mo') | float(0) }}"
      courant_charge: |
        {% if valeur_puissance_batterie > 0 %}
          {{ [(courant_charge_actuel - (valeur_puissance_batterie / 250)), 0] | max | int }}
        {% else %}
          {{ [(courant_charge_actuel - (valeur_puissance_batterie / 250)), 32] | min | int }}
        {% endif %}
      courant_charge_limited: >
        {% if soc_batterie_maison <  valeur_pourcentage_minimal_batterie_maison
        %}
          0
        {% elif valeur_output_puissance_deye > 8000 %}
          {{ [ courant_charge_actuel - ((valeur_output_puissance_deye - 8000) / 230), 0 ] | max | int }}
        {% else %}
          {{ courant_charge }}
        {% endif %}
  - alias: On allume le chargeur si amp > 0 et chargeur eteint
    if:
      - alias: si amp > 0 et chargeur eteint
        condition: template
        value_template: >-
          {{ courant_charge > 0 and is_state('switch.tesla_ble_charger', 'off')
          }}
    then:
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: switch.tesla_ble_charger
  - alias: Set Valeur Charge Courant tesla
    action: number.set_value
    metadata: {}
    data:
      value: "{{courant_charge_limited | int(0)}}"
    target:
      entity_id: number.tesla_ble_charging_amps
alias: calcul amperage charge tesla
description: Gerer charge tesla
icon: mdi:flash-auto

Toute la logique est dans ces quelques lignes:

Code : Tout sélectionner

      courant_charge: |
        {% if valeur_puissance_batterie > 0 %}
          {{ [(courant_charge_actuel - (valeur_puissance_batterie / 250)), 0] | max | int }}
        {% else %}
          {{ [(courant_charge_actuel - (valeur_puissance_batterie / 250)), 32] | min | int }}
        {% endif %}
Ca reste tres lisible et maintenable facilement.
En sortie de debug apres execution, j'ai d'un seul coup d'oeuil la sortie suivante:

Code : Tout sélectionner

valeur_pourcentage_minimal_batterie_maison: 18
valeur_puissance_batterie: -2514
soc_batterie_maison: 19
courant_charge_actuel: 0
mode_charge: solaire
valeur_output_puissance_deye: 622.8
courant_charge: 10
courant_charge_limited: 10
Permettant de voir le bon fonctionnement de "l'algo"

J'ai du faire des raccourcis et je n'ai pas été jusque l'interface mais ca vous montera qu'avec peu de moyen, on peut gerer la charge de sa tesla de maniere beaucoup plus intelligente que n'importe quelle borne "smart".

On peut faire la visualisation de la charge avec HA ( pas de charge tesla normalement a 19% mais modifié juste pour vous... )
Image

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 19 août 2025 00:57
par msevestr
Merci ! Je cherchais un moyen de controler localement suite aux restrictions (et complexités) avec les API Tesla pour adapter ma charge à mon excédent de solaire. C'est désormais possible :)

J'ai utilisé un module WROOM32 qui trainait (acheté sur amazon). Côté portée, ce module a réussit à attraper la voiture du milieu de la maison, soit une quinzaine de mètres, mais en pratique il sera dans une pièce à 3m de la voiture pour les usages quotidiens).
Côté réactivité on est de l'ordre de la seconde pour la consigne voiture et il faut compter 2.5/3 secondes pour qu'une modif sur l'appli Tesla se reflète sur HA, ou réciproquement, donc c'est très rapide.

Du côté des adaptations que j'ai dû faire:
* déclarer "ota_password" et "wifi_hotspot_password" dans secret.yaml pour satisfaire les attentes du fichier packages/base.yml du projet
* dans le fichier de config, j'ai du changer la clé dans "encryption" (générée par la commande "openssl rand -base64 32" sous le terminal MacOS), la clé de la conf de l'étape 4 est rejetée comme incompatible avec les attendus (32 octets, base64)
* changer les directives esp32 de la configuration comme suit:

Code : Tout sélectionner

esp32:
  board: esp32dev
  framework:
    type: esp-idf
Pour l'adresse MAC BLE de la voiture, j'ai utilisé le sniffer intégré au projet (en décommentant la ligne "listener: github://PedroKTFC/esphome-tesla-ble/packages/listener.yml"), mais avec un scanner sous android ca aurait fait le job (oubliez sous l'écosystème apple, j'ai pas trouvé de scanner capable). Important: si vous utilisez ce scanner intégré, une fois l'adresse récupérée, il faut recommenter la ligne et faire un clean build (afin que le sniffer BLE de l'ESP32 soit à coup sûr désactivé). Pour le listener BLE intégré, il suffit, une fois l'ESP32 flashé, d'aller voir le log sour ESP Home et il y a des infos du genre.

Code : Tout sélectionner

[00:16:59][D][tesla_ble_listener:046]: Parsing device: [AA:BB:CC:16:7C:XX]: 
[00:16:59][D][tesla_ble_listener:046]: Parsing device: [BB:CC:DD:27:FE:XX]: 
[00:17:00][D][tesla_ble_listener:046]: Parsing device: [XX:XX:XX:XX:XX:XX]: S1a2b3c4d5e8fC
[00:17:00][I][tesla_ble_listener:050]: Found Tesla vehicle | Name: S1a2b3c4d5e8fC | MAC: XX:XX:XX:XX:XX:XX
Enfin, j'ai un peu galéré pour l'apparairage avec la voiture... jusqu'au moement où j'ai regardé les logs de l'ESP32:

Code : Tout sélectionner

[00:40:28][I][tesla_ble_vehicle:1259]: Starting pairing
[00:40:28][I][tesla_ble_vehicle:1260]: Not authenticated yet, building whitelist message
[00:40:28][I][tesla_ble_vehicle:1280]: Please tap your card on the reader now.
donc au moment où on clique sur la commande d'appairage sur HA, il faut poser la carte clé au bon endroit dans la Tesla et bim, le popup d'ajout de clé apparait :)
Image

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 19 août 2025 09:50
par fastm3
@msevestr
Cool, merci pour le retour. Ca fait plaisir car mon premier succes avec la version de yoziruzu a été compliqué en obligeant d'abord d'installer un docker special pour une ancienne version de esphome, et des changements de config meme pour le simple esp dev kit. Le fork de pedro a le grand avantage d'etre compilable facilement dans l'environnement actuel de home assistant. Tu as gagné pas mal de temps par rapport a moi et c'est le but de ce post.
Oui, pour la clé api, je l'ai changé pour forcer a la changer. Je l'ai mis desormais dans secrets et une valide pour que ca soit encore plus simple meme s'il est conseille d'en avoir une perso. Oui, un espdevkit est ok si dans la meme piece, dans mon cas, le signal doit traverser un mur beton et une porte metallique et ca une carte esp32 dev n'y arrive pas avec son antenne integrée.
Pour l'adresse BLE, oui, on peut commenter la ligne du listener mais ca implique 2 compilations successives et expliquer comment lire les logs. J'ai trouvé plus simple et rapide l'usage d'une app tel pour ca. On gagne quelques minutes.
Pour l'appairage, c'est plus simple de laisser la clé statique au bon endroit en fait.
J'ai modifié le poste original avec les modifs.

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 19 août 2025 10:15
par msevestr
Tu as gagné pas mal de temps par rapport a moi et c'est le but de ce post.
Et je t'en remercie vivement !
Oui, un espdevkit est ok si dans la meme piece, dans mon cas, le signal doit traverser un mur beton et une porte metallique et ca une carte esp32 dev n'y arrive pas avec son antenne integrée.
Mon travail de cette nuit était loin d'être dans la même pièce - mais j'ai été étonné que ça porte aussi loin (sur les 15m, deux murs porteurs sont traversés pour atteindre la voiture ! (maison de 1977, je précise)).
Pour l'appairage, il faut idéalement être au plus près.
L'espdevkit peut satisfaire les besoins selon les cas (chez moi, il est maintenant installé dans le garage, avec un mur porteur à traverser et 3/4m d'air pour atteindre la voiture (elle est garée dehors). Ca capte à -80/-90dBm, et ca fonctionne sans soucis.
Pour l'adresse BLE, oui, on peut commenter la ligne du listener mais ca implique 2 compilations successives et expliquer comment lire les logs. J'ai trouvé plus simple et rapide l'usage d'une app tel pour ca. On gagne quelques minutes.
Ouaip. Je donnais l'info pour ceux qui seraient dans l'écosystème Apple : j'ai dû passer par le sniffer intégré faute de trouver un outil qui remonte les adresses MAC BLE (ce qui ne signifie pas qu'il n'existe pas - mais au moins ca confirme que le sniffer fonctionne, si besoin :))
Pour l'appairage, c'est plus simple de laisser la clé statique au bon endroit en fait.
Probablement, oui. En tout cas, c'est un point à expliciter dans la procédure d'appairage ;)

Matt

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 22 août 2025 15:55
par msevestr
Salut

grâce au contrôleur ESP32 pour la Tesla, j’ai mis en place sous Node-RED (sous Home Assistant) une régulation automatique de la charge de la Tesla en fonction du surplus solaire.

Le principe est le suivant : sur la base d'une puissance surveillée révélatrice d'une sous/surproduction solaire (dans mon cas la charge/décharge de ma batterie photovoltaïque, mais pour ceux qui n'en ont pas, c'est adaptable sur la base de ce qui est réinjecté sur le réseau), une boucle de contrôle est en place, avec pour objectif de maintenir cette puissance proche de 0 W.

En pratique, ça permet à la Tesla branchée en charge et lorsque j'active le système de régulation de charge de se comporter comme une « charge tampon » :
  • quand il y a du soleil, la Tesla prend automatiquement le surplus de production,
  • quand le soleil baisse ou les charges de la maison augmentent, la charge de la Tesla est diminuée pour donner priorité à la maison.
L’ampérage de charge de la voiture est borné entre une valeur minimale et maximale (0 à 13 A dans mon cas, car c'est le chargeur mobile que j'utilise dans ce cas d'usage).

Pour éviter les variations trop rapides (effet yoyo), la régulation intègre :
  • une bande morte autour de 0 W (tant que la déviation est faible, on ne bouge pas),
  • un pas maximum par ajustement,
  • un temps minimal entre deux modifications.
A ce stade la boucle de régulation est démarrée manuellement (via l'appli HA ou au travers d'une notification smartphone qui me demande si je veux l'activer), et je vais sûrement en rester là (pas vraiment d'intérêt à réfléchir à un déclenchement auto).

Et voici ce que ça donne :
Image

On voir la régulation en oeuvre sur la coube violette en bas de la capture, et elle décroit naturellement avec la journée qui passe et la (sur)production solaire qui diminue

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 24 août 2025 10:11
par msevestr
fastm3 a écrit : 18 août 2025 17:39
J'ai un peu de mal avec les automatisations tout a la souris ou nodered des que ca devient enorme. C'est illisible sans devoir tout regarder individuellement chaque etape. c'est ok pour des taches relativement simples mais des qu'il y a un peu de logique , le script avec variables intermediaires s'impose pour moi. ( Passé de développeur logiciel...)
Pareil que toi, mais in fine, la logique "dure" est en général dans un noeud "fonction", donc du code, et les automatismes de HA sont vraiment limités des fois lorsqu'il s'agit de prendre en compte des logiques complexes de déclenchement... bref.

Ci dessous ma boucle sous Node Red - elle utilise 3 entrées:
* vérification que la voiture est en charge (signal venant de l'ESP32 - cela signifie aussi que la charge est bien "locale")
* la puissance de la batterie
* le courant de charge actuellement configuré

Voici le JSON pour les bricoleurs

Code : Tout sélectionner

[{"id":"939627aca897623c","type":"group","z":"579c2ab53b9cbfde","name":"Boucle de gestion de charge supervisée","style":{"label":true},"nodes":["5189cb32268a18e1","7e7dd59cb83cd60d","32a488bc9f153208","b613921564960dff","7cc1bb7819cebfb8","ecd67fcb2590b948","fd486398aff8dcf7","6dbb5a2ee5de474f","c795ee49c0fe43d8"],"x":314,"y":159,"w":1612,"h":202},{"id":"5189cb32268a18e1","type":"inject","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Tick 5s","props":[],"repeat":"5","crontab":"","once":true,"onceDelay":"1","topic":"","x":420,"y":260,"wires":[["c795ee49c0fe43d8","7e7dd59cb83cd60d","32a488bc9f153208"]]},{"id":"7e7dd59cb83cd60d","type":"api-current-state","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"charging_state","server":"ha_server","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.tesla_ble_charging_state","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"topic","propertyType":"msg","value":"charging_state","valueType":"str"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":680,"y":260,"wires":[["b613921564960dff"]]},{"id":"32a488bc9f153208","type":"api-current-state","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"battery_power_2 (W)","server":"ha_server","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.victron_system_battery_power_2","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"topic","propertyType":"msg","value":"battery_power","valueType":"str"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":700,"y":320,"wires":[["b613921564960dff"]]},{"id":"b613921564960dff","type":"join","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Regroupe les états","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"","joinerType":"str","useparts":true,"accumulate":false,"timeout":"1","count":"3","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":980,"y":260,"wires":[["7cc1bb7819cebfb8"]]},{"id":"7cc1bb7819cebfb8","type":"function","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Calcul intensité de charge","func":"// ================== Config ==================\nconst V_REF = 230;           // V\nconst MIN_A = 0;             // A min\nconst MAX_A = 16;            // A max\nconst ROUND_TO_INT = true;\n\nconst Kp = 0.6;              // gain proportionnel\nconst DEAD_BAND_W = 120;     // bande morte (W)\nconst MAX_STEP_A = 2.5;      // pas max par itération (A)\nconst MIN_STEP_A = 0.3;      // pas mini, sinon on ne bouge pas (A)\nconst COOLDOWN_SEC = 6;      // délai mini entre changements (s)\n\nconst PBATT_POSITIVE_IS_CHARGING = true; // passer à false si pBatt > 0 signifie une décharge\n// ============================================\n\n// Entrées attendues dans msg.payload:\n// { charging_state: \"Charging\"|..., battery_power: <W>, pv_power?: <W>, charging_current: <A> }\n\nconst data = msg.payload || {};\nconst charging = String(data.charging_state || \"\");\nconst pBatt = Number(data.battery_power);\nconst ampCurrent = Number(data.charging_current);\n\nif (charging !== \"Charging\" || !Number.isFinite(pBatt) || !Number.isFinite(ampCurrent)) {\n    msg.ui = { reason: \"conditions_non_remplies\", charging, pBatt, ampCurrent };\n    return [null, msg];\n}\n\n// Anti-spam temporel\nconst now = Date.now();\nconst lastChangeTs = context.get('lastChangeTs');\nif (lastChangeTs && (now - lastChangeTs) < COOLDOWN_SEC * 1000) {\n    msg.ui = { reason: \"cooldown\", remaining_ms: COOLDOWN_SEC * 1000 - (now - lastChangeTs), pBatt, ampCurrent };\n    return [null, msg];\n}\n\n// On veut amener pBatt -> 0 W en ajustant l'ampérage de la Tesla.\n// Règle de signe:\n// - Si pBatt indique \"charge\" quand il est POSITIF (ton cas), on veut AUGMENTER A quand pBatt>0\n// - Sinon, on inverserait.\nconst sign = PBATT_POSITIVE_IS_CHARGING ? 1 : -1;   // 1 => + = charge, -1 => + = décharge\n\n// Erreur \"orientée action\": eW > 0 => on doit AUGMENTER l'ampérage; eW < 0 => DIMINUER\nconst eW = sign * pBatt;\n\n// Bande morte autour de 0 W pour éviter le pompage\nif (Math.abs(eW) <= DEAD_BAND_W) {\n    msg.ui = { reason: \"deadband\", pBatt, ampCurrent, sign_mode: PBATT_POSITIVE_IS_CHARGING ? \"pos=charge\" : \"neg=charge\" };\n    return [null, msg];\n}\n\n// Commande proportionnelle en ampères\nlet deltaA = Kp * (eW / V_REF);\n\n// Limite du pas par itération\nif (deltaA > MAX_STEP_A) deltaA = MAX_STEP_A;\nif (deltaA < -MAX_STEP_A) deltaA = -MAX_STEP_A;\n\n// Ignore les micro-ajustements\nif (Math.abs(deltaA) < MIN_STEP_A) {\n    msg.ui = { reason: \"delta_too_small\", pBatt, ampCurrent, deltaA, sign_mode: PBATT_POSITIVE_IS_CHARGING ? \"pos=charge\" : \"neg=charge\" };\n    return [null, msg];\n}\n\n// Nouvelle consigne (non arrondie)\nlet newA = ampCurrent + deltaA;\n\n// Bornes min/max\nif (newA < MIN_A) newA = MIN_A;\nif (newA > MAX_A) newA = MAX_A;\n\n// Arrondi éventuel\nconst proposedA = ROUND_TO_INT ? Math.round(newA) : newA;\n\n// Anti-yoyo: après ARRONDI (évite l'égalité 1->1 par effet d'arrondi)\nconst prevA = context.get('lastA');\nif (prevA !== undefined && Math.abs(proposedA - prevA) < 1) {\n    msg.ui = {\n        reason: \"anti_yoyo\", pBatt, ampCurrent, deltaA: Number(deltaA.toFixed(2)), proposed: proposedA, prev: prevA,\n        sign_mode: PBATT_POSITIVE_IS_CHARGING ? \"pos=charge\" : \"neg=charge\"\n    };\n    return [null, msg];\n}\n\n// Mémorisation + sortie\ncontext.set('lastA', proposedA);\ncontext.set('lastChangeTs', now);\n\nmsg.payload = proposedA;\nmsg.ui = {\n    reason: \"OK\",\n    charging,\n    pBatt,\n    ampCurrent_before: ampCurrent,\n    deltaA: Number(deltaA.toFixed(2)),\n    newA: proposedA,\n    sign_mode: PBATT_POSITIVE_IS_CHARGING ? \"pos=charge\" : \"neg=charge\"\n};\n\nreturn [msg, null];\n","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1220,"y":260,"wires":[["ecd67fcb2590b948"],["6dbb5a2ee5de474f"]]},{"id":"ecd67fcb2590b948","type":"rbe","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Change Only","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":1490,"y":240,"wires":[["fd486398aff8dcf7"]]},{"id":"fd486398aff8dcf7","type":"api-call-service","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Réglage nouveau courant de charge","server":"ha_server","version":7,"debugenabled":false,"action":"number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["number.tesla_ble_charging_amps"],"labelId":[],"data":"{\"value\":\"{{payload}}\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"number","service":"set_value","mergecontext":"","x":1750,"y":240,"wires":[[]]},{"id":"6dbb5a2ee5de474f","type":"debug","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"Stop (on ne change rien)","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"ui","targetType":"msg","statusVal":"","statusType":"auto","x":1550,"y":320,"wires":[]},{"id":"c795ee49c0fe43d8","type":"api-current-state","z":"579c2ab53b9cbfde","g":"939627aca897623c","name":"charging_current","server":"ha_server","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.tesla_ble_charge_current","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"topic","propertyType":"msg","value":"charging_current","valueType":"str"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"","forType":"num","x":690,"y":200,"wires":[["b613921564960dff"]]},{"id":"ha_server","type":"server","name":"Home Assistant","addon":true}]
A noter que dans ce que j'ai instancié, entre le tick de 5 secondes et la récupération des entrées, je check un booléen qui me permet de contrôler depuis HA si je souhaite ou non avoir cette boucle de régulation).

A noter: la boucle de régulation actuelle se comporte avec un objectif de zéro charge/décharge de la batterie photovoltaique. A ce titre, c'est donc à activer une fois que la batterie PV est pleine ! (j'ai une logique en amont qui m'alerte quand mon système PV est en sous production et que la batterie PC >99.5% SOC => notification HA si la voiture est détectée à proximité du module ESP => je vais brancher, je lance la charge => HA détecte le début de charge qui, cumulé à la précédente alerte, génère une notification me demandant si je souhaite réguler (oui/non) => si je choisis oui (ou si j'active plus tard par le toggle que j'ai dans un dashboard HA), la boucle ci dessus se met en oeuvre)

Grand merci à @fastm3 pour ta trouvaille :)

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 24 août 2025 12:56
par fastm3
@msevestr A propos de nodered , il faut de tout pour faire un monde. Personne n'est parfait. :clin: Merci du partage. J'avais tenté , je n'ai pas accroché et j'ai tout remis en script avec pourtant pas mal d'heures investies dans certaines automatisations. La maintenance est tellement plus simple dans un unique fichier script quand on y revient quelques mois plus tard. ( pour moi )
Pour la logique , je prefere un simple selecteur et un mode de fonctionnement par defaut tout auto plutot que des notifs et rappels pour agir, mais c'est la ou est la force de HA. On adapte a son mode de fonctionnement.
Perso , j'ai plusieurs steps de niveaux de batterie domestique et voiture pour lancer la regulation sur l'une ou l'autre ou les deux avec la meme strategie d'empecher ( par defaut ) toute decharge de la batterie domestique dans celle du vehicule.
Juste pour info, tu indiques attendre un SOC de 99.5% de ta batterie domestique pour voir si tu as du surplus. Ca n'est probablement pas exact comme hypothese et tu perds de maniere quasi certaines quelques kwhs. Je ne connais pas ton install mais mon deye hybride commence a reguler automatiquement la production des panneaux avec un SOC de 90% . Les BMS aussi , c'est certains a 99.5%.
Il est clair qu'a 99.5%, ton onduleur ou BMS a limité la charge avec potentiellement quelques "pertes" par moment. Si batterie domestique , il faut commencer la regul de la charge tesla avant 90%. C'est plus simple aussi car a 99.5% , si tu as l'objectif de ne pas decharger ta batterie domestique, et un objectif de ne pas exporter, ton algo doit se "battre" contre celui de l'onduleur qui veut limiter le courant de charge de la domestique. Bien sur seulement quand tes panneaux ont en encore sous le talon...C'est possible en cette période généreuse.

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 24 août 2025 13:03
par msevestr
Yep, chacun fait sa sauce avec HA :) Les notifs avec action sur téléphone, c'est plus pour l'exercice, ça m'amusait d'aller regarder cet usage que je n'avais pas encore exploité ;. Un toggle sur l'UI fait parfaitement le job.

Côté système, je n'exporte pas du tout. Je suis off grid quasi tout le temps en ce moment et off grid lors des heures pleines en période hivernale. J’ai un système victron installé par mes soins.

Le seuil de 99% est un simplificateur dans mon discours :) En pratique, sur mon système, c'est le throttling des MPPT (ce qui signifie : « je pourrai délivrer plus, mais j’ai pas assez de consommateurs » - ie: batterie pleine ET la maison ne tire pas assez), qui est le véritable déclencheur, mais c'est propre au système de chacun, comme tu le dis :)

Sur mon système, et du fait de la config de mon BMS, le throttling arrive lorsque mon pack PV est aux alentours de 98-99% de SOC (j'ai notamment réglé les tensions min/max de décharge/charge du pack et des cellules afin qu'elles restent dans une zone juste avant la descente/montée de tension brutale qui existent avec le LFP (et qui sont destructeurs)). Mais je n'utilise pas le SOC comme déclencheur car par nature, non seulement car c'est une donnée qui dérive (raison pour laquelle il faut recalibrer de temps à autres), mais aussi parce que mon système Victron me met à dispo une donnée claire qui me dit "je pourrais produire plus !".

... mais nous nous éloignons du coeur du thread avec ces échanges ;)

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 17 sept. 2025 19:27
par Paso32
Bonsoir,
Après quelque semaines de galère j'ai découvert ce tuto qui actualise le contrôle local de la Tesla. Merci @fastm3 pour cette actualisation qui a du demander pas mal de travail.
J'ai réussi à connecter l'Esp avec de bons niveaux (voir pj) mais je n'arrive pas à appairer avec la Tesla. Quand j'appuie sur "pair key" rien ne se passe. J'ai envoyé des Ping à l'adresse Ip. C'est Ok. Vérifié adresse BLE de la Tesla, n° de VIN.
En comilant j'ai quelques messages d'erreur donc "key is not in the white list"
Où chercher ?

Image

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 17 sept. 2025 21:19
par fastm3
-96 db n'est pas très bon ( l'esp dev board est mauvais en reception ble ) et je sais que pour la première fois , pour le pairing, il faut un bon signal. C'est pour ca que j'ai changé pour un modele avec antenne externe.
Je te conseillerai temporairement juste pour test rapide de prendre ton esp et de le brancher sur une batterie externe pour pouvoir le tester au plus pres ou meme dans la tesla avec ton tel pour HA.
Essaie d'avoir moins de -75db au moins pour appairage mais sans etre certain que cela soit la cause. La tesla doit bien sur etre allumée en mode park.
"key is not in the white list" : je n'ai pas eu. Je suppose que tu as d'autres periph ble ignorés par l'esp. ( hypothese )
Edit: redémarre l'esp ( on-off ) et fait le pair des que tu es connecté.
Edit2: si toujours pas de succes, verifie tout de meme ton adresse ble en activant le ble listener ( en le decommentant et reupload )

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 18 sept. 2025 18:40
par msevestr
Salut

"key is not in the white list" je l'ai eu lorsque le module tentait de se connecter à la voiture, ceci une fois les MAC BLE et VIN correctement mis dans le bon fichier secret.yaml + compilation, mais que la procédure d'appairaige n'avait pas été réalisée - en gros ca dit que la voiture n'a pas reconnu l'ESP 32 et sa clé privée alors qu'il a tenté de se faire reconnaitre avec le duo MAC BLE + VIN.

Tu confirmes que tu n'avais pas ton téléphone avec toi (ou sinon, avec le bluetooth désactivé) et que tu utilises bien la carte clé pour l'appairage (indispensable) ?

La méthode est
1) avoir le module non loin de la voiture pour l'appairage
2) démarrer l'ESP
3) cliquer sur le bouton "Pair BLE key" sur HA
4) immédiatement après, poser la carte clé sur la zone appropriée de ta voiture (dépend des modèles - chargeur sans fil gauches sur un modèle récent)
... et normalement, tu devrais avoir un popup sur l'écran de la voiture au bout de quelques secondes.

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 18 sept. 2025 18:49
par Paso32
Bonsoir,
effectivement j'ai du passer à travers d'un ou plusieurs trucs:
j'avais mon téléphone en bluetooth... :yeuxciel:
le module est branché sur un HA Green à 1 mètre de l'arrière de la Tesla :top:
après avoir appuyé sur "pair ble key", j'attendais un message sur l'écran :interroge:
Merci pour avoir éclairé la procédure, je vais recommencer....

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 18 sept. 2025 18:53
par msevestr
Nope

Si tu regardes un précédent post ici, j'avais écrit:
Enfin, j'ai un peu galéré pour l'appairage avec la voiture... jusqu'au moment où j'ai regardé les logs de l'ESP32:

Code : Tout sélectionner

[00:40:28][I][tesla_ble_vehicle:1259]: Starting pairing
[00:40:28][I][tesla_ble_vehicle:1260]: Not authenticated yet, building whitelist message
[00:40:28][I][tesla_ble_vehicle:1280]: Please tap your card on the reader now.
donc au moment où on clique sur la commande d'appairage sur HA, il faut poser la carte clé au bon endroit dans la Tesla et bim, le popup d'ajout de clé apparait :)

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 19 sept. 2025 17:01
par Paso32
Merci à tous : @msevestr et @fastm3 . :Merci:
Tout fonctionne, la message pop-up de la Tesla a été immédiat.
Je vais maintenant attaquer l'automatisation de charge en fonction du surplus solaire.

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 19 sept. 2025 17:12
par bockscar2b
Je vais aussi me lancer dans le montage. Me manque juste la tesla mdr :marrant:

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 20 sept. 2025 10:04
par msevestr
Paso32 a écrit : 19 sept. 2025 17:01
Merci à tous : @msevestr et @fastm3 . :Merci:
Tout fonctionne, la message pop-up de la Tesla a été immédiat.
Cool !

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 25 sept. 2025 19:46
par guiv
Pas mal l'idée du bluetooth.
J'utilise l'API Tesla aussi avec Home Assistant et Node RED pour utiliser mon surplus solaire.

Trois problèmes pour moi avec l'API : il y a un lag de plusieurs secondes entre le changement de puissance de charge et la donnée reportée via l'API ; il n'est pas rare d'atteindre la limite d'utilisation mensuelle de l'API (je trigger mon automatisation node red toutes les 15 secondes) ; et finalement, 15 secondes c'est trop long pour les jours où il y a beaucoup d'alternances nuages/soleil.

Faire la même chose mais par pas de 1s via bluetooth résoudrait tout cela.

Juste une question que je me pose : ça ne ferait pas de mal à ma batterie et/ou BMS d'incrementer/decrementer la puissance de charge potentiellement toutes les secondes ? :interroge:

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 25 sept. 2025 21:49
par fastm3
Pas d'intérêt toutes les secondes. La réactivité pour changer l'amperage est de toutes facons bien moins bonne. Toutes les 15 secondes est largement suffisant, la tesla ne suivra déjà pas. De plus, la variation doit etre progressive si on veut preserver le rendement. On ne va pas alterner toutes les 5 secondes entre 5A, puis 20, puis 32, puis 5A par exemple. Le rendement serait aussi nul si tu mets a 10A puis si tu coupes de suite. Ca n'est pas un routeur pour charge resistive. Pour favoriser le rendement, il faut des variations faibles. Perso, mon algo final lisse les variations par des changements de 10% max arrondis toutes les 15 sec et c'est deja plus rapide que la variation sur la tesla. Ayant une batterie domestique en zero export, la batterie joue le role de "routeur" en zero export pour les moments legerements en positif ou negatif pour la charge calculé tesla suite aux variations de production. Sans batterie domestique , vue que le rendement est nul en dessous de 5A , ( et que toutes les bornes "pro" n'utilise pas le surplus dans ce cas meme si elles ne le communiquent pas ) , un routeur triac/dimmer avec une charge resistive reste utile.
En local, tu élimines le lag cloud ( et sa dependance ) et la limitation api.

Pour la variation de courant, on parle de variation "brusque" de quelques kW max la ou la batterie peut en supporter 250...Non pas de soucis.
Pour le BMS, ils sont aussi des organes de sécurité capables "normalement" de contrôler en permanence la charge. Je te dirai bientôt si ce n'est pas le cas sur la tesla sinon... :clin:

Re: Tuto: Controler en LOCAL sa tesla par domotique pour 5€ ?

Publié : 25 sept. 2025 22:18
par guiv
Merci pour ces précisions.

Enfait pour l'instant mon algo modifie de + ou - 1A toutes les 15 secondes dans la plage 5A-30A. C'est insuffisant pour les jours nuageux où je peux passer très rapidement (moins d'une seconde) de genre 2kW à 9kW de génération solaire et vice versa.

J'ai également une batterie domestique de 10kWh qui joue le tampon, mais qui décharge max à 5.8kW et charge à max 4.5kW en pic (3.6kW sur la durée), mais je remarque que ces utilisations en tampon la "stressent" beaucoup, du moins si sa température est une bonne indication de stress...

Mon objectif étant de profiter au max du surplus solaire (autrement vendu des cacahuètes au réseau car je suis en Belgique) tout en maximisant la durée de vie des batteries (domestique et EV).

Peut-être dois-je garder le même algo (+-1A) mais en bluetooth et par pas de disons... 3-4 secondes ?