Le Blog de C-quad

Récupérer la téléinformation avec un Arduino (suite)

Je vous avais parlé, il y a déjà un bout de temps de la méthode afin de récupérer la trame téléinformation EDF à partir d’un arduino. Le défaut de cette méthode, c’est que la trame est « brute ». Je trouvais dommage de ne pas la décoder directement au niveau de l’arduino et n’envoyer que les informations utiles.

Je me suis donc attelé à cette tâche.

Décodage de la trame téléinformation via arduino

Pour rappel, la trame « brute » ressemble à ceci :

ADCO 02092xxxxxx @
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 010956910 %
HCHP 016779643 >
PTEC HP..
IINST 021 Z
IMAX 047 J
PAPP 04860 3
HHPHC A ,
MOTDETAT 000000 B

Le premier fichier (ar_teleinfo)  permet de récupérer et décoder la trame de téléinformation.
Une trame commence par le caractère 0x02 et se termine par le caractère 0x03. Celle ci est composée de groupes.Un groupe commence par 0x0A et se termine par un retour chariot 0x0D.

Une fois qu’on est arrivé au niveau des groupes nous allons pouvoir récupérer les informations intéressantes.

Un groupe est composé :

  • d’une étiquette
  • un espace 0x20
  • une valeur
  • un espace 0x20
  • un caractère de checksum

Il nous reste donc à traiter les chaines de caractères comprises entre les espaces. Le checksum va nous permettre de vérifier que les valeurs récupérées correspondent bien à ce qui nous a été envoyé.

Le deuxième fichier (xpl_teleinfo) sert a envoyé une trame xpl contenant les informations qui ont été décodées précédemment.

Le troisième fichier (time) va permettre d’envoyer le messge xpl-stat et hbeat régulièrement.

Pour votre installation, il est nécessaire de modifier les constantes en début de programme (ar_teleinfo) afin de spécifier notamment l’adresse ip de l’arduino, ainsi que l’intervalle désiré d’envoi de trames xpl.

Récupérer la téléinformation sous domogik

Maintenant que nous décodons et envoyons les trames téléinformation via xpl, nous pouvons nous atteler à les récupérer sous domogik.

Pré-requis: disposer au minimum de la version 0.20alpha1 de domogik.

La version 0.20 de domogik apporte une fonctionnalité très interessante pour la gestion des plugins et external, c’est que ceux ci sont gérés indépendament de domogik et s’installent sous forme de package à partir des repositories de domogik.
J’ai donc réalisé un package pour domogik pour la téléinformation via arduino.

Afin de l’installer, il suffit donc d’avoir domogik en version 0.20alpaha d’installée (en mode install et non develop) et de parcourir les plugins disponibles et de choisir ar_tinfo :

Ensuite afin de pouvoir visualiser les données, il est nécessaire d’ajouter un device :

Une fois le device affecté à un espace de visualisation, vous pouvez donc consulter les informations de téléinformation.

On retrouve un historique précis des consommations électriques :

 

