[résolu] Teleinfo : problèmes de réception

Bonjour,
j'essaie de récupérer les données téléinfo de mon compteur. J'ai fait un petit montage pour récupérer la trame avec un optocoupleur LTV-814 :

Le code que j'utilise côté arduino est trivial pour l'instant :

#include <Arduino.h>
#include <SoftwareSerial.h>
#define TELEINFO_PIN 8
SoftwareSerial sftSerial(TELEINFO_PIN, 9);

void setup() {
  Serial.begin(9600);
  sftSerial.begin(1200);
}

void loop() {
    if(sftSerial.available()) {
      char rec = sftSerial.read()&0x7F;
      Serial.write(rec);
    }
}

Cette installation a fonctionné pendant quelques heures. Une semaine plus tard, quand j'ai voulu reprendre mon projet, j'ai commencé à recevoir des trames bizarres :

2 032O 701209410988 1
PMAX RIF BASE 0
PP 06SC 25 =
OTDET 057101298 ,
PPOT  TH.. $
ADCO T1 004 L
200 1T2 010 J
 BASET3 013 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 05990 8
IINSTETAT 000000 B
 011  00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 05SC 25 =
OTDET 057101301 ]
PPOT  TH.. $
ADCO T1 004 L
200 1T2 010 J
 BASET3 008 R
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03940 1
IINSTETAT 000000 B
 011  00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 03SC 25 =
OTDET 057101303 _
PPOT  TH.. $
ADCO T1 004 L
200 1T2 010 J
 BASET3 004 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03940 1
IINSTETAT 000000 B
 011  00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 03SC 25 =
OTDET 057101305 !
PPOT  TH.. $
ADCO T1 004 L
200 1T2 010 J
 BASET3 004 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03910 .
IINSTETAT 000000 B
 011  00 #

Ces trames semblent corrompues, on dirait que tout est mélangé !
Mon compteur est un Landis + Gyr ZMD126.02 en triphasé.

Avez-vous déjà rencontré ce genre de problème ? Quelles sont les pistes à suivre pour tenter de trouver une solution ?

ludovic815:
Bonjour,
j'essaie de récupérer les données téléinfo de mon compteur. J'ai fait un petit montage pour récupérer la trame avec un optocoupleur LTV-814 :

Le code que j'utilise côté arduino est trivial pour l'instant :

#include <Arduino.h>

#include <SoftwareSerial.h>
#define TELEINFO_PIN 8
SoftwareSerial sftSerial(TELEINFO_PIN, 9);

void setup() {
Serial.begin(9600);
sftSerial.begin(1200);
}

void loop() {
if(sftSerial.available()) {
char rec = sftSerial.read()&0x7F;
Serial.write(rec);
}
}




Cette installation a fonctionné pendant quelques heures. Une semaine plus tard, quand j'ai voulu reprendre mon projet, j'ai commencé à recevoir des trames bizarres :


2 032O 701209410988 1
PMAX RIF BASE 0
PP 06SC 25 =
OTDET 057101298 ,
PPOT TH.. $
ADCO T1 004 L
200 1T2 010 J
BASET3 013 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 05990 8
IINSTETAT 000000 B
011 00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 05SC 25 =
OTDET 057101301 ]
PPOT TH.. $
ADCO T1 004 L
200 1T2 010 J
BASET3 008 R
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03940 1
IINSTETAT 000000 B
011 00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 03SC 25 =
OTDET 057101303 _
PPOT TH.. $
ADCO T1 004 L
200 1T2 010 J
BASET3 004 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03940 1
IINSTETAT 000000 B
011 00 #

2 032O 701209410988 1
PMAX RIF BASE 0
PP 03SC 25 =
OTDET 057101305 !
PPOT TH.. $
ADCO T1 004 L
200 1T2 010 J
BASET3 004 N
C 25 1 011 2
057102 032 6
PTEC 3 022 6
IINST 09410 4
IINST 03910 .
IINSTETAT 000000 B
011 00 #




Ces trames semblent corrompues, on dirait que tout est mélangé ! 
Mon compteur est un Landis + Gyr ZMD126.02 en triphasé.

Avez-vous déjà rencontré ce genre de problème ? Quelles sont les pistes à suivre pour tenter de trouver une solution ?

Bonsoir
les trames téléinfo sont codées en 1200 bps, 7 bits , parité paire, 1 bit de stop
a priori là tu receptionne en 1200, 8 bits , pas de parité, 1 bit de stop

Bonsoir,
Merci pour la réponse.
le &0x7F devrait permettre d'ignorer le 8ème bit, ce qui devrait faire l'affaire en théorie, non ?

char rec = sftSerial.read()&0x7F;

Quelles seraient les modifications à apporter pour la réception en 7 bits , parité paire, 1 bit de stop ?

bonjour,
ta chaine char rec n'est pas initialisée on dirait et remise à zéro
teste ca

void loop()
{
  char rec = 0;

  while (rec != startFrame)
  {
    rec = sftSerial->read() & 0x7F;
  }
   
  while (rec != endFrame)
  {

    if (sftSerial->available())
    {
      rec = sftSerial->read() & 0x7F;
      Serial.print(rec);
    }
  }
  
  Serial.println("");
}

Char rec n'est pas une chaîne, c'est un seul caractère qui est directement affiché. Je vais tester ce code, dès que possible, mais je n'ai pas beaucoup d'espoir, je pense que le résultat sera identique à mon code

Bonjour,

Ici tu as une class dérivée de SoftwareSerial qui gère la communication sur 7 bits.

ludovic815:
Char rec n'est pas une chaîne, c'est un seul caractère qui est directement affiché. Je vais tester ce code, dès que possible, mais je n'ai pas beaucoup d'espoir, je pense que le résultat sera identique à mon code

