Decodeur TIC Linky

Bonjour à toutes et à tous,

Enedis m'a installé un joli nouveau compteur jaune/vert pétard qui répond au doux nom de Linky.
Je me suis dit que cet engin devait bien pouvoir servir à quelque chose, enfin pour moi...

Dans un premier temps, j'ai bidouillé un petit module pour lire et décoder ce qui en sort, à savoir la "téléinformation client" ou TIC.

Je le poste ci-joint avec le .ino de test.

Caractéristiques :

  • décode les trames "historiques", extensible aux nouvelles trames dites standard,
  • fonctionne en "pipeline", c-à-d décode un groupe pendant qu'il lit le suivant,
  • utilise un SoftwareSerial de manière transparente pour l'utilisateur,
  • décode 3 "groupes" d'info (index, intensité instantanée et puissance apparente),
    extensible à d'autres ,
  • code non-bloquant, complètement encapsulé, accès aux données par "propriétés",
  • pas de Strings, compilation séparée, bref tout le confort moderne,
  • voir le .ino pour la mise en oeuvre et le test.

Ce code tourne sur un Uno. Sur une machine avec plusieurs Hardware Serial (par ex. la Méga), il serait judicieux (et facile) de remplacer la SoftwareSerial par une hardware serial.

Pour l'interface, il faut un petit circuit. Ceux déjà publiés doivent faire l'affaire. Comme j'avais d'autres composants sous la main, j'en ai fait un autre dont le circuit est joint. Les composants sont très courants et non-critiques.

Je répondrai à toutes les questions (raisonnables).

Bonne bidouille,

MicroQuettas.

PS : ce décodeur doit aussi décoder la TIC des anciens compteurs électroniques.

[EDIT]Nouvelle version du logiciel pour Uno et Mega au post #117

Publication_LkyRx_06.zip (39.9 KB)

Bonjour MicroQuettas
Tout d'abord merci et le programme à l'air super. J'ai encore un ancien compteur (en triphasé) mais j'espère pouvoir utiliser ton programme ce weekend. Mon but est de réaliser un délesteur intelligent en utilisant le ou les INST IINST1 IINST2 IINST3 de la téléinfo pour commander des relais de délestage avec une mesure de l'intensité délestée pour la réenclencher dès que le IINST + Idelesté (mesuré au moment du delestage) repasse en dessous du ISOUSC.
Pour l'instant je n'ai eu que peu de succès car je n'ai pu qu'imprimer les trames de la teleinfo dans la fenêtre d'affichage de la liaison série.

