Aide téléinfo

ah voilà une bonne piste, en effet j'ai fait ceci

void loop(){
  
      getTeleinfo();
      Serial.println("coucou");
   delay(50000L);
      
  }

et ça donne ça :
BASE=2604259Wh
BASE=2604260Wh
BASE=2604262Wh
BASE=2604263Wh
BASE=2604265Wh
BASE=2604266Wh
BASE=2604268Wh
BASE=2604270Wh
BASE=2604271Wh
BASE=2604273Wh
BASE=2604274Wh
BASE=2604276Wh

pas de coucou !!!
maintenant sais-tu comment sortir du getTeleinfo ?
merci de ton aide

De manière simple : Non

Ce source est mal codé (désolé). Il y a plein de variables globales, mises à jour dans certaines fonctions et utilisées dans d'autres. Un vrai plat de spaghettis
Les instructions while utilisées tombent dans des cas de boucle infinie.

Par exemple : tu ne sors jamais de ton while(!trameComplete) car cette variable est toujours égale à zéro.
En cause : une variable globale int check[11], dont seule check[2] est valorisée dans ton programme.

Et même si ton while fonctionnait correctement, le code montre que le programme serait sensible aux mauvaises lectures / interférences : boucle infinie si le caractère 0x02 n'est pas reçu.

Il faudrait prendre du temps pour entrer dans le code et le réécrire intégralement mais proprement, à partir des spécifications des trames reçues. Ou alors repartir d'une base plus propre.

Surtout que la com avec le téléinfo me semble très basique (juste une interruption à gérer par kw/h?). Donc si interruption sur D2 ==> incrémentation d'une variable
Interruption temporelle toute les 15 minutes ==> stockage de la variable et remise à zéro

Bon ba voilà j'ai complétement décroché là :~
vous avez surement raison mais ce qui paraît simple pour vous ne l'ai pas pour moi.
je vais mettre ce projet de côté et reprendre tranquillement les bases de l'arduino et du C++.
merci encore beaucoup pour votre aide en tout cas.
bonne soirée à tous

Pourquoi tu ne regardes pas ce qui a déjà été fait et le mettre à ta sauce ?

bluemax2001, c'est ce que j'ai essayé, mais visiblement il n'y a pas beaucoup a trouver et le peux je ne parviens pas à l'exploiter. :disappointed_relieved:

B@tto:
Surtout que la com avec le téléinfo me semble très basique (juste une interruption à gérer par kw/h?). Donc si interruption sur D2 ==> incrémentation d'une variable
Interruption temporelle toute les 15 minutes ==> stockage de la variable et remise à zéro

Non
Là il s'agit de téléinfo en sortie d'un compteur électronique EDF : des données restituées sur un genre de liaison série.
Exemple de doc ici : http://www.erdfdistribution.fr/medias/DTR_Racc_Comptage/ERDF-NOI-CPT_02E.pdf

Et avec les futurs compteurs linky je pense qu'il va y avoir des petits projets sympa à faire avec arduino

[edit : j'ai trouvé la doc linky http://www.erdfdistribution.fr/medias/DTR_Generalites/ERDF-NOI-CPT_44E.pdf ]

B@tto:
Surtout que la com avec le téléinfo me semble très basique (juste une interruption à gérer par kw/h?). Donc si interruption sur D2 ==> incrémentation d'une variable
Interruption temporelle toute les 15 minutes ==> stockage de la variable et remise à zéro

Non, il y a un message d'une centaine de caractères toutes les secondes environ.

@tiotbrev tu peux allez voir là un exemple la partie Téléinformation 2/5 (Arduino SW) http://jojoflyhigh.blogspot.fr/

Edit: Je crois que j'ai été un peu grillé par bricoleau

Bonsoir fdufnews,
lors de mes recherches je suis aller sur http://jojoflyhigh.blogspot.fr/, mais j'ai trouvé très compliqué par rapport à ce que je veux faire.
je voulais juste récupérer une info, ma consommation, et la stoker sur la micro SD du Shield ethernet.
si j'ai bien compris mon code est pas trop mauvais, c'est juste qu'il ne sort pas du getTeleinfo();

tiotbrev:
si j'ai bien compris mon code est pas trop mauvais, c'est juste qu'il ne sort pas du getTeleinfo();

Ben en vrai si, je le trouve affreux ]:slight_smile:

Il est toutefois probable que certains aient réussi à le faire marcher.
Ton principal problème est dans la fonction affecteEtiquette, où le code a été tronqué pour ne garder que ce qui concerne l'étiquette BASE. C'est ça qui doit faire que ce code à l'origine pas terrible (pour rester poli) ne marche plus du tout.

