Téléinfo via wifi

Oui absolument! J’obtiens toutes les données en mode Standard. Le journal du MCU dans ESPHome affiche également les étiquettes reconnues.

Avez-vous vraiment changé le mode de le Linky?
Ou est-il possible que votre circuit optocoupleur pose des problèmes à 9600 bauds?

Ma première étape a été de vérifier la connexion de données sans le composant Teleinfo. Je l’ai fait avec une configuration ESPHome différente. Cela lit simplement les données ligne par ligne à 9600 bauds et les affiche dans le journal:

esphome:
  name: mcu_d1_mini_01
  platform: ESP8266
  board: d1_mini

  build_path: mcu_d1_mini_01_rs232

  includes:
  - uart_read_line_sensor.h

wifi:
  ssid:     !secret fritzbox_wlan_sid
  password: !secret fritzbox_wlan_pwd

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "D1 mini 01"
    password: !secret esps_fallback_hotspot_pwd

captive_portal:

# Enable logging
logger:
  level: VERBOSE #makes uart stream available in esphome logstream
  baud_rate: 0 #disable logging over uart

# Enable Home Assistant API
api:
  password: !secret esps_api_pwd

ota:
  password: !secret esps_ota_pwd

uart:
  id: uart_bus
  tx_pin: GPIO1
  rx_pin: GPIO3
  #baud_rate: 115200
  baud_rate: 9600
  #baud_rate: 1200
  parity: EVEN
  data_bits: 7

text_sensor:
  - platform: custom
    lambda: |-
      auto my_custom_sensor = new UartReadLineSensor(id(uart_bus));
      App.register_component(my_custom_sensor);
      return {my_custom_sensor};
    text_sensors:
      id: "uart_readline"

De plus, vous devez créer le fichier /config/esphome/uart_read_line_sensor.h:

#include "esphome.h"

class UartReadLineSensor : public Component, public UARTDevice, public TextSensor {
 public:
  UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}

  void setup() override {
    // nothing to do here
  }

  int readline(int readch, char *buffer, int len)
  {
    static int pos = 0;
    int rpos;

    if (readch > 0) {
      switch (readch) {
        case '\n': // Ignore new-lines
          break;
        case '\r': // Return on CR
          rpos = pos;
          pos = 0;  // Reset position index ready for next time
          return rpos;
        default:
          if (pos < len-1) {
            buffer[pos++] = readch;
            buffer[pos] = 0;
          }
      }
    }
    // No end of line has been found, so return -1.
    return -1;
  }

  void loop() override {
    const int max_line_length = 80;
    static char buffer[max_line_length];
    while (available()) {
      if(readline(read(), buffer, max_line_length) > 0) {
        publish_state(buffer);
      }
    }
  }
};

Avec ce programme, j’obtiens les données suivantes dans le journal:

[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'ADSC	0418.........	A'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'VTIC	02	J'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'DATE	E210520033243		7'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'NGTF	      BASE      	<'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'LTARF	      BASE      	F'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EAST	020102629	%'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF01	020102629	8'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF02	000000000	#'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF03	000000000	$'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF04	000000000	%'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF05	000000000	&'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF06	000000000	''
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF07	000000000	('
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF08	000000000	)'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF09	000000000	*'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASF10	000000000	"'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASD01	020102629	6'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASD02	000000000	!'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASD03	000000000	"'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'EASD04	000000000	#'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'IRMS1	000	.'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'IRMS2	001	0'
[03:32:40][D][text_sensor:015]: 'uart_readline': Sending state 'IRMS3	002	2'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'URMS1	237	F'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'URMS2	233	C'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'URMS3	239	J'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'PREF	30	B'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'PCOUP	30	\'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SINSTS	00639	X'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SINSTS1	00063	@'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SINSTS2	00156	D'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SINSTS3	00420	?'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN	E210520003340	05013	''
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN1	E210520003338	01549	)'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN2	E210520003338	01672	''
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN3	E210520030914	02638	+'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN-1	E210519084029	05225	_'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN1-1	E210519065313	01482	L'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN2-1	E210519071212	01734	H'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'SMAXSN3-1	E210519194707	02972	]'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'CCASN	E210520033000	01716	7'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'CCASN-1	E210520030000	00434	N'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'UMOY1	E210520033000	234	$'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'UMOY2	E210520033000	231	"'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'UMOY3	E210520033000	243	&'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'STGE	003A0001	:'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'MSG1	PAS DE          MESSAGE         	<'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'PRM	055156........	3'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'RELAIS	000	B'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'NTARF	01	N'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'NJOURF	00	&'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'NJOURF+1	00	B'
[03:32:41][D][text_sensor:015]: 'uart_readline': Sending state 'PJOURF+1	00008001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTIL'

