UART ne fonctionne pas avec ESPHome mais le montage fonctionne

Bonjour,

Depuis quelque temps je cherche à remonter la téléinfo à mon Home Assistant. Mais apparemment je me heurte à un problème que personne ne semble avoir.

Pour faire simple, ESPHome ne m’affiche aucune information.
Le truc, c’est que mon schéma fonctionne. Pour le garantir, j’ai compilé un petit programme pour lire les informations remontées par le compteur sur mon ESP 32:

#define startFrame 0x02
#define endFrame 0x03

void setup() {
  Serial.begin(115200);
  Serial.println("test");
  Serial2.begin(1200, SERIAL_7E1);
}

void loop() {
  char charIn = 0;

  // Boucle d'attente du caractère de début de trame
  while (charIn != startFrame){
    charIn = Serial2.read() & 0x7F;
  }

  while (charIn != endFrame){
    if (Serial2.available()) {
      // on "zappe" le 8ème bit
      charIn = Serial2.read() & 0x7F;
      // on affiche chaque caractère reçu
      Serial.print(charIn);
    }
  }

  delay(100);
}

Dans mon Arduino IDE, je vois bien la remonté de toutes les informations téléinfo:

ISOUSC 30 9
BASE 010903192 $
PTEC TH.. $
IINST 003 Z
IMAX 090 H
PAPP 00770 /
HHPHC A ,
MOTDETAT 000000 B

ADCO 021775196757 P
OPTARIF BASE 0
ISOUSC 30 9
BASE 010903192 $

Donc jusqu’ici, tout à l’air d’aller bien. Par contre, dès que je cherche à utiliser ESPHome, je n’ai rien qui s’affiche. Je suis normalement revenu au plus simple en essayant tout simplement de logger l’UART:

esphome:
  name: esphome-web-fa0f60
  friendly_name: UARTLogs

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
  level: DEBUG

uart:
  id: uart_bus
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 1200
  parity: EVEN
  data_bits: 7
  debug:
    dummy_receiver: true

Mais même avec ce simple YAML, je n’ai aucune info dans les logs:

$ esphome run uart.yaml
INFO Successfully uploaded program.
INFO Starting log output from COM5 with baud rate 115200
[13:17:18]x\xf8\x80\x80x\x80\x80\x80\x80x\x80x\x80\x80\x80\xf8\x80\x80\x80x\xf8xxx\xf8x\xf8\x80\x80\x80\x80\xf8\x80x\x80\xf8x\xf8x\x80x\xf8\x80\x80\xf8\x80\x80\x80\xf8\xf8\x80\x80\x80\x800,len\xfaets Jul 29 2019 12:21:46
[13:17:18]
[13:17:18]rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
[13:17:18]configsip: 0, SPIWP:0xee
[13:17:18]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
[13:17:18]mode:DIO, clock div:2
[13:17:18]load:0x3fff0030,len:1184
[13:17:18]load:0x40078000,len:13132
[13:17:18]load:0x40080400,len:3036
[13:17:18]entry 0x400805e4
[13:17:18][I][logger:259]: Log initialized
[13:17:18][I][app:029]: Running through setup()...
[13:17:18][C][uart.arduino_esp32:077]: Setting up UART...
[13:17:18][I][app:062]: setup() finished successfully!
[13:17:18][I][app:102]: ESPHome version 2023.4.1 compiled on May  8 2023, 13:17:02
[13:17:19][C][logger:294]: Logger:
[13:17:19][C][logger:295]:   Level: DEBUG
[13:17:19][C][logger:296]:   Log Baud Rate: 115200
[13:17:19][C][logger:297]:   Hardware UART: UART0
[13:17:19][C][uart.arduino_esp32:108]: UART Bus 1:
[13:17:19][C][uart.arduino_esp32:109]:   TX Pin: GPIO17
[13:17:19][C][uart.arduino_esp32:110]:   RX Pin: GPIO16
[13:17:19][C][uart.arduino_esp32:112]:   RX Buffer Size: 256
[13:17:19][C][uart.arduino_esp32:114]:   Baud Rate: 1200 baud
[13:17:19][C][uart.arduino_esp32:115]:   Data Bits: 7
[13:17:19][C][uart.arduino_esp32:116]:   Parity: EVEN
[13:17:19][C][uart.arduino_esp32:117]:   Stop bits: 1

Je sèche, donc si quelqu’un a une petite idée, je suis preneur :slight_smile:

Salut,

Si ça peux t’orienter voilà ce que j’ai dans le mien :

esphome:
  name: linky

esp8266:
  board: d1_mini

# Enable logging
logger:
  baud_rate: 0
  level: INFO 
  esp8266_store_log_strings_in_flash: False