27 réponses à to “Récupérer la téléinformation avec un Arduino (suite)”

  • c’est génial ce que tu as fait, merci beaucoup

  • Bonjour,

    juste 3 petit question ou les mètre c’est fichier .INO
    Le premier ar_teleinfo sur l arduino mais il trouve c’est erreur
    ar_teleinfo2.cpp: In function ‘void setup()':
    ar_teleinfo2:142: error: ‘sendHbeat’ was not declared in this scope
    ar_teleinfo2.cpp: In function ‘void loop()':
    ar_teleinfo2:148: error: ‘pulse’ was not declared in this scope
    ar_teleinfo2:156: error: ‘sendHbeat’ was not declared in this scope
    ar_teleinfo2:167: error: ‘sendTeleinfoBasic’ was not declared in this scope

    et pour les deux autre je voie pas je débute dans arduino donc je mis perd un peut les pédale ^^

    Merci

    • CedricOLIVIER:

      Il te faut dans un premier temps ouvrir ar_teleinfo2.ino avec l’ide ardunio, puis aller dans Croquis et ajouter un fichier …
      Tu ajoutes time.ino, puis xpl_pde.ino

      L’erreur que tu rencontres viens des fonctions qui sont dans les fichiers time et xpl_pde

  • Belibaste:

    Bonsoir,
    Je voudrai faire comme vous mais déja je n’arrive pas à installer domogik sur mon raspberry.

    Pourriez vous m’aider?

  • Maël:

    bonjour,
    meme pb que vx450 comment fait on?
    Merci

    • CedricOLIVIER:

      La fonction sendHbeat est dans le fichier xpl_teleinfo.ino
      Il faut que les fichiers soient au sein d’un même projet (sketchbook) pour que le programme arduino les utilisent bien comme des librairies.

  • Fskies:

    Bonjour

    Merci pour ce super article. Il me donne encore plus envie de programmer sous Arduino. En ce montant, je n’ai pas accès à un compteur EDF (je suis en location) mais j’aimerais faire fonctionner votre programme pour me faire la main. Pensez-vous qu’il soit possible de simuler une tram de Téléinfo brute. Si oui comment le feriez-vous ?

    • Fskies:

      Pour compléter ma demande, j’ai juste besoin d’une trame de téléinfo en binaire brute. J’ai déjà modifié le programme pour recevoir les données sur l’interface série de l’USB. Si quelqu’un pouvait me donner ceci, ça serait super cool. J’ai recherché durant plusieurs heures et je n’ai rien trouvé.

      Merci

  • Maël:

    merci pour votre reponse, j’ai un compteur triphasé faut il modifier le programme arduino pour lire les 2 autres phases?

  • Maël:

    voici les infos de mon compteur
    ADCO 05xxxxxxxxxx 7
    OPTARIF BASE 0
    ISOUSC 60 <
    BASE 277539107 4
    PTEC TH.. $
    IINST1 011 J
    IINST2 003 L
    IINST3 011 L
    IMAX1 045 9
    IMAX2 047 <
    IMAX3 052 9
    PMAX 26240 4
    PAPP 05700 –
    MOTDETAT 000000 B
    PPOT 00 #
    x03x02ADCO 05xxxxxxxxxx 7
    OPTARIF BASE 0

    il faut que je modifi le programme pour le decodage teleinfo?
    merci
    mael

  • julien:

    Bonjour,
    C’est vraiment génial….
    mais je debute donc une grosse question me trotte, l’arduino utilisé pour EDF ne pourra pas en plus servir pour recupéré par exemple les temperatures de la caves et du sous sol (je serais obliger d’en utiliser un second a cause des 3 programmes ino que l’on install si j’ai tout compris?)
    Merci pour le partage

    • CedricOLIVIER:

      Il peut tout à fait faire autre chose.
      L’arduino boucle en continu et réalise des actions dans sa boucle, il suffit donc d’ajouter les actions/tests désirés.

  • Maël:

    j’ai bien modifier le decodage de la trame mais j’ai un probleme.
    j’ai identifier le probleme dans la section getTeleinfo si je commente les lignes apres « int etrameComplete=0″ jusqu’a la fin, ma arduino envoie bien des messages en xpl sinon rien du tout.
    je decommente au fur et a mesure mais toujours le meme pb.

  • Christophe:

    Bonjour,
    Tout d’abord bravo et merci pour le partage de votre travail…
    Actuellement, je bloque sur la remontée de la téléinfo sur domogik. Je vois le plugin actif au démarrage de l’arduino, mais il s’arrete au bout de 2 min. Pour info, avec le moniteur série de l’arduino, je vois bien la remontée de la téléinfo ainsi que le hbeat au démarrage.
    Avez vous une idée sur mon blocage ?
    Merci
    Christophe

  • Freddy:

    Bonjour,
    je trouve tous ça super, un très beau travail.
    moi je cherche juste un sketch pour récupérer l’info heure pleine et uniquement cette info.
    quelqu’un aurai-t-il un code le plus simple possible.
    merci d’avance et bonne continuation à tous.

  • Alexandre:

    Bonsoir,
    Je n’ai pas utilisé le code tel quel par ce que je voulais juste savoir si ma téléinfo est activée et pouvoir décoder les trames. Le code étant étant structuré je n’ai eu aucun soucis pour l’expurger de la partie transmission. Par contre comme j’utilise un Arduino Leonardo, j’ai dû modifier la PIN pour le RX pour que SoftwareSerial fonctionne. C’était bien indiqué dans la documentation de SoftwareSerial.
    Il me reste à exploiter tout ça en le transmettant à un site d’Internet of things. J’utiliserai soit mon Shield Ethernet ou mon tout nouveau Arduino Yun.
    En tous cas merci pour le partage de ce code. Ca m’a bien aidé.

  • Lionel:

    Salut,

    Super article et fonctionne impec en plus.
    J’ai une question comment on fait un plugin external pour domogik, est-ce que tu as quelques infos ?

    Merci d’avance.

  • Moute:

    Bonjour,

    Tout d’abord merci pour cette réalisation que je suis impatient de pouvoir mettre tout ça en place.
    Je viens d’essayer d’installer votre solution et j’arrive à un problème. Voici les étapes que j’ai suivi :
    – J’ai réalisé le montage sur l’arduino UNO et je l’ai testé avec un code simple pour voir ma téléinformation sur le moniteur série -> ça marche
    – J’ai téléversé votre programme sur l’arduino qui semble fonctionner (d’après l’affichage du moniteur série)
    – L’arduino est connecté à mon réseau LAN et alimenté par USB
    – J’ai déployé domogik 0.3 et domoweb 0.3
    – J’ai installer le plugin externe ar_tinfo qui trouve mon arduino, son port et son IP mais n’affiche pas son état :
    Version: 0.1a0
    Documentation: Wiki
    Hôte: garage
    Technologie: arduino
    Etat:
    – Je l’ai tout de même rajouté en périphérique sans souci.
    Le problème est que lorsque je rajoute les graphiques de visualisation, rien ne s’affiche. Tous les graphique reste à 0. Comme s’ils ne recevaient aucune information de l’arduino.

    Je suis débutant en domotique et particulièrement sur le xPL. Je me demande notamment s’il faut relié directement l’arduino et le Raspberry sans switch ? Faut-il un LAN spécifique xPL ou peut-on utiliser le LAN sur lequel son connecter les autres PC ?

    J’avais commencé, par erreur, à installer le plugin interne teleinfo qui doit être fait pour une teleinfo par port USB et non par XPL. Cela pose-t-il un problème ?

    Avez-vous une idée de la source de mon problème ?

    Merci

    Moute

    • CedricOLIVIER:

      Je te conseille d’aller sur le salon IRC du projet domogik, tu y trouveras surement de l’aide concernant l’intégration à domogik.

      Cédric

  • pwaspam:

    Bonjour,

    Merci bcp pour cet article.
    J’ai trouvé un petit probleme que j’ai corrigé de mon côté.
    En effet, dans la fonction getTeleinfo() le table check n’est pas remis à 0 et donc le checksum est neutralisé dès la premiere trame complete recue…

    Penser à ajouter ceci avant lireTrame :
    for (i=0; i<11; i++) {
    check[i]=0;
    }

    Cdt,
    Pierre

  • waza:

    Bonjour,

    Article très intéressent mais au risque de paraître bête je ne trouve pas ou télécharger les sources pour l’arduino.

    Merci.

Laisser un commentaire