Peux tu s'il te plait m'expliquer un peu (je suis mecanicien de formation) comment fonctionne ton programme?
Je ne comprends pas pourquoi tu as des fichiers .cpp, .h, et .ino (celui là en gros j'ai compris qu'il va dans l'arduino). J'imagine que le code C++ était pour une application anterieure. Je vais me creuser un peu les meninges pour comprendre les differents programmes.

Super !

Merci, je sens que je vais revenir dans le coin le jour où j'aurais mon linky :slight_smile:

Sauf erreur de ma part, je pense que tu dois utiliser softwareSerial.h alors que le besoin est limité au rx.
Il y a quelques temps j'avais mis la main sur une lib softwareSerialReceiveOnly.h qui m'avait l'air de bonne facture, avec un code plus compact et qui évite de monopoliser une pin pour le tx.
Mais je n'arrive pas à remettre la main dessus.

Bonsoir à tous les deux,

@Bricoleau : effectivement, j'utilise softwareSerial et la pin TX est non utilisée (ne transmet rien) mais est bloquée pour un autre usage... Pour mon projet (Cf plus bas) c'est sans incidence,

@tous les deux : d'après sa notice, le Linky être configuré pour envoyer deux types de TIC :

  • l'historique à 1200 bds qui est très similaire à celle des anciens compteurs électroniques,
  • la nouvelle, qu'Enedis appelle "standard", qui est à 9600 bds mais quasiment identique logiquement à la TIC historique.

Mon Linky est configuré en historique, cela se voit en faisant défiler l'affichage. C'est un monophasé et la bibliothèque actuelle ne décode que quelques "groupes" du monophasé "historique" (ceux qui ne sont pas constants). En particulier, il n'y a l'intensité que pour la phase unique, étiquette : IINST.

@oleveque :
J'ai encapsulé le décodeur dans une bibliothèque à compilation séparée constituée par les 2 fichiers LinkyHistTIC.h et LinkyHistTIC.cpp qu'il suffit de copier dans le répertoire contenant le .ino. L'IDE compile tous les morceaux et les lie ensemble. Il n'y a à s'occuper de rien. Cela permet de "cacher" complètement le code de la bibliothèque et de ne pas s'en occuper.

En fait, ce décodeur est pour un projet en cours : l'affichage, avec un ESP8266, des données de la TIC et de l'historique sur 24 heures sur 2 pages html. Je le posterai quand il sera fini.

Pour votre projet, si vous savez lire les données de la TIC et les afficher sur le moniteur série, vous avez fait le plus difficile.

Dans un premier temps :

  • copiez les 3 fichiers dans un répertoire de votre PC,
  • raccordez la sortie de votre circuit d'interface sur la pin 10 (si vous utilisez un Uno), laissez la 11 inutilisée,
  • ouvrez le .ino en double cliquant dessus. L'IDE s'ouvre et vous voyez les 3 fichiers dans 3 onglets,
  • dans le fichier LinkyHistTIC.cpp, dé-commentez la ligne 22 (enlevez les "//" en début de ligne) :
    //#define LINKYDEBUG true, cela place le programme en mode "debug" et il va raconter sa vie sur le moniteur série,
  • compilez et chargez,
  • si tout va bien, vous devez voir s'afficher tous les groupes, dont les IINST1, 2 et 3 de votre compteur
  • si c'est le cas, tout baigne et vous êtes prêts pour la suite...

Je vais préparer une version "tri" de la bibliothèque et la poster, mais je n'aurai pas pu la tester...

Après cela, il vous restera à coder le délestage... pas forcément le plus simple.

Pour l'interface avec les relais de délestage, qu'avez vous prévu ? Comment sont-ils commandés ? Si c'est du 230V, il faudra mettre des petits relais pour commander les gros.

Bonne bidouille

MicroQuettas

Si cela peut aider dans vos projets : Teleinfo + suivi conso graph 72h/h+ sauvegarde sur SD M/A + 2 relais : Mega 2560 - Réalisations et Projets Finis - Arduino Forum

Bonjour,

Je profite de ce sujet fort interessant pour produire mon premier message sur ce forum.

En premier, merci pour le partage de votre travail.

La mise en oeuvre a été simple et rapide. Je décode les trames sans problèmes.

J'ai un abonnement "tempo" donc avec 6 indexs et j'ai un linky utilisant le mode "historique".

Pouvez vous me dire si il est normal que les indexs ne soient pas décodés ?
Globalement j'ai tous les champs prévus sauf les indexs.

J'ai commencé à éplucher les librairies pour comprendre mais pour l'instant je ne maitrise pas le sujet suffisament pour aller plus loin.

Cordialement

Bonjour,
Pour préciser mon message précédent :

Je me suis mie en reception avec putty sur le flux d'entrée.
1200Bd / parité paire /7bits /1 stop /pas de ctrl

ADCO xxxxxxxxxxxx D //adresse masquée
OPTARIF BBR) T
ISOUSC 45 ?
BBRHCJB 002855560 <
BBRHPJB 002899603 O
BBRHCJW 000705121 B
BBRHPJW 000616264 X
BBRHCJR 000393182 G
BBRHPJR 000280374 R
PTEC HPJB P
DEMAIN BLEU V
IINST 009
IMAX 090 H
PAPP 02180 ,
HHPHC A ,
MOTDETAT 000000 B

On vérifie donc que toutes les données sont bien présentes et conformes.

Avec la ligne 22 active -#define LINKYDEBUG true

