Projet affichage compteur Linky TEMPO

Bonjour à tous, j'espère être au bon endroit pour publier.
j'ai quelques notions d'arduino, mais très loin derrière des spécialistes qui composent ce forum, c'est pourquoi je fait appel a vous.
mon projet est le suivant :
j'ai des esp8266 D1mini en stock, donc c'est avec eux que je compte travailler.

  • sur le compteur linky :
    je compte placer 1 ESP_Linky qui aura comme mission de réceptionner les données du linky. soit =>
    Heures Creuses Jours Bleus en kWh
    Heures Pleines Jours Bleus
    Heures Creuses Jours Blancs
    Heures Pleines Jours Blancs
    Heures Creuses Jours Rouges
    Heures Pleines Jours Rouges
    Période Tarifaire en cours
    Couleur du lendemain
    Puissance apparente
    Horaire Heures Pleines Heures Creuses

une fois réceptionné, je compte rassembler le total des index en HC & HP, soit faire BBRHCJB+BBRHCJW+BBRHCJR=Index_HC et BBRHPJB+BBRHPJW+BBRHPJR=Index_HP
ensuite, envoyer ces 6 valeurs (Index_HC,Index_HP,PTEC,DEMAIN,PAPP et HHPHC) en wifi sur mon 2 em ESP_cuisine

sur ESP_cuisine :
réalisation d'un boitier de ce genre :
image

De simples led(s) qui indiquent la couleur du jour & demain ainsi que Hp ou Hc
et de simples afficheurs 4 digits pour indiquer ces valeurs.
=> pour conso Hc / Hp, je prends à partir de 22h00 à J-1, pour avoir toutes la conso des heures creuses (22h00 à 6h00) cet à dire je fais un reset à 22h00 des compteurs.

voilà mon projet, y a plus qu'a . . . .

1 Like

déjà je galère pour recevoir les infos du linky !
j'utilise ce schéma en sortie du linky =>

sur la broche 4 de opt ( alim ) je prends le +3.3v de mon esp 8266 mini et la sortie des signaux broche 3 du bs170 je rentre en D2 sur esp.

j'ai essayé différents programmes pour capter les trames, mais jusqu'à présent rien ?
je vous explique la suite plus bas.

L'ESP est en interface 3,3V, il vaudrait mieux prendre la sortie 3,3V et non la 5V

Avant d'enregistrer des programmes compliqués, j'ai voulu voir si mon esp mini fonctionnait =>
J'ai utilisé un premier esp comme émetteur, puis un 2em esp comme récepteur sur la broche D2 avec ce programme ( qui est très loin d'être parfait )

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);       //--> D2 (Rx)> GPIO4  et D1(Tx) > GPIO5

void setup() {
    Serial.begin(115200);    // vitesse moniteur serie du pc
    mySerial.begin(9600);   // vitesse transmission
}
void loop()
{
  if (mySerial.available()>0) {
     char x = mySerial.read();  
  Serial.print (x);
  }
}

J'ai pu constater que cela fonctionne ! Donc esp OK sur la broche D2 !
J'ai donc raccordé cette entrée sur le transistor mos du linky, je sais que cela allait me donner n'importe quoi ( car je ne suis pas en 7 bits ) mais je pense voir défiler des choses. et bien => non ? rien ! ! !
Chercher l'erreur ? ? ?

Je pense avant d'aller plus loin, il me faut voir ces infos. Pourquoi rien ?

Si je place une led en sortie 3 du 170 => je la vois scintiller comme si elle recevait bien les data ? ? ?
j'ai aussi, pour être sûr => placer l'entrée de mon montage J3(2) à la masse et j3(3) au 5v => ma led s'allume et si j'inverse les polarités, cela s'allume également => donc je pense que mon montage fonctionne.
Alors pourquoi rien ? ? ?
J'attends votre aide, merci.