# Enable Home Assistant API
api:

ota:
  password: "mon-pass"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "mon_ssid"
    password: "mon_pass"

captive_portal:
uart:
  id: uart_bus
  rx_pin: GPIO3 # Pin Rx
  baud_rate: 1200
  parity: EVEN
  data_bits: 7
  
binary_sensor:
  - platform: status
    name: "Teleinfo Status"

teleinfo:
    update_interval: 30s
    historical_mode: true

sensor:
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s
    unit_of_measurement: dB
    accuracy_decimals: 0
    force_update: false
    icon: mdi:wifi
    
  - platform: uptime
    id: uptime_seconds
    name: "Uptime Sensor"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer
    
  - platform: teleinfo
    tag_name: "ADCO"
    name: "Adresse du compteur"
    unit_of_measurement: ""
    icon: mdi:eye
    
  - platform: teleinfo
    tag_name: "IMAX"
    name: "Intensité max"
    unit_of_measurement: "A"
    icon: mdi:current-ac
    
  - platform: teleinfo
    tag_name: "ISOUSC"
    name: "Intensité souscrite"
    unit_of_measurement: "A"
    icon: mdi:current-ac
    
  - platform: teleinfo
    tag_name: "IINST"
    name: "Intensité"
    unit_of_measurement: "A"
    icon: mdi:current-ac
    
  - platform: teleinfo
    tag_name: "BASE"
    name: "Index"
    unit_of_measurement: "Wh"
    icon: mdi:gauge
    id: index_base
    
  - platform: teleinfo
    tag_name: "PAPP"
    name: "Puissance"
    unit_of_measurement: "VA"
    icon: mdi:flash
    
text_sensor:
  - platform: template
    name: Uptime
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
      int seconds = (id(uptime_seconds).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else {
        return { (String(seconds) +"s").c_str() };
      }
  - platform: teleinfo
    tag_name: "OPTARIF"
    name: "Type d'abonnement"
    icon: mdi:handshake

Bonjour,

Après plusieurs jours de galère à essayer de comprendre ce qui ne veut pas marcher chez moi, j’ai pu confirmer que c’est le composant UART d’esphome qui ne « fonctionne pas ».

Je n’ai aucune idée de pourquoi ça ne veut pas fonctionner chez moi, et ne voulant pas débugger tout le code d’UART, j’ai juste finis par reprendre le code du composant teleinfo d’esphome et je me suis connecté au serial directement dans celui-ci pour ne pas utiliser le composant UART.

Pour ceux que ça pourrait intéresser :

Pour le code, j’ai pull le composant teleinfo d’esphome et j’ai simplement supprimer toutes les références à l’héritage du composant UART pour ajouter mon propre système de connexion :

// Dans TeleInfo::setup
Serial2.begin(1200, SERIAL_7E1);

// Dans TeleInfo::read_chars_until_, on remplace read() & available() par :
Serial2.available()
Serial2.read()

Pour le YAML :

external_components:
  - source:
      type: local
      path: components

Le composant teleinfo marche exactement comme dans la doc d’esphome puisque j’ai copié / collé le code : Teleinformation from Linky electrical counter. — ESPHome

salut,

je galère depuis plusieurs jours, je pensais avoir l même problème que Silver mais finalement non.

en compilant un programme j’arrive à remonter des informations mais jamais la trame de début 0x02. du coup rien ne s’affiche dans les logs

je ne comprends pas pk, mon schéma à l’air d’être ok.

avec un adaptateur ftdi et termit je remonte bien les informations du linky en 1200baud…

J’ai changé d’esp, refais mon montage, …

quelqu’un aurait une idée ?

problème résolu… mon mofset BS170 QG 95 ne fontionnait pas, je suis passé sur C1815 CR331 et tout est ok…

Salut

Je me casse aussi les dents pour exploiter les données TIC vers HA.
J’ai une configuration un peu différente: j’ai tiré un RJ45 vers mon linky et accède à la trame TIC depuis un client TCP (avec un serveur RS485-ETHERNET). Avec l’IP et Telnet j’obtiens le flux TIC sans problème.

Maintenant je cherche à intégrer tout ça dans HA, j’ai tenté deux pistes mais mes compétences ne me permettent pas d’aboutir:

  • Avec ESPHome, il existe un composant TCP-to-UART (github.com-thegroove-esphome-serial-server) qui je suppose permet de simuler un UART depuis un client TCP et exploiter directement le composant teleinfo mais je ne sais pas comment installer et configurer le tout
  • Faire comme ‹ Silver ›, sans ESPHome en réutilisant le code mais dans mon cas avec une liaison TCP pas avec une liaison serie, mais idem je ne sais pas comment m’y prendre.

Merci pour vos éclairages