Le résultat :

Bonjour
MOTDETAT 000000 B
OPTARIF BBR) T
ISOUSC 45 ?
PTEC HPJB P
DEMAIN BLEU V
IINST 006 ]
I instant. = 6 A
IMAX 090 H
PAPP 01370 ,
Puis. app. = 1370 VA
HHPHC A ,

Ligne 22 en commentaire

Bonjour
I instant. = 10 A
Puis. app. = 2350 VA
Puis. app. = 2330 VA
Puis. app. = 2340 VA
Puis. app. = 2330 VA
I instant. = 5 A
Puis. app. = 1190 VA

On constate bien que les détections de changement de valeur pour "I instant" et "Puis.app." fonctionnent correctement.

La fonction " Index base " ne fonctionne visiblement pas.

Aviez vous fait le test avec une trame "tempo" avec 6 indexs.

Pour l'instant j'en suis là.

Bon Dimanche,

Cordialement

Bonsoir,

Merci beaucoup pour votre message et l'intérêt que vous portez à ce projet.

Le décodeur publié ne décode que les groupes BASE, IINST et PAPP, correspondant à un tarif basique monophasé (le mien). Avec votre tarif "tempo", le groupe BASE n'est pas transmis, donc pas décodé :wink: .
A l'inverse, les index BBRxxxx sont transmis, mais pas décodés car le programme ne les attend pas.
Le programme fonctionne donc normalement, mais n'est pas adapté à votre tarif.

Le programme est simple et ne capture pas tous les groupes pour ne pas charger inutilement l'Arduino. Il faut donc l'adapter aux groupes transmis pour les différents tarifs.

Je l'ai écrit pour qu'il soit facilement modifiable... Je vais donc le modifier pour le tarif tempo, cela me permettra de vérifier s'il est effectivement facilement modifiable ! Donnez moi juste un peu de temps.

Bonne bidouille.

MicroQuettas

PS : merci d'avoir copié la trame complète, cela me permettra de tester si les modifs marchent.

Bonsoir,

Je vous remercie pour votre proposition d'adapter le soft à ce type de tarif.

Si vous le souhaitez, je peux vous envoyer un fichier avec quelques minutes de capture des trames envoyées.

Cordialement

Bonsoir.
Merci a MicroQuettas pour les explications et la proposition de modification du code pour le tri.
Mardi j'enverrais le code pour le delestage premier jet avec le vieux prog de recup de teleinfo que je n'ai pas reussi a faire marcher. Je n'ai pas pu tester quoi que ce soit ce weekend mais le prochain devrait etre le bon.

J'ai recuperé de vieilles cartes interfaces pc entree opto isolee et sorties relais pour isoler l'arduino du reste et j'utiliserais ensuite des relais de puissance ou des relais statiques en fonction des charges (resistive pure et relais a contacts pour les autres appareils).
Question a MicroQuettas
Il me semblait qu'à la lecture des docs linky et vieux compteur Landis et Gyr que les trames etaient diffrrentes car pas de champs historique dans les vieux compteur?
Peut etre ai-je mal compris. J'essayerai d'attacher la feuille excel avec ma comprehension des trames à la lecture des docs

Bonne soiree nuit :slight_smile:

Bonjour,

@Oleveque

On trouve sur les sites Chinois classiques à des prix bas des cartes avec des relais et optocoupleurs qui font parfaitement l'affaire pour commander des unités de puissance (statiques ou mécaniques).

Le mode "historique" qui est celui paramétré par défaut sur le linky est le même que pour les anciens compteurs électroniques (Landys...).

Par contre, sur demande, le linky peut être paramétré en mode "standard" qui est fort différent.
Je vous invite à lire le doc "Enedis-NOI-CPT_54E".
http://www.enedis.fr/sites/default/files/Enedis-NOI-CPT_54E.pdf.

On peut aussi prévoir pour la suite des entrées de capteurs de courant pour compléter un système complet de gestion de l'énergie.

Cordialement

Bonsoir à tous,

