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