téléinfo 2 compteurs / usb sous linux

Solution à base d'un PC et d'un logiciel (Misterhouse, Domotiga, Heyu, etc). Vous trouverez ici de l'aide pour installer, configurer ou développer des scripts sur ces logiciels. Les principaux langages sont Perl, Java, Shell Unix, Php, etc

téléinfo 2 compteurs / usb sous linux

Messagede human enemy » 19 Oct 2010, 21:14

Bonsoir,

J'ai acheté il y a quelques mois un module de mesures téléinfo 2 compteurs sur le site :

http://www.planete-domotique.com/energi ... teurs.html

L'admin du site m'a envoyé (très rapide et sympa) les spec du matériel car il n'existait pas de soft sous linux.

Comme je viens de passer pas mal d'heures Ă  obtenir quelque-chose qui fonctionne je vous livre ici le fruit des mes recherches.

C'est pas fini mais il ne vous manquera que le décodage des "Frames" pour finaliser votre soft. Je suis preneur de vos améliorations.

Je vais l'utiliser pour monitorer mon installation photovoltaĂŻque (super les 2 compteurs).

Enjoy :D

PS: je vais poster sur le forum photovoltaĂŻque Ă©galement.

teleinfoftdiusb.py
Code: Tout sélectionner
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Samuel Buffet samuel DOT buffet AT gmail DOT com
#
# Prototype d'utilisation du "Modem Téléinformation EDF - 2 compteurs"
# Ce modem est commercialisé par le site "http://www.planete-domotique.com"
#
# Sous Ubuntu (testé avec Karmic) vous devez ajouter une règle udev
# pour que le convertisseur serie/usb du module fonctionne
# sous etc/udev/rules.d  crĂ©ez un nouveau fichier "teleinfoftdi.rules"
#
#       # USB-Serial Converter FTDI
#       ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", MODE="660", GROUP="dialout"
#
# vous devez ensuite installer la lib python-ftdi (sudo apt-get install python-ftdi)
#
# Et voilà c'est pas fini mais avec ça vous devriez pouvoir finir.
#

PORT_1  = 0x11
PORT_2  = 0x22
NO_PORT = 0x00

import ftdi
import time

# Création du context
ftdic = ftdi.ftdi_context()

# Initialisation du context
if ftdi.ftdi_init(ftdic) < 0:
    print "Ă©chec de l'initialisation'"
    exit(-1)

# Ouverture du port
ret = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001)
if (ret) < 0:
    print "Impossible d'ouvrir :" + repr(ret) + "(" + ftdi.ftdi_get_error_string(ftdic) + ")"
    exit(-1)


ftdi.ftdi_set_baudrate(ftdic, 1200)
# Pour une obscure raison pour le moment il faut mettre ftdi.BITS_8
# et non ftdi.BITS_7 comme indiqué dans la spec pour que cela fonctionne ???
ftdi.ftdi_set_line_property(ftdic, ftdi.BITS_8, ftdi.EVEN, ftdi.STOP_BIT_1)


# Activation du compteur 1 et lecture de qqes Frames
print "activation du compteur 1"
ftdi.ftdi_set_bitmode(ftdic, PORT_1, ftdi.BITMODE_CBUS);
i = 0
buf = ' '
frame = 'Frame:'
f = ftdi.ftdi_read_data(ftdic, buf, 0x1)
while i<=2:
   f = ftdi.ftdi_read_data(ftdic, buf, 0x1)

   if f != 0 :
     if ord(buf) == 3:
        print frame
        print ""
        frame = 'Frame:'
        i+=1
     else:
       frame += chr(ord(buf) & 0x07f)

   time.sleep(0.01)


# Exemple de desactivation des compteurs
print "désactivation"
ftdi.ftdi_set_bitmode(ftdic, NO_PORT, ftdi.BITMODE_CBUS);
time.sleep(1);


ret = ftdi.ftdi_usb_close(ftdic)
if ret < 0:
    print "erreur fermeture"
    exit(-1)