@oleveque :
Dans un premier temps, il faut savoir si votre compteur émet, si vous recevez convenablement et ce qu'il transmet.
Si vous pouviez faire la manip indiquée au post #3 de cette chaîne et me poster la trame reçue, cela permettra d'être sûr que l'on reçoit quelque chose et d'adapter le décodeur en fonction de ce que l'on reçoit vraiment. En plus du tri, vous avez peut-être un tarif jour/nuit, voire tempo comme Klapoutz ?

Pour la partie délesteur, ne vous précipitez pas sur le code. Il faut d'abord bien définir ce que l'on veut faire. Il faut faire robuste et fiable. Je pense que c'est le genre de problème qui se traite bien avec une machine à états.
Il y a d'excellents tutoriaux sur le forum, par ex. celui là : Programmation Automate fini / Machine à état - Tutoriels et cours - Arduino Forum

Je vous suggère de vous en inspirer et de définir les états, les transitions, les actions et les temporisations. Cela aidera à y voir clair sur ce que doit faire le délesteur. Une fois tout cela défini et validé, le codage de la machine à états est un jeu d'enfant.

Désolé de vous donner du travail :wink:

@Klapoutz :
J'ai avancé dans l'adaptation du décodeur au tarif "tempo", mais pas encore testé...

Pour les nouvelles trames Linky (Enedis les appelle "standard"), elles ne sont pas très différentes des anciennes. Le problème principal pourrait être leur vitesse : 9600 au lieu de 1200 bds. Je ne suis pas certain que les adaptateurs à optocoupleur qui marchent pour le 1200 seront assez rapides...

Mais chaque chose en son temps, on verra quand Enedis les mettra en service.

Voilà les news, à + et bonne bidouille à tous,

MicroQuettas

Bonjour une grosse difference entre linky et les anciens compteur est l'horodate qui vient s'inserer entre la champs etiquette et la valeur. Ce point ne figure nulle part sur les compteurs anciens. Nous nous sommes lu les 2 docs avec des collegues du bureau. linky et Landis.
Je recois les trames puisque je les ai imprimées dans la fenetre de com.
Desolé pour les essais mais en semaine je bosse dans le sud de la france et le weekend j'habite à Lyon.
Merci pour la doc linky je l'avais trouvée. Demain je mettrai la Landis ancien compteur tri.
Je n'ai qu'un compteur simple tri "BASE" sans ejp tempo ni jour nuit.
J'avais déjà codé la partie delestage (pour me cas mono et le cas tri... peut etre mon code vous paraitra un peu bourin quand je le publierais, mais c'est ca quand un mécano code avec une clé à molette. Svp soyez indulgent le C++ c'est nouveau pour moi... je pratique un peu le VB.
Merci à tous pour vos conseils eclairés
Olivier

Bonjour,

Je pense qu'il y a une confusion. Les trames en mode "historique" du linky n'ont pas de champ horodate.

J'ai copié la trame dans mon second message, vous pouvez le constater.

La trame est identique aux anciens compteurs pour des raisons de comptabilité avec certains équipement connectés aux sorties TIC.
Si vous recevez des champs "horodate", votre linky est configuré en mode "standard".

Pourriez vous mettre une copie d'une trame complète, c'est toujours intéressant d'avoir des exemples.

Cordialement

Bonjour,

D'accord avec Klapoutz, il n'y a pas d'horodatage dans les trames "historiques" des Linky qui sont identiques à celles des anciens compteurs électroniques. En plus, on peut voir la configuration du Linky sur son afficheur en le faisant défiler avec le bouton "+".

@oleveque : si vous recevez les trames et que vous n'avez pas de tarification particulière, ce sera simple de modifier pour passer au tri. Je vous poste cela dès que ça sera fait.

Pour le code "bourrin", ne stressez pas ! Il y a beaucoup de code "professionnel" qu'il ne vaut mieux pas aller voir. A croire que le prix des claviers est tel que leurs auteurs ont peur de les user. Le code est tellement compacté avec des syntaxes biscornues qu'il est incompréhensible. Cela a beaucoup contribué à la mauvaise réputation du C/C++...