Oh, et avez-vous changé les noms des étiquettes? Le mode standard utilise des étiquettes différentes du mode historique!

Si ce deuxième PR est accepté, nous aurons également un schéma de circuit dans la documentation ESPHome Teleinfo: Teleinfo: fix tag_name and add circuit example by Jpsy · Pull Request #1185 · esphome/esphome-docs · GitHub

Dans ce PR, j’ai également corrigé la propriété actuellement incorrecte tagtag_name.

@Jpsy
Oui les etiquettes etaient changées pour le mode standard
Tout fonctionne et avec ton debug code et avec mon fichier yaml et surtout ton conseil pour le fix temporaire en attendant la correction officielle esphome teleinfo.
Je pense maintenant que c’etait un probleme de fils et de cables, vu qu j’ai du toucher pour remettre un wemos.Je ne suis pas bon en soudure…

Merci de tes conseils et pour declarer le pb esphome.
Pierre

1 « J'aime »

Hello Sylvain.
D’après ton code, je devrais avoir une mesure toutes les 2 secondes (update_interval: 2s).
Hors je vous dans la base InfluxDB qu’il y a une valeur par seconde .
A quoi sert cette valeur de 2 secondes ?

Je souhaite utiliser ces valeurs pour calculer des W.h sous grafana.
J’ai tenté la fonction integral mais elle ne donne rien de cohérent.
Comment fais tu ?
Merci d’avance
Phil

J’ai créé un nouveau PR pour adresser d’autres problèmes essentielles du mode standard de Linky:
https://github.com/esphome/esphome/pull/1829

Avec ce PR, il est désormais possible de lire des étiquettes contenant un horodatage. Ces étiquettes n’ont renvoyé que 0 jusqu’à présent. Il est également possible de lire l’horodatage soi-même dans un capteur. Cela peut être utilisé, par exemple, pour lire l’heure de la charge la plus élevée en étiquette SMAXSN.

Pour installer le PR directement:

La nouvelle documentation se trouve ici: https://deploy-preview-1197–esphome.netlify.app

De mon avis avec ça il ne manque qu’une seule fonction à réaliser pour le mode standard:
Lire des messages et des informations textuelles avec des capteurs de type Text Sensor. Peut-être je vais addresser ça plus tard.

PS: Si vous avez testé le PR chez vous, vous êtes invités à laisser un commentaire avec confirmation ou un message d’erreur à Github.

1 « J'aime »

Bonjour,
Depuis le changement du BS170, tout fonctionne sauf que j’ai énormément de bad CRC.
Je suis en mode historique . Le circuit est à 20 cm de la sortie du TIC.
En fait, je ne récupère que moins du 1/3 des valeurs ce qui m’empêche de faire des calculs sous grafana (sur une période d’une heure, seulement moins de 1000 mesure au lieu des 3600). L’intégration des valeurs donne un résultat aléatoire .
N’ayant pas d’oscilloscope, je ne peux pas analyser les signaux jusqu’à l’entrée de l’ESP32.
qui

Qui aurait une piste ?
Merci d’avance
Philippe