bonjour
fait un essai avec cette lib en definissant CSERIAL_7E1

kamill:
Bonjour,

Ici tu as une class dérivée de SoftwareSerial qui gère la communication sur 7 bits.

Cette classe ne supporte que le débit de 9600 bauds, aucun intérêt donc pour mon cas.

Artouste:
bonjour
fait un essai avec cette lib en definissant CSERIAL_7E1

Merci, je vais tester dès que possible avec cette bibliothèque, mais je n'ai pas beaucoup d'espoir parce qu'au final, les 7 premiers bits seront les mêmes que ceux que je reçois actuellement et le 8ème sera vérifié...

infobarquee:
bonjour,
ta chaine char rec n'est pas initialisée on dirait et remise à zéro
teste ca

void loop()

{
 char rec = 0;

while (rec != startFrame)
 {
   rec = sftSerial->read() & 0x7F;
 }
 
 while (rec != endFrame)
 {

if (sftSerial->available())
   {
     rec = sftSerial->read() & 0x7F;
     Serial.print(rec);
   }
 }
 
 Serial.println("");
}

Avec ce code je ne reçois rien du tout: le caractère STX n'est jamais reçu donc je reste bloqué dans la première boucle while

Artouste:
bonjour
fait un essai avec cette lib en definissant CSERIAL_7E1

Voici le code utilisé pour l'essai avec cette lib:

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <CustomSoftwareSerial.h>
#define TELEINFO_PIN 8
//SoftwareSerial sftSerial(TELEINFO_PIN, 9);
CustomSoftwareSerial* customSerial;
void setup() {
  Serial.begin(9600);
  customSerial = new CustomSoftwareSerial(TELEINFO_PIN, 9);
  customSerial->begin(1200, CSERIAL_7E1);
}

void loop() {
  if(customSerial->available())
  {
    Serial.write(customSerial->read());
  }
}

Et voici le résultat:

2 032  701209410988 1
PMAX 0IF BASE 0
PP 021C 25 =
OTDETA057282166 0
PPOT 0TH.. $
ADCO 71 003 K
200 1
2 004 M
 BASE 3 001 K
C 25 = 011 2
057282 032 6
PTEC T 022 6
IINST109410 4
IINST201900 +
IINST3TAT 000000 B
 011 200 #
2 032  701209410988 1
PMAX 0IF BASE 0
PP 019C 25 =
OTDETA057282167 1
PPOT 0TH.. $
ADCO 71 003 K
200 1
2 004 M
 BASE 3 001 K
C 25 = 011 2
057282 032 6
PTEC T 022 6
IINST109410 4
IINST201850 /
IINST3TAT 000000 B
 011 200 #
2 032  701209410988 1
PMAX 0IF BASE 0
PP 018C 25 =
OTDETA057282168 2
PPOT 0TH.. $
ADCO 71 003 K
200 1
2 004 M
 BASE 3 001 K
C 25 = 011 2
057282 032 6
PTEC T 022 6
IINST109410 4
IINST201870 1
IINST3TAT 000000 B
 011 200 #

J'ai remplacé l'optocoupleur par un SFH620A et j'obtiens exactement le même résultat.
C'est pas possible ! Ça doit marcher ! Un truc tellement simple normalement !
Quelqu'un a encore une idée ?

Bonjour,
Sur Github, il ya une librairie spécialisé dans la télé info.

Peux être faire un essai pour voir si ce n'est pas un soucis de codage.

J'ai essayé cette lib GitHub - hallard/LibTeleinfo: Librairie Universelle Teleinformation (TIC)
Ça ne fonctionne pas. J'ai vraiment l'impression que ce n'est pas un problème software. J'ai l'impression de juste recevoir des mauvaises données.

Bon... Je me suis branché sur le compteur d'un ami pour tester mon montage et mon code.
Avec le tout premier code que j'avais posté j'obtiens ceci

ADCO 701628010040 4
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 002298293 )
HCHP 000000057 _
PTEC HC.. S
IINST 008 _
IMAX 033 E
PAPP 01910 ,
HHPHC A ,
MOTDETAT 000000 B

ADCO 701628010040 4
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 002298294 *
HCHP 000000057 _
PTEC HC.. S
IINST 004 [
IMAX 033 E
PAPP 01010 #
HHPHC A ,
MOTDETAT 000000 B

Il semble donc que mon montage fonctionne bien, mais pas sur mon compteur.
Vraiment bizarre ! Quelqu'un a une idée ?

J'ai contacté mon fournisseur d'électricité et mon compteur a été remplacé.
Maintenant la téléinfo fonctionne sans problème !
Le code que j'avais posté dans le tout premier message fonctionne bel et bien.

Je récupère maintenant la téléinfo avec un arduino, je vérifie le checksum et je transmets les données en MQTT. Mon serveur les récupère avec Openhab et stocke des échantillons dans une base de données influxDB. Grafana permet ensuite de voir les relevés graphiquement. Ça donne un bon aperçu de la consommation.

Merci pour votre soutien !

Bonjour,
Je me permet de réouvrir ce sujet, car je cherche à monter mon petit système pour récupérer mon téléinfo. J'ai cru comprendre que tu (@ludovic815 ) à faire un système assez simple.

J'ai déjà le montage de fait (test avec Wifinfo et fonctionnel) mais je voulais avoir quelques précisions quand à ton code. Car quand je l'upload, je n'ai naturellement rien sur mon serial.

J'ai essayé de rajouter une ligne pour afficher le contenu de "rec", mais rien ne sort si ce n'est des "?????". Serait-il possible de m'en dire sur le fonctionnement, car je bloque un peu.

Merci d'avance