Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

les autres capteurs : Sondes Météo, switches
dbocart
Messages : 39
Enregistré le : 06 déc. 2014, 14:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par dbocart »

Bonjour,

Même pb chez moi, ok via /dev/ttyAMA0 mais rien sous domoticz :(
Je contaste aussi que dans les cas qui fonctionne la valeur renvoyé PAPP est présente, pas chez moi :(
RPI B, RFXtrx433e, 2 x Chacon fils pilote (4 radiateurs RDC, 2 ETG) , 3x T° THN132N , 2x T° 1-Wire, téléinfo EDF filaire (via opto), clé Zigbee ConBee II -> 2 Sonoff, 8 ampoules

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par mulot35 »

Code : Tout sélectionner

Bonjour,
-j'ai deux compteur a la maison 1 edf maison & 1 edf photovoltaique
-je valide tout le hardware par le faite que le photovoltaique fonctionne
-et je vois les trames du edf maison dans putty

Ci joint les trames téléinfo

Compteur photovoltaique : Sagem S10C4 (fonctionnel)

Trame du photovoltaique
ADCO 020828497082 I
OPTARIF BASE 0
ISOUSC 15 <
BASE 011697323 +
PTEC TH.. $
IINST 001 X
IMAX 009 H
PAPP 00260 )
MOTDETAT 400000 F

puis environ 3min plus tard

ADCO 020828497082 I
OPTARIF BASE 0
ISOUSC 15 <
BASE 011697324 ,
PTEC TH.. $
IINST 001 X
IMAX 009 H
PAPP 00250 (
MOTDETAT 400000 F

Compteur edf : Sagem S10C1 (non fonctionnel sous domoticz , ok sous putty)

OPTARIF HC.. <
ISOUSC 30 9
HCHC 057479903 2
HCHP 056420235 .
PTEC HP..
IINST 001 X
IMAX 031 C
HHPHC D /
MOTDETAT 000000 B


puis quelque sec plus tard

ADCO 029701401358 ?
OPTARIF HC.. <
ISOUSC 30 9
HCHC 057479903 2
HCHP 056420239 2
PTEC HP..
IINST 001 X
IMAX 031 C
HHPHC D /
MOTDETAT 000000 B

Montage fonctionnel activation du p1 smart meter via le photovoltaique fonctionnement ok.
Passage sur le edf non fonctionnel (sans rien recreer)

Voila si vous avez des idées
dbocart a écrit :Bonjour,

Même pb chez moi, ok via /dev/ttyAMA0 mais rien sous domoticz :(
Je contaste aussi que dans les cas qui fonctionne la valeur renvoyé PAPP est présente, pas chez moi :(
Maintenant que tu en parle c'est vrai que mon photo voltaique qui fonctionne envoye du PAPP tandis que mon edf non reconnu sous domoticz (mais ok sous putty) n'envoye pas de PAPP...

-un autre fofo parle de l'abscence du PAPP http://www.touteladomotique.com/forum/v ... 30&t=11602 mais gizmo devrait pouvoir nous faire un " si papp abscent faire le calcul ............. et l'affiché .........."

-jeedom a vu le probleme https://www.jeedom.fr/wiki/index.php?ti ... nformation
Puissance apparente : Certains compteurs ne renvoie pas l'information PAPP. Pour cela un calcul à été implémenté afin d'obtenir une moyenne de consommation en W toutes les minutes.
Patrice => Es ce que ca vaut le cout d'informer le fofo anglais de l'éventuel cause du PAPP pour la non reconnaissance des compteurs?
Modifié en dernier par mulot35 le 28 mai 2015, 21:19, modifié 1 fois.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

patrice
Messages : 1674
Enregistré le : 22 sept. 2014, 21:51

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par patrice »

dbocart a écrit : Patrice => Es ce que ca vaut le cout d'informer le fofo anglais de l'éventuel cause du PAPP pour la non reconnaissance des compteurs?

A mon avis oui si on est vraiment surs que cela vient de la (je n'ai pas suivi dans le détail tous les echanges)
Maison en construction : en attente d'un nouveau terrain de jeu.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par mulot35 »

En gros on tourné en rond et dbocart a vu qu'il manqué le PAPP pour les compteurs non fonctionnel.

il peut etre apparament calculé
eextrait du site : http://conseils-thermiques.org/contenu/ ... arente.php

Code : Tout sélectionner

La puissance apparente

La puissance apparente est la somme (trigonométrique) de la puissance active et réactive. C'est par ailleurs la puissance souscrite (kVA) pour abonnement ERDF. Elle se calcule comme suit : S=U.I S = Puissance apparente (VA) (homogène à des Watts)
U = Tension (V)
I = Intensité (A)

La puissance apparente est l'hypothénuse du triangle des puissances. On peut donc, grâce à ce bon vieux Pythagore, la calculer à partir des deux autres puissances : S=√(P²+Q²) S = Puissance apparente (VA) (Volt-Ampère)
P = Puissance active (W)
Q = Puissance réactive (VAR)
Es ce que tu peut gérer la demande mon anglais est comment dire .... oui googlesque !!!

Merci

EDIT: il en parle sur le fofo mais c'est incompréhensible.
http://www.domoticz.com/forum/viewtopic.php?f=6&t=6389
Message de patrice je pense:
http://www.domoticz.com/forum/viewtopic.php?f=6&t=6666
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par mulot35 »

Re,
Alors je suis parti du poste du grand fofo http://www.domoticz.com/forum/viewtopic.php?f=6&t=6389 où le gars a l'air d'avoir réussi.
Le gars a posté ca :

Code : Tout sélectionner

    Index: hardware/Teleinfo.cpp
    ===================================================================
    --- hardware/Teleinfo.cpp       (révision 2383)
    +++ hardware/Teleinfo.cpp       (copie de travail)
    @@ -45,7 +45,7 @@
     
     #define TE_ADCO "ADCO" //meter id
     #define TE_OPTARIF "OPTARIF"//pricing option
    -#define TE_ISOUSC "ISOUC"//current power subscribe   //A
    +#define TE_ISOUSC "ISOUSC"//current power subscribe   //A
     #define TE_BASE "BASE"//total power usage normal tariff in base option
     #define TE_HCHC "HCHC"// total power usage low tariff in HC option
     #define TE_HCHP "HCHP"// total power usage normal tariff in HC option
    @@ -61,8 +61,9 @@
     #define TE_IINST "IINST"//instant current power usage
     #define TE_IMAX "IMAX"//maximal current power usage
     #define TE_PAPP "PAPP"//apparent power
    +#define TE_MOTDETAT "MOTDETAT"//mot d'etat
     
    -Teleinfo::Match Teleinfo::m_matchlist[18] = {
    +Teleinfo::Match Teleinfo::m_matchlist[19] = {
            { STD, TELEINFO_TYPE_ADCO, TE_ADCO, 12 },
            { STD, TELEINFO_TYPE_OPTARIF, TE_OPTARIF, 4 },
            { STD, TELEINFO_TYPE_ISOUSC, TE_ISOUSC, 2 },
    @@ -80,7 +81,8 @@
            { STD, TELEINFO_TYPE_PTEC, TE_PTEC, 4 },
            { STD, TELEINFO_TYPE_IINST, TE_IINST, 3 },
            { STD, TELEINFO_TYPE_IMAX, TE_IMAX, 3 },
    -       { STD, TELEINFO_TYPE_PAPP, TE_PAPP, 5 }
    +       { STD, TELEINFO_TYPE_PAPP, TE_PAPP, 5 },
    +       { STD, TELEINFO_TYPE_MOTDETAT, TE_MOTDETAT, 6 }
     };
     
     Teleinfo::Teleinfo(const int ID, const std::string& devname, unsigned int baud_rate)                                                                                                                                                                                         
    @@ -278,26 +280,42 @@                                                                                                                                                                                                                                                         
                            break;                                                                                                                                                                                                                                                 
                    case TELEINFO_TYPE_IINST:
                            //we convert A to W setting RFXMeter/Counter Dividers Energy to 1000 / voltage => 1000/230 = 4.35
    -                       //m_p1power.usagecurrent = ulValue;
    +                       m_p1power.usagecurrent = ulValue;
                            break;
                    case TELEINFO_TYPE_IMAX:
                            break;
                    case TELEINFO_TYPE_PAPP:
                            //we count to prevent add each block but only one every 10 seconds
                            m_p1power.usagecurrent += ulValue;
    +//                     m_counter++;
    +//                     if (m_counter >= NumberOfFrameToSendOne)
    +//                     {
    +//                             _log.Log(LOG_NORM,"Teleinfo frame complete");
    +//                             _log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
    +//                             _log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
    +//                             _log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
    +//                             m_p1power.usagecurrent /= m_counter;
    +//                             sDecodeRXMessage(this, (const unsigned char *)&m_p1power);
    +//                             m_counter = 0;
    +//                             m_p1power.usagecurrent = 0;
    +//                     }
    +                       break;
    +               case TELEINFO_TYPE_MOTDETAT:
                            m_counter++;
                            if (m_counter >= NumberOfFrameToSendOne)
                            {
    -                               //_log.Log(LOG_NORM,"Teleinfo frame complete");
    -                               //_log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
    -                               //_log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
    -                               //_log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
    +                               _log.Log(LOG_NORM,"Teleinfo frame complete");
    +                               _log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
    +                               _log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
    +                               _log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
                                    m_p1power.usagecurrent /= m_counter;
                                    sDecodeRXMessage(this, (const unsigned char *)&m_p1power);
                                    m_counter = 0;
                                    m_p1power.usagecurrent = 0;
                            }
                            break;
    +               default:
    +                       _log.Log(LOG_ERROR, "Teleinfo: label '%s' not handled!", t.key);
                    }
                    return;
            }
    @@ -310,7 +328,7 @@
            {
                    const unsigned char c = pData[ii];
     
    -               if ((c == 0x0d) || (c == 0x00))
    +               if ((c == 0x0d) || (c == 0x00) || (c == 0x02) || (c == 0x03))
                    {
                            ii++;
                            continue;
    Index: hardware/Teleinfo.h
    ===================================================================
    --- hardware/Teleinfo.h (révision 2383)
    +++ hardware/Teleinfo.h (copie de travail)
    @@ -73,6 +73,7 @@
                    TELEINFO_TYPE_IINST,
                    TELEINFO_TYPE_IMAX,
                    TELEINFO_TYPE_PAPP,
    +               TELEINFO_TYPE_MOTDETAT,
            } Type;
     
            typedef struct _tMatch {
    @@ -116,5 +117,5 @@
     
            unsigned char m_buffer[readBufferSize];
            int m_bufferpos;
    -       static Teleinfo::Match m_matchlist[18];
    +       static Teleinfo::Match m_matchlist[19];
     };
et en partant des fichiers d'origines dispo dans un fichier de création (compilation je croi) j'ai récupéré les deux fichiers téléinfo d'origine:
Le Teleinfo.cpp

Code : Tout sélectionner

/*
Domoticz Software : http://domoticz.com/
File : Teleinfo.cpp
Author : Nicolas HILAIRE
Version : 1.2
Description : This class manage the Teleinfo Signal


History :
- 2013-11-01 : Creation
- 2014-10-29 : Add 'EJP' contract (Laurent MEY)
- 2014-12-13 : Add 'Tempo' contract (Kevin NICOLAS)
*/

#include "stdafx.h"
#include "Teleinfo.h"
#include "hardwaretypes.h"
#include "../main/localtime_r.h"
#include "../main/Logger.h"

#include <string>
#include <algorithm>
#include <iostream>
#include <boost/bind.hpp>

#include <ctime>

//Teleinfo for EDF power meter. Only "Base" and "Heures creuses" are suported

//Teleinfo official specification :
//http://www.planete-domotique.com/notices/ERDF-NOI-CPT_O2E.pdf

//Example of data received by EDF power meter
//ADCO 271028237723 C
//OPTARIF HC.. <
//ISOUSC 45 ?
//HCHC 013149843 '
//HCHP 013016759 3
//PTEC HP..
//IINST 002 Y
//IMAX 049 L
//PAPP 00450 *
//HHPHC D /
//MOTDETAT 000000 B

#define TE_ADCO "ADCO" //meter id
#define TE_OPTARIF "OPTARIF"//pricing option
#define TE_ISOUSC "ISOUC"//current power subscribe   //A
#define TE_BASE "BASE"//total power usage normal tariff in base option
#define TE_HCHC "HCHC"// total power usage low tariff in HC option
#define TE_HCHP "HCHP"// total power usage normal tariff in HC option
#define TE_EJPHPM "EJPHPM"// total power usage normal tariff in PM option
#define TE_EJPHN "EJPHN"// total power usage low tariff in HN option
#define TE_BBRHCJB "BBRHCJB"// total power usage low tariff in HC option tempo blue
#define TE_BBRHPJB "BBRHPJB"// total power usage normal tariff in HC option tempo blue
#define TE_BBRHCJW "BBRHCJW"// total power usage low tariff in HC option tempo white
#define TE_BBRHPJW "BBRHPJW"// total power usage normal tariff in HC option tempo white
#define TE_BBRHCJR "BBRHCJR"// total power usage low tariff in HC option tempo red
#define TE_BBRHPJR "BBRHPJR"// total power usage normal tariff in HC option tempo red
#define TE_PTEC   "PTEC"//current tariff period
#define TE_IINST "IINST"//instant current power usage
#define TE_IMAX "IMAX"//maximal current power usage
#define TE_PAPP "PAPP"//apparent power

Teleinfo::Match Teleinfo::m_matchlist[18] = {
	{ STD, TELEINFO_TYPE_ADCO, TE_ADCO, 12 },
	{ STD, TELEINFO_TYPE_OPTARIF, TE_OPTARIF, 4 },
	{ STD, TELEINFO_TYPE_ISOUSC, TE_ISOUSC, 2 },
	{ STD, TELEINFO_TYPE_BASE, TE_BASE, 9 },
	{ STD, TELEINFO_TYPE_HCHC, TE_HCHC, 9 },
	{ STD, TELEINFO_TYPE_HCHP, TE_HCHP, 9 },
	{ STD, TELEINFO_TYPE_EJPHPM, TE_EJPHPM, 9 },
	{ STD, TELEINFO_TYPE_EJPHN, TE_EJPHN, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJB, TE_BBRHCJB, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJB, TE_BBRHPJB, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJW, TE_BBRHCJW, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJW, TE_BBRHPJW, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJR, TE_BBRHCJR, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJR, TE_BBRHPJR, 9 },
	{ STD, TELEINFO_TYPE_PTEC, TE_PTEC, 4 },
	{ STD, TELEINFO_TYPE_IINST, TE_IINST, 3 },
	{ STD, TELEINFO_TYPE_IMAX, TE_IMAX, 3 },
	{ STD, TELEINFO_TYPE_PAPP, TE_PAPP, 5 }
};

Teleinfo::Teleinfo(const std::string& devname,
	unsigned int baud_rate,
	boost::asio::serial_port_base::parity opt_parity,
	boost::asio::serial_port_base::character_size opt_csize,
	boost::asio::serial_port_base::flow_control opt_flow,
	boost::asio::serial_port_base::stop_bits opt_stop)
	:AsyncSerial(devname, baud_rate, opt_parity, opt_csize, opt_flow, opt_stop)
{
	m_szSerialPort = devname;
	m_iBaudRate = baud_rate;
	m_iOptParity = opt_parity;
	m_iOptCsize = opt_csize;
	m_iOptFlow = opt_flow;
	m_iOptStop = opt_stop;

	Init();
}

Teleinfo::Teleinfo(const int ID, const std::string& devname, unsigned int baud_rate)
{
	m_szSerialPort = devname;
	m_iBaudRate = baud_rate;
	m_iOptParity = boost::asio::serial_port_base::parity(TELEINFO_PARITY);
	m_iOptCsize = boost::asio::serial_port_base::character_size(TELEINFO_CARACTER_SIZE);
	m_iOptFlow = boost::asio::serial_port_base::flow_control(TELEINFO_FLOW_CONTROL);
	m_iOptStop = boost::asio::serial_port_base::stop_bits(TELEINFO_STOP_BITS);

	Init();
}

Teleinfo::~Teleinfo(void)
{
	StopHardware();
}

void Teleinfo::Init()
{
	m_bufferpos = 0;

	memset(&m_buffer, 0, sizeof(m_buffer));
	memset(&m_p1power, 0, sizeof(m_p1power));

	m_p1power.len = sizeof(P1Power) - 1;
	m_p1power.type = pTypeP1Power;
	m_p1power.subtype = sTypeP1Power;

	m_counter = 0;
}

bool Teleinfo::StartHardware()
{
	StartHeartbeatThread();
	//Try to open the Serial Port
	try
	{
		_log.Log(LOG_STATUS, "Teleinfo: Using serial port: %s", m_szSerialPort.c_str());
		open(
			m_szSerialPort,
			m_iBaudRate,
			m_iOptParity,
			m_iOptCsize
			);
	}
	catch (boost::exception & e)
	{
		_log.Log(LOG_ERROR, "Teleinfo: Error opening serial port!");
#ifdef _DEBUG
		_log.Log(LOG_ERROR, "-----------------\n%s\n-----------------", boost::diagnostic_information(e).c_str());
#endif
		return false;
	}
	catch (...)
	{
		_log.Log(LOG_ERROR, "Teleinfo: Error opening serial port!!!");
		return false;
	}
	setReadCallback(boost::bind(&Teleinfo::readCallback, this, _1, _2));
	m_bIsStarted = true;
	sOnConnected(this);

	return true;
}

bool Teleinfo::StopHardware()
{
	if (isOpen())
	{
		try {
			clearReadCallback();
			close();
		}
		catch (...)
		{
			//Don't throw from a Stop command
		}
	}
	StopHeartbeatThread();
	m_bIsStarted = false;
	return true;
}


void Teleinfo::readCallback(const char *data, size_t len)
{
	boost::lock_guard<boost::mutex> l(readQueueMutex);
	if (!m_bEnableReceive)
		return; //receiving not enabled

	ParseData((const unsigned char*)data, static_cast<int>(len));
}

void Teleinfo::MatchLine()
{
	if ((strlen((const char*)&m_buffer)<1) || (m_buffer[0] == 0x0a))
		return;

	uint8_t i;
	uint8_t found = 0;
	Teleinfo::Match t;
	char value[20] = "";
	std::string vString;
	//_log.Log(LOG_NORM,"Frame : #%s#", m_buffer);
	for (i = 0; (i<sizeof(m_matchlist) / sizeof(Teleinfo::Match))&(!found); i++)
	{
		t = m_matchlist[i];
		switch (t.matchtype)
		{
		case STD:
			if (strncmp(t.key, (const char*)&m_buffer, strlen(t.key)) == 0) {
				found = 1;
			}
			break;
		} //switch

		if (!found)
			continue;

		if (t.matchtype == STD)
		{
			//We get the width car after the space
			unsigned char * pos = (unsigned char *)strchr((char*)m_buffer, ' ');
			if (pos == NULL)
				continue;
			int position = int(pos - (unsigned char*)&m_buffer);
			strncpy(value, (char*)&(m_buffer[position + 1]), t.width);
			value[t.width] = 0;
		}
		unsigned long ulValue = (unsigned long)atoi(value);
		switch (t.type)
		{
		case TELEINFO_TYPE_ADCO:
			/*
			//structure initialization
			memset(&m_p1power,0,sizeof(m_p1power));
			m_p1power.len=sizeof(P1Power)-1;
			m_p1power.type=pTypeP1Power;
			m_p1power.subtype=sTypeP1Power;
			*/
			break;
		case TELEINFO_TYPE_OPTARIF:
			break;
		case TELEINFO_TYPE_ISOUSC:
			break;
		case TELEINFO_TYPE_BASE:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_HCHC:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_HCHP:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_EJPHPM:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_EJPHN:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJB:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJB:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJW:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJW:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJR:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJR:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_PTEC:
			break;
		case TELEINFO_TYPE_IINST:
			//we convert A to W setting RFXMeter/Counter Dividers Energy to 1000 / voltage => 1000/230 = 4.35
			//m_p1power.usagecurrent = ulValue;
			break;
		case TELEINFO_TYPE_IMAX:
			break;
		case TELEINFO_TYPE_PAPP:
			//we count to prevent add each block but only one every 10 seconds
			m_p1power.usagecurrent += ulValue;
			m_counter++;
			if (m_counter >= NumberOfFrameToSendOne)
			{
				//_log.Log(LOG_NORM,"Teleinfo frame complete");
				//_log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
				//_log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
				//_log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
				m_p1power.usagecurrent /= m_counter;
				sDecodeRXMessage(this, (const unsigned char *)&m_p1power);
				m_counter = 0;
				m_p1power.usagecurrent = 0;
			}
			break;
		}
		return;
	}
}

void Teleinfo::ParseData(const unsigned char *pData, int Len)
{
	int ii = 0;
	while (ii<Len)
	{
		const unsigned char c = pData[ii];

		if ((c == 0x0d) || (c == 0x00))
		{
			ii++;
			continue;
		}

		m_buffer[m_bufferpos] = c;
		if (c == 0x0a || m_bufferpos == sizeof(m_buffer) - 1)
		{
			// discard newline, close string, parse line and clear it.
			if (m_bufferpos > 0)
				m_buffer[m_bufferpos] = 0;

			//We check the line only if the checksum is ok
			if (isCheckSumOk())
				MatchLine();

			m_bufferpos = 0;
		}
		else
		{
			m_bufferpos++;
		}
		ii++;
	}
}


/* Explanation of the checksum computation issued from the official EDF specification

a "checksum" is calculated on the set of characters from the beginning of the label field to the end of the field given character SP included.
We first make ??the sum of all ASCII codes of all characters.
to avoid introduce ASCII (00 to 1F hex) functions, it retains only the six least significant bits of
result (this translates into a logical AND between the amount previously calculated and 03Fh).
Finally, we added 20 hexadecimal. The result will always be a printable ASCII character (sign, digit,
capital letter) of from 0x20 to hexadecimal 0x5F

La "checksum" est calculÈe sur l'ensemble des caractËres allant du dÈbut du champ Ètiquette ‡ la fin du champ
donnÈe, caractËre SP inclus. On fait tout d'abord la somme des codes ASCII de tous ces caractËres. Pour Èviter
d'introduire des fonctions ASCII (00 ‡ 1F en hexadÈcimal), on ne conserve que les six bits de poids faible du
rÈsultat obtenu (cette opÈration se traduit par un ET logique entre la somme prÈcÈdemment calculÈe et 03Fh).
Enfin, on ajoute 20 en hexadÈcimal. Le rÈsultat sera donc toujours un caractËre ASCII imprimable (signe, chiffre,
lettre majuscule) allant de 20 ‡ 5F en hexadÈcimal.
*/

bool Teleinfo::isCheckSumOk()
{
	unsigned int checksum = 0x00;
	int i;

	for (i = 0; i < int(strlen((char*)m_buffer)) - 2; i++)
	{
		checksum += m_buffer[i];
	}
	checksum = (checksum & 0x3F) + 0x20;
	return (checksum == m_buffer[strlen((char*)m_buffer) - 1]);
}

void Teleinfo::WriteToHardware(const char *pdata, const unsigned char length)
{
}
et le Teleinfo.h

Code : Tout sélectionner

/*
Domoticz Software : http://domoticz.com/
File : Teleinfo.h
Author : Nicolas HILAIRE
Version : 1.2
Description : This class manage the Teleinfo Signal


History :
- 2013-11-01 : Creation
- 2014-10-29 : Add 'EJP' contract (Laurent MEY)
- 2014-12-13 : Add 'Tempo' contract (Kevin NICOLAS)
*/

#pragma once

#include "DomoticzHardware.h"
#include "P1MeterBase.h"
#include "ASyncSerial.h"

/*
typedef struct _teleinfoData {
unsigned char len;
unsigned char type;
unsigned char subtype;
char optTariff[4];
unsigned long powerusage1;   // normal tariff at power Usage in Wh
unsigned long powerusage2;   // low tariff at power Usage in Wh
unsigned long currentPowerSubscribe; //in A
char currentTariffPeriod[4];
unsigned long instantCurrentPowerUsage; //in A
unsigned long maximalCurrentPowerUsage; //in A
unsigned long apparentPower;   //in VA
} TeleinfoData;
*/

#define TELEINFO_BAUD_RATE         1200
#define TELEINFO_PARITY            boost::asio::serial_port_base::parity::even
#define TELEINFO_CARACTER_SIZE      7
#define TELEINFO_FLOW_CONTROL      boost::asio::serial_port_base::flow_control::none
#define TELEINFO_STOP_BITS         boost::asio::serial_port_base::stop_bits::one

class Teleinfo : public CDomoticzHardwareBase, AsyncSerial
{
	typedef enum {
		ID = 0,
		STD,
	} MatchType;

	//typedef enum {
	//   TELEINFO_OPTION_BASE,   //single tariff
	//   TELEINFO_OPTION_HC,      //double tariff (low and normal)
	//   TELEINFO_OPTION_EJP,      //EJP Option,  (test)
	//   TELEINFO_OPTION_TEMPO,   //Tempo option,  (test)
	//} Option;

	typedef enum {
		TELEINFO_TYPE_ADCO,
		TELEINFO_TYPE_OPTARIF,
		TELEINFO_TYPE_ISOUSC,
		TELEINFO_TYPE_BASE,
		TELEINFO_TYPE_HCHC,
		TELEINFO_TYPE_HCHP,
		TELEINFO_TYPE_EJPHN,
		TELEINFO_TYPE_EJPHPM,
		TELEINFO_TYPE_BBRHCJB,
		TELEINFO_TYPE_BBRHPJB,
		TELEINFO_TYPE_BBRHCJW,
		TELEINFO_TYPE_BBRHPJW,
		TELEINFO_TYPE_BBRHCJR,
		TELEINFO_TYPE_BBRHPJR,
		TELEINFO_TYPE_PTEC,
		TELEINFO_TYPE_IINST,
		TELEINFO_TYPE_IMAX,
		TELEINFO_TYPE_PAPP,
	} Type;

	typedef struct _tMatch {
		MatchType matchtype;
		Type type;
		const char* key;
		int width;
	} Match;

public:

	Teleinfo(const int ID, const std::string& devname, unsigned int baud_rate = TELEINFO_BAUD_RATE);

	/**
	* Opens a serial device.
	* \param devname serial device name, example "/dev/ttyAMA0" or "COM1"
	* \param baud_rate serial baud rate, default 1200
	* \param opt_parity serial parity, default even
	* \param opt_csize serial character size, default 7bit
	* \param opt_flow serial flow control, default none
	* \param opt_stop serial stop bits, default 1
	* \throws boost::system::system_error if cannot open the
	* serial device
	*/
	Teleinfo(const std::string& devname, unsigned int baud_rate = TELEINFO_BAUD_RATE,
		boost::asio::serial_port_base::parity opt_parity = boost::asio::serial_port_base::parity(TELEINFO_PARITY),
		boost::asio::serial_port_base::character_size opt_csize = boost::asio::serial_port_base::character_size(TELEINFO_CARACTER_SIZE),
		boost::asio::serial_port_base::flow_control opt_flow = boost::asio::serial_port_base::flow_control(TELEINFO_FLOW_CONTROL),
		boost::asio::serial_port_base::stop_bits opt_stop = boost::asio::serial_port_base::stop_bits(TELEINFO_STOP_BITS));

	~Teleinfo();
	std::string m_szSerialPort;

	P1Power   m_p1power;
	void WriteToHardware(const char *pdata, const unsigned char length);
private:
	bool StartHardware();
	bool StopHardware();
	/**
	* Read callback, stores data in the buffer
	*/

	void readCallback(const char *data, size_t len);

	unsigned int m_iBaudRate;
	boost::asio::serial_port_base::parity m_iOptParity;
	boost::asio::serial_port_base::character_size m_iOptCsize;
	boost::asio::serial_port_base::flow_control m_iOptFlow;
	boost::asio::serial_port_base::stop_bits m_iOptStop;

	int m_counter;
	static const int readBufferSize = 1028;
	static const int NumberOfFrameToSendOne = 8;

	void Init();
	void MatchLine();
	void ParseData(const unsigned char *pData, int Len);
	bool isCheckSumOk();

	unsigned char m_buffer[readBufferSize];
	int m_bufferpos;
	static Teleinfo::Match m_matchlist[18];
};
j'ai modifié selon ce que je comprennai des ecris du gars soit:
Pour le Teleinfo.cpp

Code : Tout sélectionner

/*
Domoticz Software : http://domoticz.com/
File : Teleinfo.cpp
Author : Nicolas HILAIRE
Version : 1.2
Description : This class manage the Teleinfo Signal


History :
- 2013-11-01 : Creation
- 2014-10-29 : Add 'EJP' contract (Laurent MEY)
- 2014-12-13 : Add 'Tempo' contract (Kevin NICOLAS)
*/

#include "stdafx.h"
#include "Teleinfo.h"
#include "hardwaretypes.h"
#include "../main/localtime_r.h"
#include "../main/Logger.h"

#include <string>
#include <algorithm>
#include <iostream>
#include <boost/bind.hpp>

#include <ctime>

//Teleinfo for EDF power meter. Only "Base" and "Heures creuses" are suported

//Teleinfo official specification :
//http://www.planete-domotique.com/notices/ERDF-NOI-CPT_O2E.pdf

//Example of data received by EDF power meter
//ADCO 271028237723 C
//OPTARIF HC.. <
//ISOUSC 45 ?
//HCHC 013149843 '
//HCHP 013016759 3
//PTEC HP..
//IINST 002 Y
//IMAX 049 L
//PAPP 00450 *
//HHPHC D /
//MOTDETAT 000000 B

#define TE_ADCO "ADCO" //meter id
#define TE_OPTARIF "OPTARIF"//pricing option
#define TE_ISOUSC "ISOUSC"//current power subscribe   //A
#define TE_BASE "BASE"//total power usage normal tariff in base option
#define TE_HCHC "HCHC"// total power usage low tariff in HC option
#define TE_HCHP "HCHP"// total power usage normal tariff in HC option
#define TE_EJPHPM "EJPHPM"// total power usage normal tariff in PM option
#define TE_EJPHN "EJPHN"// total power usage low tariff in HN option
#define TE_BBRHCJB "BBRHCJB"// total power usage low tariff in HC option tempo blue
#define TE_BBRHPJB "BBRHPJB"// total power usage normal tariff in HC option tempo blue
#define TE_BBRHCJW "BBRHCJW"// total power usage low tariff in HC option tempo white
#define TE_BBRHPJW "BBRHPJW"// total power usage normal tariff in HC option tempo white
#define TE_BBRHCJR "BBRHCJR"// total power usage low tariff in HC option tempo red
#define TE_BBRHPJR "BBRHPJR"// total power usage normal tariff in HC option tempo red
#define TE_PTEC   "PTEC"//current tariff period
#define TE_IINST "IINST"//instant current power usage
#define TE_IMAX "IMAX"//maximal current power usage
#define TE_PAPP "PAPP"//apparent power
#define TE_MOTDETAT "MOTDETAT"//mot d'etat

Teleinfo::Match Teleinfo::m_matchlist[19] = {
	{ STD, TELEINFO_TYPE_ADCO, TE_ADCO, 12 },
	{ STD, TELEINFO_TYPE_OPTARIF, TE_OPTARIF, 4 },
	{ STD, TELEINFO_TYPE_ISOUSC, TE_ISOUSC, 2 },
	{ STD, TELEINFO_TYPE_BASE, TE_BASE, 9 },
	{ STD, TELEINFO_TYPE_HCHC, TE_HCHC, 9 },
	{ STD, TELEINFO_TYPE_HCHP, TE_HCHP, 9 },
	{ STD, TELEINFO_TYPE_EJPHPM, TE_EJPHPM, 9 },
	{ STD, TELEINFO_TYPE_EJPHN, TE_EJPHN, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJB, TE_BBRHCJB, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJB, TE_BBRHPJB, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJW, TE_BBRHCJW, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJW, TE_BBRHPJW, 9 },
	{ STD, TELEINFO_TYPE_BBRHCJR, TE_BBRHCJR, 9 },
	{ STD, TELEINFO_TYPE_BBRHPJR, TE_BBRHPJR, 9 },
	{ STD, TELEINFO_TYPE_PTEC, TE_PTEC, 4 },
	{ STD, TELEINFO_TYPE_IINST, TE_IINST, 3 },
	{ STD, TELEINFO_TYPE_IMAX, TE_IMAX, 3 },
	{ STD, TELEINFO_TYPE_PAPP, TE_PAPP, 5 },
        { STD, TELEINFO_TYPE_MOTDETAT, TE_MOTDETAT, 6 }
};

Teleinfo::Teleinfo(const std::string& devname,
	unsigned int baud_rate,
	boost::asio::serial_port_base::parity opt_parity,
	boost::asio::serial_port_base::character_size opt_csize,
	boost::asio::serial_port_base::flow_control opt_flow,
	boost::asio::serial_port_base::stop_bits opt_stop)
	:AsyncSerial(devname, baud_rate, opt_parity, opt_csize, opt_flow, opt_stop)
{
	m_szSerialPort = devname;
	m_iBaudRate = baud_rate;
	m_iOptParity = opt_parity;
	m_iOptCsize = opt_csize;
	m_iOptFlow = opt_flow;
	m_iOptStop = opt_stop;

	Init();
}

Teleinfo::Teleinfo(const int ID, const std::string& devname, unsigned int baud_rate)
{
	m_szSerialPort = devname;
	m_iBaudRate = baud_rate;
	m_iOptParity = boost::asio::serial_port_base::parity(TELEINFO_PARITY);
	m_iOptCsize = boost::asio::serial_port_base::character_size(TELEINFO_CARACTER_SIZE);
	m_iOptFlow = boost::asio::serial_port_base::flow_control(TELEINFO_FLOW_CONTROL);
	m_iOptStop = boost::asio::serial_port_base::stop_bits(TELEINFO_STOP_BITS);

	Init();
}

Teleinfo::~Teleinfo(void)
{
	StopHardware();
}

void Teleinfo::Init()
{
	m_bufferpos = 0;

	memset(&m_buffer, 0, sizeof(m_buffer));
	memset(&m_p1power, 0, sizeof(m_p1power));

	m_p1power.len = sizeof(P1Power) - 1;
	m_p1power.type = pTypeP1Power;
	m_p1power.subtype = sTypeP1Power;

	m_counter = 0;
}

bool Teleinfo::StartHardware()
{
	StartHeartbeatThread();
	//Try to open the Serial Port
	try
	{
		_log.Log(LOG_STATUS, "Teleinfo: Using serial port: %s", m_szSerialPort.c_str());
		open(
			m_szSerialPort,
			m_iBaudRate,
			m_iOptParity,
			m_iOptCsize
			);
	}
	catch (boost::exception & e)
	{
		_log.Log(LOG_ERROR, "Teleinfo: Error opening serial port!");
#ifdef _DEBUG
		_log.Log(LOG_ERROR, "-----------------\n%s\n-----------------", boost::diagnostic_information(e).c_str());
#endif
		return false;
	}
	catch (...)
	{
		_log.Log(LOG_ERROR, "Teleinfo: Error opening serial port!!!");
		return false;
	}
	setReadCallback(boost::bind(&Teleinfo::readCallback, this, _1, _2));
	m_bIsStarted = true;
	sOnConnected(this);

	return true;
}

bool Teleinfo::StopHardware()
{
	if (isOpen())
	{
		try {
			clearReadCallback();
			close();
		}
		catch (...)
		{
			//Don't throw from a Stop command
		}
	}
	StopHeartbeatThread();
	m_bIsStarted = false;
	return true;
}


void Teleinfo::readCallback(const char *data, size_t len)
{
	boost::lock_guard<boost::mutex> l(readQueueMutex);
	if (!m_bEnableReceive)
		return; //receiving not enabled

	ParseData((const unsigned char*)data, static_cast<int>(len));
}

void Teleinfo::MatchLine()
{
	if ((strlen((const char*)&m_buffer)<1) || (m_buffer[0] == 0x0a))
		return;

	uint8_t i;
	uint8_t found = 0;
	Teleinfo::Match t;
	char value[20] = "";
	std::string vString;
	//_log.Log(LOG_NORM,"Frame : #%s#", m_buffer);
	for (i = 0; (i<sizeof(m_matchlist) / sizeof(Teleinfo::Match))&(!found); i++)
	{
		t = m_matchlist[i];
		switch (t.matchtype)
		{
		case STD:
			if (strncmp(t.key, (const char*)&m_buffer, strlen(t.key)) == 0) {
				found = 1;
			}
			break;
		} //switch

		if (!found)
			continue;

		if (t.matchtype == STD)
		{
			//We get the width car after the space
			unsigned char * pos = (unsigned char *)strchr((char*)m_buffer, ' ');
			if (pos == NULL)
				continue;
			int position = int(pos - (unsigned char*)&m_buffer);
			strncpy(value, (char*)&(m_buffer[position + 1]), t.width);
			value[t.width] = 0;
		}
		unsigned long ulValue = (unsigned long)atoi(value);
		switch (t.type)
		{
		case TELEINFO_TYPE_ADCO:
			/*
			//structure initialization
			memset(&m_p1power,0,sizeof(m_p1power));
			m_p1power.len=sizeof(P1Power)-1;
			m_p1power.type=pTypeP1Power;
			m_p1power.subtype=sTypeP1Power;
			*/
			break;
		case TELEINFO_TYPE_OPTARIF:
			break;
		case TELEINFO_TYPE_ISOUSC:
			break;
		case TELEINFO_TYPE_BASE:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_HCHC:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_HCHP:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_EJPHPM:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_EJPHN:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJB:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJB:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJW:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJW:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHCJR:
			if (ulValue != 0)
				m_p1power.powerusage2 = ulValue;
			break;
		case TELEINFO_TYPE_BBRHPJR:
			if (ulValue != 0)
				m_p1power.powerusage1 = ulValue;
			break;
		case TELEINFO_TYPE_PTEC:
			break;
		case TELEINFO_TYPE_IINST:
			//we convert A to W setting RFXMeter/Counter Dividers Energy to 1000 / voltage => 1000/230 = 4.35
			m_p1power.usagecurrent = ulValue;
			break;
		case TELEINFO_TYPE_IMAX:
			break;
		case TELEINFO_TYPE_PAPP:
			//we count to prevent add each block but only one every 10 seconds
			m_p1power.usagecurrent += ulValue;
			//m_counter++;
			//if (m_counter >= NumberOfFrameToSendOne)
			//{
				//_log.Log(LOG_NORM,"Teleinfo frame complete");
				//_log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
				//_log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
				//_log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
				//m_p1power.usagecurrent /= m_counter;
				//sDecodeRXMessage(this, (const unsigned char *)&m_p1power);
				//m_counter = 0;
				//m_p1power.usagecurrent = 0;
			//}
                        break;
                case TELEINFO_TYPE_MOTDETAT:
                        m_counter++;
                        if (m_counter >= NumberOfFrameToSendOne)
                        {
+                               _log.Log(LOG_NORM,"Teleinfo frame complete");
+                               _log.Log(LOG_NORM,"powerusage1 = %lu", m_p1power.powerusage1);
+                               _log.Log(LOG_NORM,"powerusage2 = %lu", m_p1power.powerusage2);
+                               _log.Log(LOG_NORM,"usagecurrent = %lu", m_p1power.usagecurrent);
                                m_p1power.usagecurrent /= m_counter;
                                sDecodeRXMessage(this, (const unsigned char *)&m_p1power);
                                m_counter = 0;
                                m_p1power.usagecurrent = 0;
                        }
                        break;
+               default:
+                       _log.Log(LOG_ERROR, "Teleinfo: label '%s' not handled!", t.key);
                }
                return;
        }
			break;
		}
		return;
	}
}

void Teleinfo::ParseData(const unsigned char *pData, int Len)
{
	int ii = 0;
	while (ii<Len)
	{
		const unsigned char c = pData[ii];

		if ((c == 0x0d) || (c == 0x00) || (c == 0x02) || (c == 0x03))
		{
			ii++;
			continue;
		}

		m_buffer[m_bufferpos] = c;
		if (c == 0x0a || m_bufferpos == sizeof(m_buffer) - 1)
		{
			// discard newline, close string, parse line and clear it.
			if (m_bufferpos > 0)
				m_buffer[m_bufferpos] = 0;

			//We check the line only if the checksum is ok
			if (isCheckSumOk())
				MatchLine();

			m_bufferpos = 0;
		}
		else
		{
			m_bufferpos++;
		}
		ii++;
	}
}


/* Explanation of the checksum computation issued from the official EDF specification

a "checksum" is calculated on the set of characters from the beginning of the label field to the end of the field given character SP included.
We first make ??the sum of all ASCII codes of all characters.
to avoid introduce ASCII (00 to 1F hex) functions, it retains only the six least significant bits of
result (this translates into a logical AND between the amount previously calculated and 03Fh).
Finally, we added 20 hexadecimal. The result will always be a printable ASCII character (sign, digit,
capital letter) of from 0x20 to hexadecimal 0x5F

La "checksum" est calculÈe sur l'ensemble des caractËres allant du dÈbut du champ Ètiquette ‡ la fin du champ
donnÈe, caractËre SP inclus. On fait tout d'abord la somme des codes ASCII de tous ces caractËres. Pour Èviter
d'introduire des fonctions ASCII (00 ‡ 1F en hexadÈcimal), on ne conserve que les six bits de poids faible du
rÈsultat obtenu (cette opÈration se traduit par un ET logique entre la somme prÈcÈdemment calculÈe et 03Fh).
Enfin, on ajoute 20 en hexadÈcimal. Le rÈsultat sera donc toujours un caractËre ASCII imprimable (signe, chiffre,
lettre majuscule) allant de 20 ‡ 5F en hexadÈcimal.
*/

bool Teleinfo::isCheckSumOk()
{
	unsigned int checksum = 0x00;
	int i;

	for (i = 0; i < int(strlen((char*)m_buffer)) - 2; i++)
	{
		checksum += m_buffer[i];
	}
	checksum = (checksum & 0x3F) + 0x20;
	return (checksum == m_buffer[strlen((char*)m_buffer) - 1]);
}

void Teleinfo::WriteToHardware(const char *pdata, const unsigned char length)
{
}
et pour le Teleinfo.h

Code : Tout sélectionner

/*
Domoticz Software : http://domoticz.com/
File : Teleinfo.h
Author : Nicolas HILAIRE
Version : 1.2
Description : This class manage the Teleinfo Signal


History :
- 2013-11-01 : Creation
- 2014-10-29 : Add 'EJP' contract (Laurent MEY)
- 2014-12-13 : Add 'Tempo' contract (Kevin NICOLAS)
*/

#pragma once

#include "DomoticzHardware.h"
#include "P1MeterBase.h"
#include "ASyncSerial.h"

/*
typedef struct _teleinfoData {
unsigned char len;
unsigned char type;
unsigned char subtype;
char optTariff[4];
unsigned long powerusage1;   // normal tariff at power Usage in Wh
unsigned long powerusage2;   // low tariff at power Usage in Wh
unsigned long currentPowerSubscribe; //in A
char currentTariffPeriod[4];
unsigned long instantCurrentPowerUsage; //in A
unsigned long maximalCurrentPowerUsage; //in A
unsigned long apparentPower;   //in VA
} TeleinfoData;
*/

#define TELEINFO_BAUD_RATE         1200
#define TELEINFO_PARITY            boost::asio::serial_port_base::parity::even
#define TELEINFO_CARACTER_SIZE      7
#define TELEINFO_FLOW_CONTROL      boost::asio::serial_port_base::flow_control::none
#define TELEINFO_STOP_BITS         boost::asio::serial_port_base::stop_bits::one

class Teleinfo : public CDomoticzHardwareBase, AsyncSerial
{
	typedef enum {
		ID = 0,
		STD,
	} MatchType;

	//typedef enum {
	//   TELEINFO_OPTION_BASE,   //single tariff
	//   TELEINFO_OPTION_HC,      //double tariff (low and normal)
	//   TELEINFO_OPTION_EJP,      //EJP Option,  (test)
	//   TELEINFO_OPTION_TEMPO,   //Tempo option,  (test)
	//} Option;

	typedef enum {
		TELEINFO_TYPE_ADCO,
		TELEINFO_TYPE_OPTARIF,
		TELEINFO_TYPE_ISOUSC,
		TELEINFO_TYPE_BASE,
		TELEINFO_TYPE_HCHC,
		TELEINFO_TYPE_HCHP,
		TELEINFO_TYPE_EJPHN,
		TELEINFO_TYPE_EJPHPM,
		TELEINFO_TYPE_BBRHCJB,
		TELEINFO_TYPE_BBRHPJB,
		TELEINFO_TYPE_BBRHCJW,
		TELEINFO_TYPE_BBRHPJW,
		TELEINFO_TYPE_BBRHCJR,
		TELEINFO_TYPE_BBRHPJR,
		TELEINFO_TYPE_PTEC,
		TELEINFO_TYPE_IINST,
		TELEINFO_TYPE_IMAX,
		TELEINFO_TYPE_PAPP,
                TELEINFO_TYPE_MOTDETAT,
	} Type;

	typedef struct _tMatch {
		MatchType matchtype;
		Type type;
		const char* key;
		int width;
	} Match;

public:

	Teleinfo(const int ID, const std::string& devname, unsigned int baud_rate = TELEINFO_BAUD_RATE);

	/**
	* Opens a serial device.
	* \param devname serial device name, example "/dev/ttyAMA0" or "COM1"
	* \param baud_rate serial baud rate, default 1200
	* \param opt_parity serial parity, default even
	* \param opt_csize serial character size, default 7bit
	* \param opt_flow serial flow control, default none
	* \param opt_stop serial stop bits, default 1
	* \throws boost::system::system_error if cannot open the
	* serial device
	*/
	Teleinfo(const std::string& devname, unsigned int baud_rate = TELEINFO_BAUD_RATE,
		boost::asio::serial_port_base::parity opt_parity = boost::asio::serial_port_base::parity(TELEINFO_PARITY),
		boost::asio::serial_port_base::character_size opt_csize = boost::asio::serial_port_base::character_size(TELEINFO_CARACTER_SIZE),
		boost::asio::serial_port_base::flow_control opt_flow = boost::asio::serial_port_base::flow_control(TELEINFO_FLOW_CONTROL),
		boost::asio::serial_port_base::stop_bits opt_stop = boost::asio::serial_port_base::stop_bits(TELEINFO_STOP_BITS));

	~Teleinfo();
	std::string m_szSerialPort;

	P1Power   m_p1power;
	void WriteToHardware(const char *pdata, const unsigned char length);
private:
	bool StartHardware();
	bool StopHardware();
	/**
	* Read callback, stores data in the buffer
	*/

	void readCallback(const char *data, size_t len);

	unsigned int m_iBaudRate;
	boost::asio::serial_port_base::parity m_iOptParity;
	boost::asio::serial_port_base::character_size m_iOptCsize;
	boost::asio::serial_port_base::flow_control m_iOptFlow;
	boost::asio::serial_port_base::stop_bits m_iOptStop;

	int m_counter;
	static const int readBufferSize = 1028;
	static const int NumberOfFrameToSendOne = 8;

	void Init();
	void MatchLine();
	void ParseData(const unsigned char *pData, int Len);
	bool isCheckSumOk();

	unsigned char m_buffer[readBufferSize];
	int m_bufferpos;
	static Teleinfo::Match m_matchlist[19];
};
Voila mais du coup que ce soit sur le pi ou sur la version windob je ne sais pas quoi en faire...
Je peut pour ma part pas trop bidouillé il y a les panneaux solaire qui tourne sur le teleinfo mais le compteur edf ne teleinfo pas le meust serai de passer par un script mais bon.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

dbocart
Messages : 39
Enregistré le : 06 déc. 2014, 14:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par dbocart »

Domoticz doit en effet ce baser sur la présence de la valeur PAPP, plus précise que le IINST mais faute de mieux sur nos compteurs (pour ma part ma maison date de 1999 et c'est un shlumberger qui est installé)

La modif de que as faites ne fonctionnera pas hélas : Domotizc attend la valeur PAPP, en lui renvoyant la même valeur que IINST cela ne changera rien :( et si cela marchait on aurais pour valeur non pas des Watt mais des Amperes (avec ~p=UI et u=220 ca fait une grosse différence et la formule est faussé histoire de cosphi parait il, mais on pourrais d'ailleurs renvoyer cela qd meme)

il doit y avoir un test quelques part dans le code qui attend les valeurs codés dans les class teleinfo :(

Pour tester si cela fonctionne il faut télécharger toutes les sources de domotizc et les compiler, perso je saurais pas faire :roll:

les sources sont ici : http://sourceforge.net/p/domoticz/code/HEAD/tree/trunk/
RPI B, RFXtrx433e, 2 x Chacon fils pilote (4 radiateurs RDC, 2 ETG) , 3x T° THN132N , 2x T° 1-Wire, téléinfo EDF filaire (via opto), clé Zigbee ConBee II -> 2 Sonoff, 8 ampoules

dbocart
Messages : 39
Enregistré le : 06 déc. 2014, 14:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par dbocart »

j'ai parlé un peu trop vite sans doute, j'ai parcourus le code en cherchant la variable PAPP, elle n'est présente que dans 3 fichiers (EcoDevices.cpp, Teleinfo.h et Telinfo.cpp), notament dans la définition de la structure.(teleinfo.h)

après cela, il y a un appel à init() et MatchLine() qui ne devrait pas empêcher quoi que ce soit :(

Comme la valeur de IINST n'est actuellement pas prise en compte, et comme nous n'avons pas PAPP, domoticz ne 'verrait' pas la teleinfo ? étrange car les autre valeurs sont bien présentes :(

L'ajout de ta modif est peu etre une bonne idée pour tester, reste la compilation a effectuer :roll:
RPI B, RFXtrx433e, 2 x Chacon fils pilote (4 radiateurs RDC, 2 ETG) , 3x T° THN132N , 2x T° 1-Wire, téléinfo EDF filaire (via opto), clé Zigbee ConBee II -> 2 Sonoff, 8 ampoules

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par mulot35 »

-Du coup c'est bien dans le fichier trunk que j'avais récupérer le .cpp et .h comme dit dans le poste du dessus apparament ca marche pour le mec qui a pondu la modif :http://www.domoticz.com/forum/viewtopic.php?f=6&t=6389

-Autre possibilité les gars du poste téléinfo radio viewtopic.php?f=7&t=158&start=30 passe par le codage Lua pour alimenter des "Virtual Sensors" pour le teleinfo radio (toujours avec le PAPP) Je pense que "ca sera plus simple" de codée en lua avec eventuellement un arduino entre deux (je dit ca je suis une brelle en codage et en arduino) mais il faut peut etre chercher de ce coté la...
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

dbocart
Messages : 39
Enregistré le : 06 déc. 2014, 14:27

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par dbocart »

j'ai trouvé un script en python qui lit et retranscrit en csv les valeurs téléinfo du port série, actuellement j'execute ce script par domoticz toutes les 10 minutes, ca n'affiche rien dans domoticz , ca permet juste d'enregistrer les valeurs.

Sinon je pensais, via un script lua pourquoi pas, lire le port série, ajouter une valeur PAPP, et la renvoyer sur un autre port série 'virtuel' sur lequel domoticz lirais les données, mais pas sur que je sache le faire :( -> un peu d'aide (http://www.hackinglab.org/lua/luasource.html)
RPI B, RFXtrx433e, 2 x Chacon fils pilote (4 radiateurs RDC, 2 ETG) , 3x T° THN132N , 2x T° 1-Wire, téléinfo EDF filaire (via opto), clé Zigbee ConBee II -> 2 Sonoff, 8 ampoules

berty
Messages : 9
Enregistré le : 02 juin 2015, 11:17

Re: Teleinfo : un début d'explication à la non reconnaisance par Domoticz ?

Message par berty »

Bonjour,

Je suis le "gars" qui a pondu le patch pour le téléinfo:
http://www.domoticz.com/forum/viewtopic.php?f=6&t=6389

Dans mon cas, j'ai trouvé plusieurs soucis avec le code teleinfo de domoticz:
* Le premier est effectivement le manque du label PAPP.
Ce label dans le code déclenche la remonté des valeurs de consommation (P1 meter). Donc sans ce label domoticz ne voit pas le capteur téléinfo.

J'ai changé le code pour que les remontés se fassent sur le label MOTDETAT. Ce label est censé finir les trames téléinfo, donc à mon avis, c'est plus logique de faire comme ça!

*Sauf que, 2eme soucis, la fin de ligne sur ce label MOTDETAT est différent des autres fin de ligne des autres labels.
MOTDETAT finit par:

Code : Tout sélectionner

0xd 0x3 0x2 0xa
Les autres labels finissent par:

Code : Tout sélectionner

0xd 0xa
J'ai aussi dé-commenté le code pour que la valeur IINST soit prise en compte, mais je ne suis pas trop sur que ça soit util.
Le suivit de conso se fait sur la différence de valeur du label BASE

Voilà, ça fonctionne chez moi correctement depuis un mois!

Je fais tourner ça sur un raspberry pi 2! le rpi premier génération n'arrivant pas à compiler domoticz!
Je suis parti des sources du trunk de SVN qui n'ont pas du bougé depuis.


Désolé que ça ne soit pas compréhensible sur le forum domoticz, les fichiers sont 2 "patch" à appliquer sur le code source d'origine, un truc standard de développeur!

Répondre