Extrait du log :


[07:21:27][I][app:105]: ESPHome version 1.17.2 compiled on May 14 2021, 16:37:09
[07:21:31][E][teleinfo:036]: bad crc: got 51 except 42
[07:21:33][E][teleinfo:036]: bad crc: got 79 except 76
[07:21:39][E][teleinfo:036]: bad crc: got 79 except 67
[07:21:43][E][teleinfo:036]: bad crc: got 79 except 67
[07:21:47][E][teleinfo:036]: bad crc: got 79 except 67
[07:21:53][E][teleinfo:036]: bad crc: got 51 except 42
[07:21:55][E][teleinfo:036]: bad crc: got 79 except 76
[07:22:01][E][teleinfo:036]: bad crc: got 79 except 67
[07:22:05][E][teleinfo:036]: bad crc: got 79 except 67
[07:22:09][E][teleinfo:036]: bad crc: got 79 except 67

J’essaierais de réduire la valeur de R1. 500 ohms ne devraient pas être un problème. Le voltage effectiv à I1 / I2 est de 4 à 5 volts. Alors même 250 ohms seraient OK.

Merci je vais essayer
Phil

Bonjour a tous
Tout fonctionne très bien chez moi avec ce fix #2
Linky/mode standard/pitinfo1.3/wemos
les logs donnent bien des infos pour un controle. (Conso et production)
Juste ce message qui revient:
[15:01:16](Message skipped because it was too big to fit in TCP buffer - This is only cosmetic)

Pierre

1 « J'aime »

Je viens de tester en mettant une 1k en // de la 1k. Ça ne change rien. Il n’y a que moins de 25% de trames bonnes
J’ai aussi testé sans succès une autre alim et un autre câble usb .
Une autre piste ?

Cela signifie que le côté entrée de l’optocoupleur n’est probablement pas la source de l’erreur.

Du côté de la sortie, des interférences électro-magnetique peuvent entraîner des problèmes. Les signaux Wifi en particulier peuvent être une source. Soit d’un point d’accès Wifi proche, soit du MCU lui-même. J’essaierais de protéger la section entre l’optocoupleur et le MOSFET en particulier.

Comment protéger ? Blindages ? Capas ?

Blindage, connecté au moins. Par exemple une feuille d’aluminium.

voici un petit projet de shield teleinfo pour wemos d1 mini voici des infos si vous avez des idées ou voyez erreurs
Capture d’écran de 2021-06-25 17-28-46
Capture d’écran de 2021-06-25 17-23-30

bonjour

Pour ceux qui souffrent de « bad crc »,
j’ai découvert que l’on pouvait filtrer certaines valeurs

en effet pour mon cas particulier lors d’un bad crc,
les valeurs des index retournés sont a zéro

du coup un petit filtre sur cette valeur et c’est la fin des remontées d’index comme cela

image

pour la mise en oeuvre


  - platform: teleinfo
    tag_name: "HCHC"
    name: "hchc"
    filters:
      - filter_out: 0
    unit_of_measurement: "Wh"
    icon: mdi:Counter
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "HCHP"
    name: "hchp"
    filters:
      - filter_out: 0
    unit_of_measurement: "Wh"
    icon: mdi:Counter
    teleinfo_id: myteleinfo    
  - platform: teleinfo
    tag_name: "PAPP"
    name: "papp"
    unit_of_measurement: "VA"
    icon: mdi:flash
    teleinfo_id: myteleinfo

si cela peut aider

2 « J'aime »

bonjour

pourquoi il faut mettre un transistor dans le montage électrique ?

moi j’ai fait ca :
Inkedschéma-module-TIC_LI

pour l’instant mon premier montage test fonctionne

bonjour
comment convertir des VA en WATTS ?

bonjour

c’est pas si simple que cela, il faut pour cela identifier le dephasage entre U et I
c’est le fameux Cosinus( PHY)
https://g.co/kgs/vN73M9