ftdi.ftdi_deinit(ftdic);

del ftdic
exit(0)
Dernière édition par human enemy le 28 Oct 2010, 07:08, édité 2 fois.
<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);
PC: Acer AspireOne 2Go HD 250Go sous Ubuntu
Connexion internet: Freebox V6
Mesure électrique: téléinfo en USB vers PC
SOFT Domotique: Atrium (soft perso en python)
Décodage METAR ttes les 30 min pour la météo
ttes info dans une base Sqlite
Avatar de l’utilisateur
human enemy
P'tit Guru de domotique
 
Messages: 63
Inscription: 16 FĂ©v 2007, 00:05
Localisation: strasbourg

Messagede z80_fr » 20 Oct 2010, 13:30

Merci pour le partage de ton expérience.
eBox2300 Lubuntu 10.04 256Mo / 80Go HDD
1x Zibase, 1xPLC1141+ USB
1xPLC4034, 2xPLC2268, 2xPLC2267H, 1x2264
CHACON ON/OFF, Inter CHACON, 3xKR22, 6xMS13, 5xTHGR122, 4xWS70, 1xTéléinfo
1x Nabaztag, 1x Karotz, NAS QNAP

http://x10.dev.free.fr
http://domotiva.free.fr/phpBB3
Avatar de l’utilisateur
z80_fr
Dieu de domotique
 
Messages: 350
Inscription: 24 Oct 2007, 19:16
Localisation: CERGY (95)

Messagede DaRkYoda » 23 Oct 2010, 14:53

Salut,

Merci beaucoup pour le partage !!! Ca fait toujours plaisir de voir qu'il y a des gens qui font profiter les autres de leur travail :)

Encore merci,

A+
-
Ma boutique de produits domotique : http://www.planete-domotique.com

Chez moi : RFXCom - Météo WMR928 Oregon - GR101 - X10
Zwave - Téléinfo EDF - Freebox HD
ROOMBA 560 - Box eeDomus
Avatar de l’utilisateur
DaRkYoda
Dieu de domotique
 
Messages: 1282
Inscription: 22 DĂ©c 2006, 17:15
Localisation: Clermont-Fd

Messagede domotics » 06 Juin 2011, 20:22

Bonjour,
Je suis en train de monter cette carte sur un pc linux.
Pourrais tu me dire ce qu'il faut installer sur linux pour que le modem soit accessible sur la prise usb ?
Merci
Domotics
Domotics
Mon Skype : mr.domotics - Contactez moi pour une démo, des réponses à vos questions, ...
Mon Installation : Eedomus, Zwave, Oregon, Sonos, EnOcean, Chacon, Raspberry Pi, IPX800, WES, RFXTRX, Nas Synology et Cams IP
Mon Conseil : La domotique doit toujours rester simple et demander un minimum de maintenance; Pensez aux autres utilisateurs de la maison ...

Domotics propose ses services via sa société de conseils http://www.id2domotique.com et sa boutique http://laboutiquededomotique.com
Avatar de l’utilisateur
domotics
Administrateur
 
Messages: 5002
Inscription: 15 AoĂ» 2003, 14:38
Localisation: Toulouse

Messagede human enemy » 21 Juin 2011, 20:56

domotics a Ă©crit:Bonjour,
Je suis en train de monter cette carte sur un pc linux.
Pourrais tu me dire ce qu'il faut installer sur linux pour que le modem soit accessible sur la prise usb ?
Merci
Domotics


Bonsoir,

Désolé pour ma réponse tardive mais j'ai peu de dispo en ce moment.

En ce qui concerne le module, la seule chose à faire c'est de rajouter cette règle udev =>

Code: Tout sélectionner
# USB-Serial Converter FTDI
ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", MODE="660", GROUP="dialout"
<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);
PC: Acer AspireOne 2Go HD 250Go sous Ubuntu
Connexion internet: Freebox V6
Mesure électrique: téléinfo en USB vers PC
SOFT Domotique: Atrium (soft perso en python)
Décodage METAR ttes les 30 min pour la météo
ttes info dans une base Sqlite
Avatar de l’utilisateur
human enemy
P'tit Guru de domotique
 