A+ et bonne bidouille

MicroQuettas

bonjour
voici ma trame téléinfo :
PPOT 00 #

ADCO XXXXXXXXXXXX X
OPTARIF BASE 0
ISOUSC 20 8
BASE 001181243 _
PTEC TH.. $
IINST1 000 H
IINST2 002 K
IINST3 000 J
IMAX1 026 8
IMAX2 018 :
IMAX3 027 ;
PMAX 07990 ?
PAPP 00540 *
MOTDETAT 400000 F
PPOT 00 #

ADCO XXXXXXXXXXXX X
OPTARIF BASE 0
ISOUSC 20 8
BASE 001181243 _
PTEC TH.. $
IINST1 000 H
IINST2 002 K
IINST3 000 J
IMAX1 026 8
IMAX2 018 :
IMAX3 027 ;
PMAX 07990 ?
PAPP 00540 *
MOTDETAT 400000 F

et ainsi de suite

en Pj voici le code bourrin promis, la doc compteur Landis & Gyr et le ficher excel avec les trames ancien compteur et nouveau linky. j'ai du rater la notion d'historique dans le doc du linky

IS_031032_Compteur_Landis_EDF_Tri_60A_ZMD12602.pdf (354 KB)

trame teleinfo compteur.zip (7.18 KB)

recup_valeur_teleinfo_3Pv1.zip (4.45 KB)

Bonjour,

Merci pour tout cela. Je regarde et je reviens vers vous.
Est-ce que vous avez besoin des IMAX ?
A priori non pour un délesteur (?)

A+

MicroQuettas

Bonsoir MicroQuettas
Pour le delesteur il me faut 4 choses essentielles :
ISOUSC qui sert de reference pour la comparaison avec le ou les IINST
IINST dans le cadre d'un compteur mono.
IINST1 IINST2 ET IINST3 dans le cadre d'un compteur tri.
Une question avec le numero du compteur est il possible d'identifier le type de compteur linky ou anciens, mono ou tri? Car dans le numero apparait l'annee et un code fabricant, mais je n'ai pas trouvé plus d'infos sur le net.

Olivier

Bonjour Olivier,

Merci pour le message.
J'ai regardé votre programme. Il a :

  • 8 sorties de délestage en monophasé,
  • 3 * 2 sorties pour chaque phase en tri,
  • 2 sorties en tri (pourquoi faire ?)
  • 6 entrées analogiques (pourquoi faire ?)
  • l'algorithme de délestage est du genre : si ça dépasse, je coupe, j'attends, je remets, je teste, si ça dépasse, je coupe, etc...[\li]
  • il utilise les pins 2 et 3 pour le SoftwareSerial. A éviter car elles servent pour le Serial qui devient indisponible, ce qui empêche de débugger... Pas vraiment pratique.

A ce point, avant de faire quoique ce soit, il vous faut déterminer exactement ce que vous voulez faire :

  • un délesteur tri ? combien de sorties de délestage par phase ?
  • un délesteur mono ? Même question ?
  • les deux qui s'adapte tout seul ? Reste la question du nombre de sorties ? Et c'est bien sûr plus compliqué... En avez vous vraiment besoin ?
  • quel algorithme pour le délestage : comme on a la mesure de l'intensité, on peut faire qqchose de plus malin que la "coupure, attente, test et recoupure"...

Quand vous aurez la réponse à tout cela, vous pourrez attaquer le code. Ne le faites pas avant, vous allez galérer.

Pour ISOUSC, je vais le rajouter, mais je ne suis pas convaincu de son utilité car c'est constant. On va consommer des ressources pour lire en continu un truc qui ne change jamais...
Ce serait mieux en paramètre. Je vais faire en sorte de ne le lire qu'une fois au démarrage.

Les chiffres 5 et 6 de l'ADCO donne le type de compteur, mais je n'ai pas la grille.

Voilà, à vous de jouer maintenant,

Bonne bidouille

MicroQuettas