Raspberry PI, RPIDOM, Python & MySQL

Cet article vous propose de mettre en place un collecteur Python de trame Téléinformation et d’envoyer l’information vers une base de données MySQL avec une carte Raspberry PI dotée d’une carte RPIDOM. La carte RPIDOM propose deux autres fonctionnalités comme l’horloge interne (RTC) et la gestion d’un bus 1-Wire facilement exploitable avec un serveur Owserver (OWFS). Pour rappel, les Raspberries PI n’ont pas d’horloge interne RTC (Real Time Clock), et sont donc  incapable de conserver l’heure et la date (lorsque redémarré),  s’ils n’ont pas de connexion internet disponible pour effectuer les mises à jours NTP (Network Time Protocol). Raspberry PI, RPIDOM, Python & MySQL

Pré-requis

Avant de commencer la mise en place de la solution vous devrez réunir les éléments suivant :

  • des connaissances informatique de niveau intermédiaire (Débutant / intermédiaire / Avancé) ;
  • le logiciel Putty (Connexion SSH) ;
  • 1 carte Raspberry PI (Sa SD et son alimentation) ;
  • 1 Carte RPIDOM (Yadom) ;
  • 1 Serveur MySQL sur un système distant ;
  • 1 compteur EDF avec la Téléinformation activée ;
  • 1 câble deux pôles pour la connexion I1I2 du compteur EDF ;
  • de l’huile de coude et 2 heures de votre temps.

Spécifications

La carte RPIDOM offre les fonctionnalités suivantes :

  • 2 connecteurs (I1I2) pour la Téléinformation de vos compteurs EDF ;
  • 1 connecteur bus 1-Wire ;
  • 1 horloge interne sauvegardée (RTC) ;
  • 1 connecteur d’alimentation;
  • 1 connecteur d’extensions GPIO ;

Préparation de la SD du Raspberry

Récupérer la dernière image officielle sur le site http://www.raspberrypi.org/downloads (fichier Wheezy Raspbian). Une fois décompressé, on obtient le fichier « *****-wheezy-raspbian.img ». Pour copier l’image officielle sur une carte SD, on peut utiliser l’outil open source Win32 Disk Imager .

Décompresser le fichier télécharger, puis lancer le programme Win32DiskImager :

Win32disk-manager

Dans le fenêtre ci-dessus, effectuer les étapes suivantes :

  1. Sélectionner le fichier source (dernière image officielle wheezy-raspbian.img) ;
  2. sélectionner le disque destination (SDcard insérée dans un port SD du PC ou un lecteur externe) ;
  3. lancer l’écriture en cliquant sur le bouton « Write » ;
  4. confirmer l’écriture en cliquant sur « Yes ».

L’opération d’écriture est assez longue (plusieurs minutes). A la fin de l’écriture, votre carte SD est prête à être utilisée dans la Raspberry Pi.

Configuration du Raspberry

Avant de mettre sous tension la Raspberry Pi, vous devez :

  • Insérer la carte SD précédemment générée ;
  • fixer la carte Rpidom sur la rapsberry PI (hors tension) ;
  • brancher un clavier USB et un écran HDMI (option) ;
  • brancher un câble ethernet relié au réseau de votre domicile (votre box internet par exemple).

A la mise sous tension apparaît l’écran de configuration initiale (sudo raspi-config).

Après avoir exécuté l’option 1 pour étendre le système de fichiers à l’intégralité de l’espace disponible  (à la prochaine mise sous tension, la partition sera étendue à la taille de votre carte SD), vous pouvez paramétrer les « Locales » avec le menu 4. Vous pouvez aussi vérifier que votre serveur de connexion SSH est activé avec l’option 8 + A4. De la même manière vous pourrez changer le mot de passe de votre session « PI ».

rpi-sudo-raspi-config-01

rpi-sudo-raspi-config-02

rpi-sudo-raspi-config-03

rpi-sudo-raspi-config-04

rpi-sudo-raspi-config-05-ssh-enable