Messages: 63
Inscription: 16 FĂ©v 2007, 00:05
Localisation: strasbourg

Messagede domotics » 21 Juin 2011, 20:58

oui, j'avais trouvé en lisant les commentaires ...

je ne connais pas python, que fait le script, il lit un compteur ? ou deux ? que fait il si le compteur n'est pas connecté au module ? il bloque ? sur le message activation ... ?

Merci
Domotics
Mon Skype : mr.domotics - Contactez moi pour une démo, des réponses à vos questions, ...
Mon Installation : Eedomus, Zwave, Oregon, Sonos, EnOcean, Chacon, Raspberry Pi, IPX800, WES, RFXTRX, Nas Synology et Cams IP
Mon Conseil : La domotique doit toujours rester simple et demander un minimum de maintenance; Pensez aux autres utilisateurs de la maison ...

Domotics propose ses services via sa société de conseils http://www.id2domotique.com et sa boutique http://laboutiquededomotique.com
Avatar de l’utilisateur
domotics
Administrateur
 
Messages: 5002
Inscription: 15 AoĂ» 2003, 14:38
Localisation: Toulouse

Messagede human enemy » 22 Juin 2011, 17:17

Le script précédent était une version de "recherche".

Ci-dessous la version que j'utilise depuis plusieurs mois et avec des commentaires dans le code ce qui le rend plus lisible et plus facile Ă  extrapoler dans un autre langage.

Dans ce script, je crée une Class "TeleinfoCatcher" avec une méthode "run" qui est appelée toutes les minutes par un autre script.

Code: Tout sélectionner
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import ftdi
import serial
import time
import threading

PORT_1  = 0x11
PORT_2  = 0x22
NO_PORT = 0x00

