ESPHOME et lecture de données Modbus

Bonjour,

Mon problème

Je vient d’acquérir une ESP32 et donc de débuter avec ESPHOME.
J’ai bien pu configurer ce dernier pour qu’il soit visible sous HA via mon réseau wifi.
Mon objectif désormais est de lire des données sur le port série de ma VMC.
Pour cela, je me suis inspiré de ce post : ntegration-of-aerosmart-m-fresh-air-heating-system-into-homeassistant
La personne utilise une outil développé pour un raspberry : AerosmartPI

Ma première étape a donc été de prendre un PC, de brancher la VMC et de lire ce que je vois sur le port série à l’aide de Powershell :

PS C:\Users\> [System.IO.Ports.SerialPort]::getportnames()
COM3
COM6
PS C:\Users\> $port= new-Object System.IO.Ports.SerialPort COM6,115200,None,8,one
PS C:\Users\> $port.Open()
PS C:\Users\> $port.ReadExisting()
130 5212 103201
140 214 43450
130 5212 103301
140 210 11378
130 5212 103400
130 5212 103500
140 210 11683
130 5212 103600
140 800 0
140 5436 130
140 7000 0
140 7500 0
140 7566 0
130 202 6426
130 800 0
130 5344 130
130 5568 130
130 7000 0
130 7500 0
130 7566 0

Je parviens donc, via un simple cable USB, à récupérer les données.

Maintenant, je souhaite faire de même avec mon ESP32, lire des données, et ne surtout pas en écrire pour ne pas bricker ma VMC :sweat_smile:

En effet, j’ai trouvé des projets sur des forum allemands, en KNX, où il était bien souvent écrit de faire attention à ne pas écrire n’importe quoi, et comme je ne maitrise pas le sujet, je veux éviter les bêtises.

J’ai donc écrit ce bout de code en m’inspirant de la doc :

uart:
  id: mod_bus
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 115200

modbus:
  #flow_control_pin: GPIOXX
  send_wait_time: 200ms
  id: mod_bus_dw

modbus_controller:
  #Psiio Touch
  - id: pssio
    ## the Modbus device add
    address: 120
    modbus_id: mod_bus_dw
    command_throttle: 0ms
    setup_priority: -10
#    update_interval: ${updates}
  #VMC (LU)
  - id: lu
    ## the Modbus device add
    address: 130
    modbus_id: mod_bus_dw
    command_throttle: 0ms
    setup_priority: -10
#    update_interval: ${updates}
  #Pompe à chaleur (WP)
  - id: wp
    ## the Modbus device add
    address: 140
    modbus_id: mod_bus_dw
    command_throttle: 0ms
    setup_priority: -10
#    update_interval: ${updates}

sensor:
  - platform: modbus_controller
    modbus_controller_id: lu
    id: temperature_ext
    name: "Température extérieure"
    address: 202
    unit_of_measurement: "°C"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

Mon objectif est dans un premier temps de ne lire qu’une donnée, avant de tout rentrer.
La documentation indique ceci :

Voici maintenant mes questions :

  • Est-ce judicieux d’utiliser modbus plutot que juste UART ?
  • Mon code va-t-il bien se contenter de lire et non d’envoyer des données (comme ma commande powershell)?
  • Dans le code d’AerosmartPI, le premier commentaire indique :
#  In order to read a reg first a write through the serial bus should be done.
#  The ID and the Reg number incremented with 1 should be written.
#   eg: "130 201\n" will instantiate the read of register 200
#  D&W will respond with a string which contains the value of the register
#   eg: "130 201 21235" This means register 200 contains the value 21235
#                       For this reg a temp of 21.235 C
  • Dois-je donc envoyer une demande afin de pouvoir lire quelque chose ? Et si oui, comment ? Et comment lire la réponse ? => L’utilisation du composant modbus gère peut-être déjà la chose …
    Bref, je me pose plein de question mais je n’ai pas envie de planter la VMC qui gère aussi le chauffage et l’eau chaude …

Merci d’avance pour votre aide.

GeoR

Ma configuration


System Information

version core-2025.3.1
installation_type Home Assistant Container
dev false
hassio false
docker true
user root
virtualenv false
python_version 3.13.2
os_name Linux
os_version 4.4.180+
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 4998
Installed Version 2.0.5
Stage running
Available Repositories 1596
Downloaded Repositories 4
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Dashboards
dashboards 3
resources 8
views 12
mode storage
Network Configuration
adapters lo (disabled), ovs_eth0 (enabled, default, auto), docker0 (disabled), tun1000 (disabled)
ipv4_addresses lo (127.0.0.1/8), ovs_eth0 (192.168.0.100/24), docker0 (172.17.0.1/16), tun1000 (169.254.147.209/21)
ipv6_addresses lo (::1/128), ovs_eth0 (fe80::211:32ff:fe99:d8f3/64), docker0 (), tun1000 (fec0:a2b2:4::3d1/112)
announce_addresses 192.168.0.100, fe80::211:32ff:fe99:d8f3
Recorder
oldest_recorder_run 26 février 2025 à 00:30
current_recorder_run 11 mars 2025 à 09:26
estimated_db_size 251.40 MiB
database_engine sqlite
database_version 3.48.0