ok, je vais essayer ! merci ( et j'ai rectifié mon message ci-dessus )
mon vcc est don de 3.3v.

Comme le 7 bits doit générer des erreurs il est possible que les mauvais caractères reçus soient rejetés.
Le plus simple serait de regarder ce qui arrive en ouvrant un logiciel de terminal quelconque dans un premier temps.
SoftwareSerial ne semble pas supporter les formats autres que 8 bits , ou alors j'ai raté un truc.

Je viens de trouver cette librairie optimisée pour les ESP et qui supporte les formats moins courants (de 5 à 8 bits avec et sans parité)

merci de ton aide, mais j'ai une chose curieuse :
comme je l'ai mentionné plus haut, j'ai un 2em esp qui me génère un message, et lorsque je le raccorde sur D2 esp1, cela fonctionne !
j'ai donc placé mon "generateur de message" à la place du linky, et raccordé mon esp recepteur normalement sur le bs170 => et cela ne fonctionne pas ! ! !

cela ne fonctionne toujours pas et je ne comprends pas.
je reprends mes essais "simples" =>

dons mon esp generateur de message, j'ai cela :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);    //--> D2 (Rx)> GPIO4  et D1(Tx) > GPIO5

void setup() {
    mySerial.begin(9600);
}
void loop() {
    char x [] ="maison ";      // va envoyer maison 
    mySerial.write(x);
    delay (1000);
}

dans mon esp recepteur j'ai cela :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);       //--> D2 (Rx)> GPIO4  et D1(Tx) > GPIO5

void setup() {
    Serial.begin(115200);    // vitesse moniteur serie du pc
    mySerial.begin(9600);   // vitesse transmission
}
void loop()
{
  while (mySerial.available()>0) Serial.write(mySerial.read()); 
}

Lorsque je relie D2 à D1 de l'autre, cela fonctionne. ( Normale ! ! ! )
Mais si mon émetteur D1 de message, je le place en J3(2) et J3(3) en masse et
mon récepteur D2 en pin 3 du bs170 >>> je n'ai plus rien ! Pas de message !

J'ai vérifié "x" fois mon montage, contrôlé avec led si cela fonctionne, je ne vois rien d'anormale ?
Si cette partie ne fonctionne pas, je ne vois pas comment la suite avec le compteur linky peut fonctionner. Ce programme simple, il doit marcher !

Le fait de passer par un "isolateur galvanique" ne doit rien changer au fonctionnement, je ne comprends vraiment pas pourquoi cela ne fonctionne pas ?
=> j'ai essayé de virer bs170 et d'utiliser juste l'opto ( en 4, résistance 1k/3.3v et en 3 masse ) D2 en 4 => IDEM, cela ne fonctionne pas.

17h20 ! toutes l'après-midi, et je n'ai pas avancé d'un pouce .
le fait de passer par l'opto et cela ne fonctionne plus ?
help me.

Bonsoir,

Votre montage avec le BS170 inverse le signal.
C'est normal car le Linky émet le 50kHz sur les états bas de la liaison série. Tout est dans la doc ENEDIS dispo sur le net : Enedis-NOI-CPT_54E. Prenez la dernière version (>=3).
Si vous voulez faire votre essai, raccordez

mon émetteur D1 de message, je le place en J3(2) et J3(3) en +3.3V

Ne vous embêtez pas avec le bit 7 (parité) vous le masquez à 0 et tout marchera bien.
Je pense que la grande majorité des Linky transmettent toujours la TIC "historique" qui est en 1200 bds.

Enfin, si ça peut vous aider, j'ai publié pas mal de choses sur la TIC et son décodage. Faites une recherche sur le forum.

Bonne bidouille,

MicroQuettas

Merci MicroQuettas, j'ai déjà lu des articles de vos travaux
surtout votre programme => Linky_Rx_07b_tempo.zip
Seulement, avant d'aller plus loin, je voudrais déjà avoir quelque chose à visualiser.
Je pense que je vais avoir besoin de vos lumières.
(car j'ai beaucoup de avec votre programme à comprendre)
Encore merci
=> je mis remet demain, et je vous tiens au courant.

Bon, j'ai bien avancé aujourd'hui.
Déjà mon schéma de base avec le BS170 ne fonctionne pas (pourquoi, je sais pas?) enfin je l'ai modifiè comme cela :

ensuite, la TRES GROSSE ERREUR que j'ai fait, je suis en mode HISTORIQUE donc la communication est 1 200 et non 9 600 !!!!!!

le petit programme pour voir les infos du linky est le suivant :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);       //--> D2 (Rx)> GPIO4  et D1(Tx) > GPIO5

void setup() {
    Serial.begin(115200);    // vitesse moniteur serie du pc
    mySerial.begin(1200);   // vitesse transmission
}
void loop()
{
  char charIn = 0;                        // Variable de stockage des caractères reçus

     if (mySerial.available() > 0)       // S'il y a des caractères disponibles on les traite
    {
      charIn = mySerial.read() & 0x7F;  // on "zappe" le 8ème bit
      Serial.print(charIn);               // on affiche chaque caractère reçu dans le  "moniteur série"
    }
}

et je récupère cela :

bien entendu, juste le premier tableau !
nota : j'ai IINST = 0 et PAPP = 0 => c'est normal, j'ai des panneaux solaire qui me suppriment ma conso "rémanente de l'après midi".

reste à poursuivre...

question : La couleur de DEMAIN => il apparait à quelle heure ? et c'est sur 4 caractères, donc on à quoi pour JB/JW/JR ? merci

Bonjour,

Bravo pour cette première étape.
Voici les infos sur le DEMAIN (communiquées par breizh13)

Voici ce que j'ai trouvé concernant tempo dans Enedis-NOI-CPT_02E.

"La couleur du lendemain (donnée du groupe d’étiquette « DEMAIN ») est codée sur 4 caractères ASCII alphanumériques selon la syntaxe suivante :

« ---- » : couleur du lendemain non connue, (le caractère noté « - » correspond au caractère ASCII « tiret »),
« BLEU » : le lendemain est jour BLEU,
« BLAN » : le lendemain est jour BLANC,
« ROUG » : le lendemain est jour ROUGE."

"Le DEMAIN n'affiche autre chose que "----" uniquement si le lendemain est autre que BLEU et entre 20h et 0h"

J'ai une nouvelle version du décodeur qui fonctionne sur AVR et ESP. Faîtes moi savoir quand vous en aurez besoin.

Bonne bidouille,

MicroQuettas

@MicroQuettas
Si cela ne te dérange pas, tu peux mettre à jour ton sujet avec la nouvelle version du décodeur.
Cela aura l'avantage de lui faire quitter les profondeurs du forum d'où une meilleure visibilité et je pense que beaucoup pourront être intéressés, (j'en connais un personnellement :grinning:)

@68tjs C'est fait dans ce sujet encore ouvert.

Bonne bidouille

MicroQuettas

Merci à vous tous !
Je sais MicroQuettas, tu as fait un travail extraordinaire ! ! ! Et que tu es très très fort ! Si fort que malheureusement, je ne comprends pas ton code !
C'est pourquoi, je vais tenter de faire mon programme à ma sauce ( Je me permets d'essayer ; car j'ai en fait peu de chose à décoder) si cela ne fonctionne pas, je reviendrai vers ton programme "tout fait" !

première idée de décodage :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);       //--> D2 (Rx)> GPIO4  et D1(Tx) > GPIO5
char charIn1 = 0;                        // Variable de stockage des caractères reçus
char charIn2 = 0;
char charIn3 = 0;
char charIn4 = 0;
char charIn5 = 0;

void setup() {
    Serial.begin(115200);    // vitesse moniteur serie du pc
    mySerial.begin(1200);   // vitesse transmission
}
void loop()
{
     if (mySerial.available() > 0)       // S'il y a des caractères disponibles on les traite
    {
      if ( mySerial.read() & 0x7F=='P'){
        if ( mySerial.read() & 0x7F=='A'){
          if ( mySerial.read() & 0x7F=='P'){
            if ( mySerial.read() & 0x7F=='P'){
              charIn1 = mySerial.read() & 0x7F; 
              charIn2 = mySerial.read() & 0x7F; 
              charIn3 = mySerial.read() & 0x7F; 
              charIn4 = mySerial.read() & 0x7F;
              charIn5 = mySerial.read() & 0x7F; 
            }
          }
        }
      }
    }
      
   Serial.print(charIn1);             // on affiche chaque caractère reçu dans le  "moniteur série"
   Serial.print(charIn2);
   Serial.print(charIn3);
   Serial.print(charIn4);
   Serial.print(charIn5);
    
}

Malheureusement, cela ne fonctionne pas !

Je vais continuer (si j'ai le temps) demain => je vous tiens au courant de mes recherches.

Encore merci à vous ! Cela me rassure d'avoir des spécialistes derrière moi.

Nota : ne le prenez pas mal si je ne télécharge pas votre programme directement, j'aime chercher des solutions par moi-même (je suis de la vielle école.).

C'est l'eternel problème du débutant, qui cherche à refaire le monde parce qu'il ne le comprend pas. Quel développeur professionnel n'a pas commis cette erreur à ses débuts ?
Comprendre le code des autres suppose un minimum de connaissances, que tout le monde n'a pas.
Il faut faire l'effort.

Oui, je te comprends hbachetti, mais avoue que ce programme n'est pas pour les débutants que je suis ! J'y ai passé beaucoup de temps, mais sans la personne à côté qui donne les explications du pourquoi ou du comment, ce n'est pas facile !

Au "pire", je perds du temps ! Et je ne cherche pas à refaire le monde, mais de l'ajuster à mes besoins. (d'après son code => il décode tous les types de compteur linky , moi je ne m’intéresse que pour le tempo HISTORIQUE, donc une multitude de lignes de programme qui me sont inutiles)
Mais je me répète : si je n'y arrive pas à trouver une solution, je téléchargerai ce code et j'essaierai d'exploiter les choses dont j'ai besoin. (je ne ferme pas la porte)

En fait tu décris exactement ce que @hbachetti décrit :slight_smile:
A partir du moment ou tu pense que quelque chose qui fait plus que ce que tu veux et que tu ne veux pas l'utiliser pour une autre raison que des bugs rédhibitoire, tu veux refaire le monde.
Après il n'y a rien de mal à vouloir refaire le monde ou considérer qu'une autre approche est possible

Le programme de @MicroQuettas me semble plutôt bien fait car il a séparé son code et le code qui décode les trames sont dans un objet spécialisé.
Par définition ne n'a pas nécessité de comprendre ce code.
Il faut que tu comprennes uniquement le .ino qui utilise cette objet.
Je n'ai pas regardé son code en détaille, mais il semble avoir prévus des macros pour activer/désactiver des fonctionnalité comme les trames TEMPO.

As tu essayé son programme sur ton cas ?