rpi-sudo-raspi-config-06-ssh-enable

rpi-sudo-raspi-config-07-ssh-enable

rpi-sudo-raspi-config-08-set-password

rpi-sudo-raspi-config-09-set-password

Après toutes ces opérations, le reboot suivant est assez long en raison de l’opération d’extension de la partition (qui n’est faite qu’un seule fois). A la fin du démarrage (boot), il est enfin possible de se loguer avec le login «pi » et le mot de passe « raspberry » (si inchangé).

  1. Il est aussi judicieux de mettre à jour le système de votre Raspberry avec l’option 8 + A5.
  2. Vous pouvez aussi mettre à jour le Firmware de votre RPI avec le tutoriel de Korben.

Connexion au compteur EDF

La connexion de la carte d’extension RPIDOM est très simple à réaliser. Il suffit d’empiler la carte RPIDOM sur le Raspberry PI en respectant le sens logique des broches, mais bien entendu lorsque cette derniere n’est pas alimentée.

rpidom-connectiques rpidom-schema01

Il faudra ensuite relier une des deux entrées de Téléinformation (par exemple le bloc B) au compteur EDF avec deux fils. Il n’y a pas de polarité entre les deux fils Teleinfo01, I1 et I2.

teleinfo-I1I2

Une fois cette opération réalisée, l’installation logicielle pourra-t’être envisagée.

Installation logicielle de la carte RPIDOM

Le Manuel RPIDOM de Yadom est à l’origine du tutoriel ci-dessous, avec des compléments de captures d’écran.

Respecter la casse minuscule/majuscule des captures d’écran ou du manuel.

Connexion SSH (Console)

Depuis l’utilitaire Putty, se connecter à votre Raspberry en saisissant l’adresse IP (Tutoriel).

  • Identifiant : « pi »
  • Mot de passe : « raspberry »

Attention, si vous n’avez pas paramétré les « locales », le clavier ne sera pas reconnu en « AZERTY » mais en « QWERTY ». Ce qui signifie que le vous devrait frapper le mot de passe « rqspberry ».

putty-raspberrypi

Modification du fichier « cmdline.txt »
Commande : sudo nano /boot/cmdline.txt
  • « sudo » =  (abréviation de substitute user do, en anglais : « exécuter en se substituant à l’utilisateur »). Permet d’exécuter une commande en tant qu’administrateur.
  • « nano » = Éditeur de fichier texte.

rpidom-ssh01

remplacer la ligne :
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
par :
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
ou supprimer :
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

rpidom-ssh02

rpidom-ssh03

Modification du fichier « inittab »
Commande : sudo nano /etc/inittab
 T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

devient :

 #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

rpidom-ssh04

rpidom-ssh05

Redémarrage  du Raspberry
commande : sudo reboot

rpidom-ssh06

Configuration du port série
Commande : stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 clocal -crtscts 

Visualisation des données téléinformation du premier compteur :

Commande : echo A > /dev/ttyAMA0
Commande : cat /dev/ttyAMA0

On visualise les données envoyées par le premier compteur. Visualisation des données téléinformation du premier compteur :

Commande : echo B > /dev/ttyAMA0
Commande : cat /dev/ttyAMA0

On visualise les données envoyées par le second compteur.

rpidom-ssh07

rpidom-ssh08

Installation du serveur OWFS

OWFS est une interface web permettant de contrôler un bus 1-Wire.

Commande : sudo apt-get install owserver ow-shell owhttpd owfs-fuse

rpidom-ssh11

Activation du bus i2c sur lequel est branché l’interface 1wire

Editer le fichier /etc/modprobe.d/raspi-blacklist.conf

Commande : sudo nano /etc/modprobe.d/raspi-blacklist.conf

Commenter la ligne

#blacklist i2c-bcm2708

rpidom-ssh12

Editer le fichier /etc/modules

Commande : sudo nano /etc/modules

et ajouter la ligne : i2c-dev

rpidom-ssh13

Configuration du serveur OWFS