Salut à tous,

J’essaie d’avancer doucement, en décortiquant le code d’aerosmartpi, qui utilise la fonction python « serial ».
Du coup, en fouillant, j’ai l’impression qu’il vaut mieux utiliser directement l’UART, comme cela a été fait dans ce post how-to-transfer-data-from-uart et décrit dans la documentation ici : https://esphome.io/components/uart.html.

J’ai donc branché la pin 17 sur la borne D+ et la pin 16 sur la D- du mon adaptateur USB :

Mais je n’arrive à rien lire, même en inversant D+ et D- :frowning:
Faut-il également brancher les bornes V+ et - ? ET si oui, sur quoi ?

Sinon, en branchant en direct sur le PC (câble USB-A vers USB-B), j’arrive bien à lire avec powershell et à récupérer des données, via la commande write, en m’inspirant du code python (je mets +1 au numéro de registre) :


PS C:\Users\> $port.WriteLine("130 203")
PS C:\Users\> $port.ReadExisting()
130 203 6878
PS C:\Users\> $port.WriteLine("130 1185")
PS C:\Users\> $port.ReadExisting()
130 1185 0

J’ai don bien un problème de branchement … :frowning:

Salut,
Tu branches directement D+ et D de l’USB sur des entrées UART de ton esp32 ? Si c’est ça ça ne marchera pas, l’UART fonctionne en TTL il faut donc un convertisseur USB-TTL du genre ftdi.

Salut et merci pour ton retour!

En effet, l’USB ne peut fonctionner en direct mais dans mon cas, il me semble que l’utilisation de l’USB pour la VMC n’est qu’un support physique matériel pour du TLL derrière.

En effet, j’ai cru comprendre que le signal d’origine est en TTL.
D’ailleurs, on peut trouver en option (pour 400€ :grimacing:) un convertisseur TTL / RS232 pour la VMC.
On peut le voir sur ce projet : OpenHAB - drexel weiss device integration

D’ailleurs, pour connecter mon PC à la VMC, j’utilise un simple câble USB A - USB B, et c’est reconnu sans aucun pilote, en tant que « USB Serial Port » dans le gestionnaire de périphériques (idem projet sous raspberry):
image
Et du coup, j’arrive à communiquer via powershell avec les commandes System.IO.Ports.SerialPort.

Dois-je donc tout de même avoir un matériel particulier ?
Je veux « juste » pouvoir faire ce que je fais avec Powershell avec l’ESP32…

Sinon, j’ai essayé de raccorder le GND de l’ESP32 au - du port USB, sans plus de succès (j’ai tenté d’inverser Rx et Tx aussi).

Merci d’avance pour votre aide.

Ça aurait été possible qu’ils se servent de l’USB en tant que simple connecteur physique pour transporter une liaison série TTL, mais le fait que ça fonctionne en le branchant au port USB du PC ça prouve bien que ce n’est pas le cas, c’est une liaison série sur du protocole USB. Tu n’as pas eu besoin de driver car Windows a déjà les drivers basiques pour les principales liaisons séries.
Trouve un convertisseur TTL/USB pour tester, ça coûte quelques euros, tu perdras pas grand chose au pire :wink:

Ok merci, c’est ce genre de chose ?

Module FTDI FT232RL FT232 à 6 broches pour Arduino, adaptateur de fil série USB vers TTL UART, Module de câble de téléchargement RS232, indicateur LED

Ou ça :
Adaptateur série USB 2.0 vers TTL Original CH340 CH340G, câble de téléchargement pour Arduino Raspberry Pi Windows 10/Mac OS X/Linux, câble de 1M

D’après les descriptions les deux devraient fonctionner, personnellement moi j’ai celui-ci

Ok, merci, c’est commandé :+1:

En attendant ma commande, j’ai regardé de plus près la carte électronique de la VMC et elle contient bien un ftdi :


Je me suis donc demandé, ne peut-on pas utiliser l’uart 0 et le port USB de la carte directement, vu que les mises à jour se font en wifi … :hugs:

Salut,
Me voici de retour.
Bon, j’ai testé avec un premier module CH430 sans succès, donc j’ai commandé le module FTDI comme toi @djtef.

Avec le PC, j’arrive bien à communiquer avec l’ESP32 (j’envoie une commande, il la lit), mais il ne lit rien de la VMC :frowning: , alors que le PC lui, voit bien la communication de la VMC.
Voici le code :

uart:
  baud_rate: 115200
  tx_pin: GPIO17
  rx_pin: GPIO16
  debug:
    direction: BOTH
    dummy_receiver: true
#    after:
#      delimiter: "\n"
    sequence:
      - lambda: UARTDebug::log_string(direction, bytes);

Bref, si vous avez une idée, je suis preneur, je n’aime pas m’avouer vaincu :stuck_out_tongue:

Par contre, en parallèle, j’ai pu trouver sur de vieux posts de forum KNX allemand, qu’il y a un port RS485 modbus et par là, j’arrive à quelque chose :slight_smile: . Donc pour le moment, je creuse de ce coté, avec les outils modbus d’EPSHome.

A voir à quoi j’arrive :slight_smile:

Bonne journée !