De surcroît, ton code (du moins la version d'origine, celle qui était complète) part du principe que le compteur va lui transmettre 11 étiquettes, alors que cela dépend de la version du compteur, et peut-être même de ton abonnement EDF.

Pour savoir à quoi s'en tenir, le mieux est d'afficher cette fameuse trame en entier.

Tu peux nous dire ce que tu obtiens dans le moniteur série, à l'exécution du code ci dessous ?

#include <SoftwareSerial.h>

SoftwareSerial cptSerial(2, 3);

void setup()
{
  cptSerial.begin(1200);
  Serial.begin(115200);
}

void loop()
{
  char c;

  while (cptSerial.available()) //vidons les tuyaux
  {
    c = cptSerial.read();
    if (!cptSerial.available())
    {
      delay(10); // entrée à 1200 baud... c'est lent !
    }
  }

  while (!cptSerial.available()) //et attendons la vague
  {
    delay(10);
  }

  afficherTrame(); //c'est parti !

  delay(30000);
}

void afficherTrame()
{
  char c;
  byte i;

  Serial.println("Trame************");

  i=0;
  while (cptSerial.available())
  {
    c = cptSerial.read() & 0x7F;
    if (c < (char) 0x10) //affichage du zero non significatif
    {
      Serial.print('0');
    }
    Serial.print((byte) c, HEX); //affichage du caractère recu en hexadécimal
    if (c >= ' ')
    {
      Serial.print(c); // affichage du caractère reçu
    }
    else //caractère non affichable
    {
      Serial.print('*');
    }
    i++;
    if (i >= 20) //retour à la ligne
    {
      Serial.println();
      i = 0;
    }
    else
    {
      Serial.print(' '); //au suivant
    }
    if (!cptSerial.available())
    {
      delay(10); // entrée à 1200 baud... c'est lent !
    }
  }
  if (i) //soyons propres
  {
    Serial.println();
  }
}

Petite retouche de code : comme je n'étais pas sûr que la fonction available() intègre une tempo, ajout d'un delay(10) en fin de boucle, histoire de bien traiter entièrement la trame en cours de réception.

[edit : après vérif, délai ajusté à 10ms car d'après la doc les trames sont émises en continu avec une pause comprise entre 16,7 et 33,4 ms entre deux]

Bonjour Bricoleau,
d'abord merci vraiment.
alors avec le code j'ai ceci :
Trame************
02* 0A* 41A 44D 43C 4FO 20 300 322 311 322 322 388 355 355 322 377 333 377 20
43C 0D* 0A* 4FO 50P 54T 41A 52R 49I 46F 20 42B 41A 53S 45E 20 300 0D* 0A* 49I
53S 4FO 55U 53S 43C 20 366 300 20 3C< 0D* 0A* 42B 41A 53S 45E 20 300 300 322
366 333 377 388 333 333 20 2B+ 0D* 0A* 50P 54T 45E 43C 20 54T 48H 2E. 2E. 20
24$ 0D* 0A* 49I 49I 4EN 53S 54T 20 300 300 366 20 5D] 0D* 0A* 49I 4DM 41A 58X
20 300 355 399 20 4DM 0D* 0A* 50P 41A 50P 50P 20 300 311 333 333 300 20 28(
0D* 0A* 4DM 4FO 54T 44D 45E 54T 41A 54T 20 300 300 300 300 300 300 20 42B 0D*
03*

là pour moi c'est du chinois !!

Super !
Meuh non c'est pas compliqué. Je parie que je peux te donner un cours de chinois accéléré.

Ton compteur EDF t'envoie des trames.
Chaque trame est une suite de caractères, dont le format est défini à partir de la page 11 du document ci-dessous
http://www.erdfdistribution.fr/medias/DTR_Racc_Comptage/ERDF-NOI-CPT_02E.pdf

Prend un moment pour lire la spécification et la comprendre. C'est tout à fait accessible.

La trame que tu as reçue fait 141 caractères.
C'est ce qui s'affiche dans ton moniteur série, à raison de 20 caractères par ligne.
Comme tous les caractères reçus du compteur ne sont pas affichables tels quels directement, je les ai tous affichés dans le moniteur série sous forme de 4 caractères :
1er et 2nd caractères : la valeur hexadécimale du caractère reçu
3ème caractère : le caractère reçu si affichable (* si non affichable)
4ème caractère : un séparateur blanc

Ainsi, correctement présenté, cela donne

02* 0A* 41A 44D 43C 4FO 20  300 322 311 322 322 388 355 355 322 377 333 377 20 
43C 0D* 0A* 4FO 50P 54T 41A 52R 49I 46F 20  42B 41A 53S 45E 20  300 0D* 0A* 49I
53S 4FO 55U 53S 43C 20  366 300 20  3C< 0D* 0A* 42B 41A 53S 45E 20  300 300 322
366 333 377 388 333 333 20  2B+ 0D* 0A* 50P 54T 45E 43C 20  54T 48H 2E. 2E. 20 
24$ 0D* 0A* 49I 49I 4EN 53S 54T 20  300 300 366 20  5D] 0D* 0A* 49I 4DM 41A 58X
20  300 355 399 20  4DM 0D* 0A* 50P 41A 50P 50P 20  300 311 333 333 300 20  28(
0D* 0A* 4DM 4FO 54T 44D 45E 54T 41A 54T 20  300 300 300 300 300 300 20  42B 0D*
03*

Si je lis la première ligne : les caractères reçus sont :
0x02 (non affichable)
0x0A (non affichable)
0x41 (A)
0x44 (D)
0x43 (C)
0x4F (O)
0x20 (blanc)
etc.

Cela correspond bien pile poil à ce qui est annoncé dans la doc ERDF.
On retrouve bien les balises annoncées (0x02, 0x0A, 0x0D, 0x03, ...)

Et en clair, cela donne

ADCO=021228552737 (checksum=C)
OPTARIF=BASE (checksum=0)
ISOUSC=60 (checksum=<)
BASE=002637833 (checksum=+)
PTEC=TH.. (checksum=$)
IINST=006 (checksum=])
IMAX=059 (checksum=M)
PAPP=01330 (checksum=()
MOTDETAT=00000 (checksum=B)

Ton compteur t'envoie 9 étiquettes.
Tu as un abonnement de base (c'est-à-dire pas d'option heure creuse, ni EJP)
L'intensité souscrite est de 60 A
Ton index de consommation est à 2637833 Wh
L'intensité instantanée tirée au moment de le trame était de 6 A
L'intensité maxi délivrable est de 59 A

Etc. Tout est dans la doc, y compris la méthode à utiliser pour recalculer le checksum et vérifier l'intégrité des données reçues.

A partir de là, techniquement le plus dur est fait.
En terme de programmation, il s'agit juste de manipuler une suite de 141 caractères pour en extraire les informations qui t'intéressent.

C'est du C de base :wink:

C'est même plus drôle il a plus rien à comprendre :stuck_out_tongue:

Beau boulot !

Merci !

Là dans le cas présent, il me semblerait intéressant de suivre la consommation wh ainsi que l'intensité tirée instantanée.

Par exemple :

  1. Une lecture de trame toutes les 30 secondes
  2. Un enregistrement dans un fichier log sur la carte SD toutes les 15 minutes, contenant :
  • le relevé Wh
  • le IINST maximum constaté sur le quart d'heure

Ainsi :

Avec le relevé Wh, tu peux savoir si ça vaut le coup de passer en option heures creuses, en recalculant la facture que tu aurais eue avec cette option.

Avec le relevé IINST, tu peux vérifier l'adéquation de ton abonnement avec ton besoin. Peut-être qu'un abonnement 45 A suffirait.

Ouah !!! C'est trop pour moi.
Ceci dit au regard de tout ça j'ai modifié ceci :

// on vérifie si on a une trame complète ou non
    for (i=0; i<12; i++) {
      trameComplete+=check[i];
    }
    //Serial.print("Nb lignes valides :"); Serial.println(trameComplete);
    if (trameComplete < 12) trameComplete=0; // on a pas les 11 valeurs, il faut lire la trame suivante
    else trameComplete = 1;

et en y mettant "12" j'ai bien un relevé toute les X minutes suivant mon "delay"
Je comprends bien que le code que j'utilise n'ai pas beau, bon, ou parfait mais pour le moment il me donne ce que j'ai besoin.
Si il me permet d'avoir les relevés, j'ai plus de temps pour reprendre tout depuis le début et d'essayer de comprendre ce que je fais.
Une fois de plus merci beaucoup, même si je n'ai pas tout compris, cette discussion servira peut-être à d'autres.
XD

bravo !

j'ai fait le montage et essayé sur mon compteur injection PV et ça marche sauf que j'ai des sauts de ligne et je ne sais pas d'ou ça peut venir... est-ce un problème de delay ? ou autres ?

Par contre ça marche très bien sur mon compteur triphasé

Voici les codes relevés sur mon compteur Injection mono:

02* 0A* 41A 44D 43C 4FO 20 300 333 311 300 322 388 311 355 366 322 300 333 20
366 0D* 0A* 4FO 50P 54T 41A 52R 49I 46F 20 42B 41A 53S 45E 20 300 0D* 0A* 49I
53S 4FO 55U 53S 43C 20 311 355 20 3C< 0D* 0A* 42B 41A 53S 45E 20 300 311 333
377 300 311 311 311 388 20 21! 0D* 0A* 50P 54T 45E 43C 20 54T 48H 2E. 2E. 20
24$ 0D* 0A* 49I 49I 4EN 53S 54T 20 300 300 311 20 58X 0D* 0A* 49I 4DM 41A 58X
20 300 311 344 20 44D 0D* 0A* 50P 41A 50P 50P 20 300 300 322 388 300 20 2B+
0D* 0A* 4DM 4FO 54T 44D 45E 54T 41A 54T 20 300 300 300 300 300 300 20 42B 0D*
03*

Juste un petit retour là-dessus

bricoleau:
Avec le relevé IINST, tu peux vérifier l'adéquation de ton abonnement avec ton besoin. Peut-être qu'un abonnement 45 A suffirait.

L'info à considérer dans ce cas c'est IMAX.
IMAX c'est l'intensité MAX appelée. Dans la capture on voit qu'elle est de 59A. Donc manifestement l'abonnement est en adéquation avec le besoin puisqu'il a un abonnement 60A.