Il faut ensuite éditer le fichier /etc/owfs.conf et commenter la ligne 16 :

#server: FAKE = DS18S20,DS2405

rpidom-ssh14

Dé-commenter les lignes 32 et 33 (mountpoint = /mnt/1wire et allow_other)

rpidom-ssh14bis

et ajouter à la fin du fichier la ligne

device = /dev/i2c-1

rpidom-ssh15

Redémarrage du serveur :

Commande : sudo /etc/init.d/owserver restart

Si jamais on a un message « failed », il faut mettre /dev/i2c-0 dans fichier ci-dessus.

Création d’un point de montage et montage :

Commande : sudo mkdir /mnt/1wire/
Commande : sudo owfs -s localhost:4304 -m /mnt/1wire/ --allow_other

Vérification du fonctionnement du Serveur OWFS en allant à l’adresse http://<IP-RPI>:2121/ :

rpidom-owfs-01

Mise à jour YADOM

ATTENTION, avant de lancer la mise à jour, il est nécessaire que le port série soit disponible de façon exclusive pour la carte RPIDOM ou RPIDOM LITE (pas de console ou de tâche cron qui y accède, etc…)

Installer les paquets « python-serial » et « python-setuptool » :

commande : sudo apt-get install -y python-serial python-setuptool

Télécharger la mise à jour Yadom :

commande : wget http://www.yadom.fr/updates/update050413.tar

Décompresser l’archive Tar :

commande : tar -xf update050413.tar

Aller dans le répertoire de décompression :

commande : cd update

vérifier la disponibilité du port série :

commande : cat /dev/ttyAMA0

Si une erreur d’accès apparaît (at: /dev/ttyAMA0: Permission denied), c’est que le port série est toujours connecté à la console. Voir la documentation de la carte RPIDOM.

Lancer la mise à jour :

Attention, cette étape est assez courte, mais ne doit surtout pas être interrompue, sous peine de rendre la carte inutilisable.

commande : python update.py

Documentation officielle de mise à jour 050413

Préparation de la base de données MySQL

 Dictionnaire de données

Un dictionnaire des données est une collection de métadonnées ou de données de référence nécessaire à la conception d’une base de données relationnelle. Il revêt une importance stratégique particulière, car il est le vocabulaire commun de l’organisation. Il décrit des données aussi importantes que les clients, les nomenclatures de produits et de services, les annuaires, etc. C’est donc le référentiel principal de l’entreprise, sur lequel s’appuient les décisions de celle-ci. Il est souvent représenté par un tableau à quatre colonnes contenant le nom, le code et le type de donnée ainsi que des commentaires. (Sources : Wikipédia Fr)

Globalement, un dictionnaire de données est un document définissant la structure des tables d’une base de données (relationnelle).  Ce dictionnaire de données correspond à la définition de forme et de stockage de la donnée. Ce document sert dans un premier lieu à  créer une base de données, et servira ensuite au développeur pour créer des applications exploitant les données de la base. Ce dictionnaire s’appuie sur l’article Téléinformation.

dicodata

Créer une base de données MySQL avec PhpMyAdmin

Dans mon cas, la base de données s’appelle « consommation ».

rpidom-phpmyadmin-00

Mettre en place une table « T_TELEINFO » dans cette base de données

rpidom-phpmyadmin-00bis

  1. Se positionner sur la base de données en question ;
  2. sélectionner l’onglet « SQL » ;
  3. copier-coller le contenu du  fichier SQL ;
  4. exécuter la requête.

Installation de la librairie « python-mysqldb »

Commande : sudo apt-get install python-mysqldb

Vérifier le fonctionnement en console Python depuis une session SSH :

Connectez-vous au RPI puis lancer les commandes suivantes :

Commande : python
Commande : import MySQLdb

Si vous n’avez pas d’erreur on continu.

Programmer la collecte des données « Téléinformation »

Télécharger le fichier teleinfo-mysql.py :