class TeleinfoCatcher(object):

    def __init__(self, electricity_db):
        self.electricity_db = electricity_db

        self.ftdic = ftdi.ftdi_context()

    def extract(self, frame, key, shift, length):
        idx = frame.find(key)
        if idx != -1:
          return frame[idx + shift: idx + shift + length]
        return "0"


    def run(self):
        # Initialisation du context
        if ftdi.ftdi_init(self.ftdic) < 0:
            print "Ă©chec de l'initialisation du module tĂ©lĂ©info"
            return None

        # Ouverture du port
        ret = ftdi.ftdi_usb_open(self.ftdic, 0x0403, 0x6001)
        if (ret) < 0:
            print "Impossible d'ouvrir le module tĂ©lĂ©info"
            return None


        ftdi.ftdi_set_baudrate(self.ftdic, 1200)
        # Pour une obscure raison pour le moment il faut mettre ftdi.BITS_8
        # et non ftdi.BITS_7 comme indiquĂ© dans la spec pour que cela fonctionne ???
        ftdi.ftdi_set_line_property(self.ftdic, ftdi.BITS_8, ftdi.EVEN, ftdi.STOP_BIT_1)

        # Activation du compteur 1 et lecture de HP et de HC
        ftdi.ftdi_set_bitmode(self.ftdic, PORT_1, ftdi.BITMODE_CBUS);

        buf = ' '
        frame = ' '
        finished = False
        HC = 0.0
        HP = 0.0
        i = 999

        ftdi.ftdi_usb_purge_buffers(self.ftdic)

        f = ftdi.ftdi_read_data(self.ftdic, buf, 0x1)

        while not finished:
          f = ftdi.ftdi_read_data(self.ftdic, buf, 0x1)

          if f != 0:
            if (ord(buf) & 0x07f) == 0x0D: #retour chariot = fin de ligne
              ff = frame.decode("ascii", "ignore").strip()

              if ff.find("HCHP ") != -1:
                try:
                  read_HP = float(ff[6 : 6 + 9])/1000
                  if read_HP != 0.0:
                    HP = read_HP
                except:
                  HP = 0.0

              if ff.find("HCHC ") != -1:
                try:
                  read_HC = float(ff[6 : 6 + 9])/1000
                  if read_HC != 0.0:
                    HC = read_HC
                except:
                  HC = 0.0

              if ff.find("IINST ") != -1:
                try:
                  read_IINST = float(ff[6 : 6 + 3])
                  if read_IINST != 999:
                    i = read_IINST
                except:
                  i = 999

              if ((HP != 0.0) and (HC != 0.0) and (i != 999)):
                finished = True

              # rĂ©initialisation de frame
              frame = ' '
            else:
              try:
                frame += unichr(ord(buf) & 0x07f)
              except:
                pass

          time.sleep(0.01)

        ftdi.ftdi_set_bitmode(self.ftdic, NO_PORT, ftdi.BITMODE_CBUS);
        time.sleep(0.1)




        # Activation du compteur 2 et lecture de BASE
        ftdi.ftdi_set_bitmode(self.ftdic, PORT_2, ftdi.BITMODE_CBUS);

        buf = ' '
        frame = ' '
        finished = False
        BASE = 0.0
        ipv = 999

        ftdi.ftdi_usb_purge_buffers(self.ftdic)

        f = ftdi.ftdi_read_data(self.ftdic, buf, 0x1)

        while not finished:
          f = ftdi.ftdi_read_data(self.ftdic, buf, 0x1)

          if f != 0:
            if (ord(buf) & 0x07f) == 0x0D: #retour chariot = fin de ligne
              ff = frame.decode("ascii", "ignore").strip()

              if ff.find("BASE ") != -1:
                try:
                  read_BASE = float(ff[6 : 6 + 9])/1000
                  if read_BASE != 0.0:
                    BASE = read_BASE
                except:
                  read_HP = 0.0

              if ff.find("IINST ") != -1:
                try:
                  read_IINST = float(ff[6 : 6 + 3])
                  if read_IINST != 999:
                    ipv = read_IINST
                except:
                  ipv = 999

              if ((BASE != 0.0) and (ipv != 999)):
                finished = True

              # rĂ©initialisation de frame
              frame = ' '
            else:
              try:
                frame += unichr(ord(buf) & 0x07f)
              except:
                pass

          time.sleep(0.01)

        # Desactivation des compteurs
        ftdi.ftdi_set_bitmode(self.ftdic, NO_PORT, ftdi.BITMODE_CBUS);

        ret = ftdi.ftdi_usb_close(self.ftdic)
        if ret < 0:
            print "erreur fermeture"
            return None

        ftdi.ftdi_deinit(self.ftdic);

        self.electricity_db.add_record(i, ipv, HP, HC, BASE)
<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);
PC: Acer AspireOne 2Go HD 250Go sous Ubuntu
Connexion internet: Freebox V6
Mesure électrique: téléinfo en USB vers PC
SOFT Domotique: Atrium (soft perso en python)
Décodage METAR ttes les 30 min pour la météo
ttes info dans une base Sqlite
Avatar de l’utilisateur
human enemy
P'tit Guru de domotique
 
Messages: 63
Inscription: 16 FĂ©v 2007, 00:05
Localisation: strasbourg

Re: téléinfo 2 compteurs / usb sous linux

Messagede aero67 » 06 Nov 2011, 14:52

Bonjour

J'ai réalisé récemment un module Teleinfo fait maison avec une puce FTDI UsbSerie. (avec comme id 0403:6001)
J'ai Ă©galement un module de conversion vers un bus 1-wire avec la mĂŞme puce (id 0403:6001)

Je sais que ttyUSB0 est le module téléinfo car si je le configure avec stty en 1200/7/paire/1stop j'ai les trames qui s'affichent avec un cat /dev/ttyUSB0
je sais que ttyUSB1 est mon module 1wire que j'ai monté avec owfs.