Commande : cd /home/pi/rpidom/
Commande : wget  http://domotique-info.fr/wp-content/uploads/2013/06/teleinfo-mysql.py_.txt
Commande :  mv teleinfo-mysql.py_.txt teleinfo.py

Planifier l’exécution du fichier Python :

Commande : crontab -e

Ajouter la ligne suivante :

*/5 * * * * /usr/bin/python /home/pi/rpidom/teleinfo.py

Collecte toute le 5 minutes (= 12 par heure = 288 captures par jour)

Redémarrer « cron » :

Commande : sudo /etc/init.d/cron start

rpidom-python-crontab-01

Conclusion

Bien qu’il existe beaucoup de façons plus simple de collecter les Téléinformations, je vous ai présenté aujourd’hui une solution « fait le toi-même » (DIY) assez peu onéreuse (environ 80€). Il est à noter que le Raspberry peut aussi porter parallèlement d’autres solutions domotique, et donc amortir l’investissement. Cependant, j’avoue que le DIY dans ce cas est assez complexe et peu accessible au débutant.

Avec un peu d’acharnement, un débutant pourra y arriver. N’hésitez pas à poser vos questions.

Author: Sébastien Joly

Passionné de plongée, de voile croisière, de navigation, d'océans, de géomatique, de domotique, d'informatique ... des tictictics, je suis technophile un point c'est tout. Je m'intéresse à la domotique depuis plusieurs années mais je me suis lancé fin 2012 seulement. [ Accéder à mes articles ]

Share This Post On

37 Comments

  1. complet cet article ! je crois bien que je vais le tenter mais pour ma part avec un arduino vu que c’est ce que j’ai. après faut que je trouve commment balancer l’info sous forme de web service!

    belle réalisation en tout cas!

  2. Oooh Yeh @Orson, cela fait longtemps que je t’ai croisé sur le Net !

  3. Il y a une coquille dans le tuto ! Maishouskellest ?

  4. slt

    merci pour le tuto ..clair concis
    que demander de plus …rien

    @+

  5. Bonjour,
    Serait possible de remettre à dispo le script Pyton de teleinfo.
    merci

  6. Sur ma Raspberry B et ma rpidom fraichements achétés reboot figé après Modification du fichier « inittab » reboot je ne comprends pas pourquoi après deux autre tentatives toujours pas résolu.

    Merci de votre aide

  7. Le tuto est tres clair, mais je rencontre un probléme a l’execution du script python. j’ai le message
    Traceback (most recent call last):
    File « teleinfo.py », line 11, in
    import serial
    ImportError: No module named serial

    Si quelqu’un à une idée je suis preneur
    Merci

  8. bzh16, à priori il te manque les librairies Python Serial. Il te faut les installer avec la commande :
    sudo apt-get install python-serial

  9. Merci, cela fonctionne parfaitement maintenant.

  10. super pour ce tuto… merci beaucoup,!!!!

  11. Bonjour, j’attends des cartes en commande pour voir si je peux les adapter à mon cas: principalement lecture des infos intensité de 2 compteurs tri (IINST1 à 3) d’un compteur de production photovoltaique autoconsommation et d’un compteur EDF. Il me faudrait en particulier surveiller les I instantanné de mon compteur de production. Ceci afin dans le cadre d’une domotique maison déclencher le fonctionnement d’appareils energivores au bon moment.
    Je ne trouve pas les infos adaptées dans ce tuto, mais si vous avez des infos ou programmes approprié, je suis intéressé.
    Cordialement

  12. Bonjour Jean-Luc,
    Je n’ai pas vraiment compris la question.
    Peut-être est-ce de savoir si la carte RPIDOM est capable de fonctionner en Triphasé ? Si oui, il faut que je me renseigne car je ne sais pas.
    Peut-être existe-t’il une solution toute intégrée correspondant à la description de votre problématique : http://my-domotique.com/store/index.php?id_product=413&controller=product&id_lang=2

  13. Bonjour
    Je reformule ma question, mal comprise.
    Mon compteur triphasé émet en téléinfo les intensités des 3 phases.
    Je souhaiterais donc, plutôt que de faire un autre système de mesure de ces intensités, faire une lecture périodique de ces valeurs dans 1 programme en python.

  14. Bonjour Jean-Luc,
    A priori, il suffit d’adapter le modèle de données de ma procédure selon les trames Triphasée
    Trames Triphasées

  15. Bonjour sebastien
    merci de ta reponse rapide.
    Ca je l’ai bien compris, mais ce que je souhaite faire ce n’est pas enregistrer les données dans une base mysql distante. mais exploiter directement les valeurs lues dans un programme.

  16. @Jean-Luc
    Il suffit donc d’exploiter directement les trames en modifiant la partie traitement du script python, et en adaptant ce dernier à la structure des trames triphasées.

  17. ok, Je peux le trouver ou ce script python
    autrement, j’ai fait les premiers tests de lecture par la commande cat, la lecture s’interrompt apres quelques mn, c’est normal?
    PS: je m’excuse pour toute ces questions mais je me suis mis au linux et programmation python depuis seulement quelques jours

  18. Un « cat » est une redirection statique de concatenation vers l’affichage console.
    Pour suivre dynamiquement, la commande « tail -f » serait plus adaptée.

  19. je parlais du cat de la procedure pour visualiser les teleinfos: cat /dev/ttyAMA0
    le défilement s’arrete après un temps variable, il semble qu’il y a des parasites, peut etre mon cable que j’ai mis pour tester?environ 40m de cable telephone.

  20. Merci, Ca marche pour lire en python sur les 2 sorties teleinfos (en fait j’ai 2 compteurs dont l’un emet des infos bizzares)..
    Je regarde maintenant comment accéder au bus 1_wire. J’ai un doute que ca fonctionne car j’avais « fail » avec dev/i2c-0 ou dev/i2c-1dans la procédure. mais je ne compte pas le faire par OWSERVER, toujours en python dans le meme programme.
    Question préalable: Est ce que l’installation de la carte RPIDOM désactive le bus 1_WIRE présent sur le connecteur du Raspberry et en émule simplement un deuxième derrière un bus i2c?

  21. C’est une bonne question, à laquelle je répondrai sans certitude.
    Je pense que le bus i2c natif du micro-contrôleur RPI est le seul, car la procédure supprime de la blacklist le bus dans le fichier /etc/modprobe.d/raspi-blacklist.conf.

  22. FYI : i2c et RPI

  23. Merci sebastien pour ta patience, Tu sais ou trouver un script python accedant au 1-WIRE de la carte RPIDOM?

  24. Sébastien,

    J’espère que ce post est pas enterré pour toi ;)

    J’ai un problème avec le script python, tous les éléments remontent sauf le PTEC (HC.. ou HP..) alors que le

    Premiere voie
    IINST : 004
    MOTDETAT : 000000
    OPTARIF : HC..
    ADCO : 049601110448
    HCHC : 114369620
    IMAX : 054
    ISOUSC : 75
    HHPHC : D
    HCHP : 174600547

    La trame téléinfo :

    IMAX 054 H
    HHPHC D /
    MOTDETAT 000000 B
    ADCO 049601110448 >
    OPTARIF HC.. <
    ISOUSC 75 B
    HCHC 114369620 &
    HCHP 174600344 0
    PTEC HP..
    IINST 003 Z

    Si vous avez une idée je suis preneur, je tourne en rond :)

    Merci pour ce script et toutes vos contributions.

    Stéphane

  25. @BOULENT,
    Est-ce le retour console que tu as collé ?
    Je trouve qu’il y a des erreurs de caractères en plus.

  26. Merci de ton retour.

    Oui c’est mon retour shell :
    python2.5 teleinfo.py

    Premiere voie
    IINST : 005
    MOTDETAT : 000000
    OPTARIF : HC..
    ADCO : 049601110449
    HCHC : 114369620
    IMAX : 054
    ISOUSC : 75
    HHPHC : D
    HCHP : 174602080

    Pour information je suis sur XPEnology (que je conseil à tous).

    Je ne veux pas utiliser le script compilé en C car je dois en déduire le PAPP ne remonte pas (et EDF ne me fait aucun retour / à mon compteur).

    Si le lance un cat sur ttyUSB0 voici le retour brute :

    cat /dev/ttyUSB0
    P 174602156 3

    PTEC HP..

    IINST 006 ]

    IMAX 054 H

    HHPHC D /

    MOTDETAT 000000 B

    ADCO 049601110449 >

    OPTARIF HC.. <

    ISOUSC 75 B

    HCHC 114369620 &

    HCHP 174602157 4

    PTEC HP..

    ….

    Pour toi quel devrais être mon retour coté script python (@sebastien :Je trouve qu’il y a des erreurs de caractères en plus).

    Stéphane

  27. @BOULENT,
    Là je suppose qu’il y a une erreur de traitement des étiquettes de trames.
    Tu as modifié le script Python pour ajouter une deuxième voies mais les variables chargeant les valeurs de la trames ont bien des noms différents ?
    Tu as adapté ce script de traitement de la trame sur une clé USB Téléinfo ?
    Tu as plusieurs compteurs ?
    On s’éloigne du tuto original non ?

  28. Merci pour ton retour Sebastien.

    Je n’ai modifié que les étiquettes liées à la base SQL.

    Je ne pensais pas que la lecture des étiquettes des trames téléinfo différaient entre le PRIDOM et une carte USB téléinfo. Je pense que tu m’as mis sur la piste :)) Je vais devoir analyser le script python sur le traitement des trames.

    Effectivement je dérive du sujet principale. Je te propose de supprimer les quelques posts hors sujet et je vais créer un post sur le forum touteladomotique (si cela ne te dérange pas de citer ce post et d’en proposer une adaptation, si je trouve la solution :)).

    Cordialement,

    Stéphane

  29. Tu peux aussi nous proposer ton article. Nous le mettrons en ligne et en lien.

  30. Bonjour, merci beaucoup pour ce tuto. j’ai surtout utilisé le script teleinfo.py ne connaissant pas du tout python et ayant très peu de temps chez moi (2 petites jumelles oblige…). ça m’a permis d’avoir des résultats immédiatement, merci beaucoup.

    j’ai par contre vu qu’il y a un problème dans le script :
    le split( » « ) supprime le CRC si il vaut précisement  » « …
    du coup il ne passe pas dans les trames valides. (ça m’arrive assez souvent sur l’étiquette BASE)

    j’ai compensé en remplacant la ligne 50 :
    if (len(trame) == 3) and (checksum(trame[0],trame[1]) == trame[2])

    par

    if (((len(trame) == 3) and (checksum(trame[0],trame[1]) == trame[2])) or ((len(trame) == 2) and (checksum(trame[0],trame[1]) ==  » « )))

    il y a peut-être plus élégant (je le redis, je ne connais pas python), mais ça fait le job…

    voilà, si ça peut aider un peu…

  31. Re…
    désolé en fait ça serait plutôt 4 la taille du tableau et pas 2…
    j’ai attendu 2 jours avant de poster et j’ai juste eu du bol, pas d’erreurs, alors que j’en avais environ 5 à 10 par jours avant…

    if (((len(trame) == 3) and (checksum(trame[0],trame[1]) == trame[2])) or ((len(trame) == 4) and (checksum(trame[0],trame[1]) ==  »  » )))

    je reconfirme dès que je suis sur.

  32. Bonjour Jean Luc
    J’ai un même problème que tu as rencontré avec une même configuration.
    « J’ai fait les premiers tests de lecture par la commande cat, la lecture s’interrompt apres quelques mn, c’est normal?
    Je parlais du cat de la procedure pour visualiser les teleinfos: cat /dev/ttyAMA0
    le défilement s’arrete après un temps variable ».

    Comment je pourrai règler ce problème?

    Merci par avance.

Laisser un commentaire