Comment sélectionner la bonne interface série avec les scripts ci dessus ?

Par avance merci
aero67
Membre un peu timide !
 
Messages: 2
Inscription: 06 Nov 2011, 14:37

Re: téléinfo 2 compteurs / usb sous linux

Messagede human enemy » 08 Nov 2011, 11:27

aero67 a Ă©crit:
Comment sélectionner la bonne interface série avec les scripts ci dessus ?

Par avance merci


C'est avec cette ligne que l'on change d'interface

Code: Tout sélectionner
# Activation du compteur 1 et lecture de HP et de HC
ftdi.ftdi_set_bitmode(self.ftdic, PORT_1, ftdi.BITMODE_CBUS);


Pour une lecture de la deuxième interface, il faut remplacer simplement PORT_1 par PORT_2.
<linux user>463160</linux user>
str = g_strdup_printf ("ubuntu user : %d",20328);
PC: Acer AspireOne 2Go HD 250Go sous Ubuntu
Connexion internet: Freebox V6
Mesure électrique: téléinfo en USB vers PC
SOFT Domotique: Atrium (soft perso en python)
Décodage METAR ttes les 30 min pour la météo
ttes info dans une base Sqlite
Avatar de l’utilisateur
human enemy
P'tit Guru de domotique
 
Messages: 63
Inscription: 16 FĂ©v 2007, 00:05
Localisation: strasbourg

Re: téléinfo 2 compteurs / usb sous linux

Messagede aero67 » 08 Nov 2011, 22:46

Merci pour votre réponse rapide et claire.

Etant un grand débutant un python et en 'linux' en général je n'avais pas fait attention a cette ligne et surtout ne l'avait pas comprise.

Je vais m'atteler a modifier votre script pour l'adapter a mes besoins.

Cordialement
aero67
Membre un peu timide !
 
Messages: 2
Inscription: 06 Nov 2011, 14:37

Re: téléinfo 2 compteurs / usb sous linux

Messagede mickeys » 17 Jan 2012, 18:02

bonjour

je viens de recevoir mon module téléinfos de dauguet (http://teleinfo.dauguet.net/articles.php?pg=44)
par contre je ne sais pas du tout comment le mettre en place sur mon NAS dlink dns 323 qui a funplug debian lenny

j aimerais seulement que le module envoi les infos dans mon nas dans une bdd


pouvez vous m aider svp

cordialement
mickeys
P'tit Guru de domotique
 
Messages: 64
Inscription: 07 Mar 2011, 15:03
Localisation: FR

Re: téléinfo 2 compteurs / usb sous linux

Messagede fma38 » 14 AoĂ» 2012, 08:38

Bonjour, et désolé de ressortir ce vieux fil...

Je suis en train d'essayer d'adapter le script ci-dessus pour une personne qui utilise ce module usb sous windows. Le but final est de remplir une base MySQL avec toutes les infos, de la même manière que le programme C suivant :

http://vesta.homelinux.free.fr/site/wik ... n_edf.html

Mon souci c'est que je ne dispose pas moi-même du module usb, et que je dois donc à chaque fois envoyer le code pour que la personne le teste, puis récupérer les logs ; c'est long !

Ma première question est : est-on obligé de passer par le module python ftdi pour lire ce qui arrive des compteurs ? Est-ce que le module usb n'émule pas tout simplement 2 lignes séries, qu'il serait possible de lire via le module python serial, comme c'est le cas lorsque le module usb est en mode 1 seul compteur ?

Merci d'avance pour vos lumières.
Frédéric
fma38
P'tit Guru de domotique
 
Messages: 56
Inscription: 14 AoĂ» 2012, 08:31

Suivante

Retourner vers Logiciel - Les autres logiciels pour la domotique

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

Copyright © 2011 - Touteladomotique.com - Tous droits rĂ©servĂ©s
Les blogs partenaires : Abavala, Domo-Blog, Domotique34, Maison et Domotique