Page 2 sur 2

Re: [Resolu] Teleinfo avec mysensors

Publié : 06 nov. 2015, 23:36
par Grincheux
Salut,

J'ai un capteur avec cette pince, elle n'est actuellement plus en fonctionnement, elle marchait pour ma piscine. Je vais reprendre le code proprement, et associé je pense la tension en plus pour la précision. code en bas a dl
http://myrfx.fr/myrfx-04-wattmetres/

Pour le montage des composants c'est ici
http://www.homautomation.org/2013/09/17 ... d-arduino/
et ici
http://openenergymonitor.org/emon/build ... -interface

D'autres exemples voir lien dans commentaires
http://forum.mysensors.org/topic/703/custom-power-meter

Re: [Resolu] Teleinfo avec mysensors

Publié : 07 nov. 2015, 22:33
par dd91
salut salut

merci de ta reponse pour la pince, et la modif est compatible avec domoticz?

par contre tu saurait faire pour juste une phase?

je te remercie d'avance :D

Re: [Resolu] Teleinfo avec mysensors

Publié : 28 mars 2016, 22:18
par jamon66
Bonjour,

Je me demandais si il etait possible de relever 2 compteurs edf avec un seul node mysensors en utilisant le code proposé par Jaysee ?? dans l'idée je voudrais comparer mon compteur conso et celui de production photovoltaïque.

Quelqu'un aurait déjà planché la dessus ?

Merci.

Re: [Resolu] Teleinfo avec mysensors

Publié : 29 août 2016, 15:16
par phil77560
oudini a écrit :Bonjour à tous,
je rencontre un problème avec la teleinfo avec optocoupleur homemade et mysensors sous domoticz, les valeurs obtenues sont presque bonnes, sauf qu'elles sont trop élevées d'un facteur 1000. Par exemple l'affichage du compteur EDF HP+HC est de "78550928.001kWh, Aujourd’hui: 136.001 kWh". Alors qu'il devrait afficher "78550.925 kWh, Aujourd'hui: 136 Wh".

Comment diviser par 1000 ces valeurs?

Dans le setup-> mètres/compteurs de Domoticz, le diviseur par 1000 est déjà activé.
J'ai vu dans d'autres fils que c'est un problème récurent mais je n'y ai pas trouvé de solution.
Avez-vous une idée ou un lien pour m'orienter vers une solution ?

J'ai utilisé le script de Jaysee: https://github.com/jaysee/teleInfo destiné si j'ai bien compris à jeedom.

Merci d'avance
Bonjour,
Je déterre un peu le sujet ...serait il possible d'avoir plus d'informations sur la façon dont est réalisée la relève de téléinfo avec Mysensor ?... cela m'interesse... merci

Re: [Resolu] Teleinfo avec mysensors

Publié : 02 févr. 2017, 23:19
par Beastie
Bonsoir

J'ai un bout de code pour Mysensors 2.1.0

Code : Tout sélectionner


//==============================================================
//
// MyRfx Teleinfo MySensors 
//
// V1.0 juillet 2015
// V2.0 Janvier 2016 affectation des bons SUB-TYPE sur les capteur et des bons types de Variables
//==============================================================

#include <MySensors.h>
#include <SPI.h>
#include <SoftwareSerial.h>


//==============================================================
// mysensors
//==================================85============================


#define ID 40  // Personnaliser ce parametre en fonction de votre configuration => adresse de votre capteur MySensor

MyMessage kwh_msg(1,V_KWH);
MyMessage papp_msg(2,V_WATT);
MyMessage current_msg(3,V_CURRENT);
MyMessage current_max_msg(4,V_CURRENT);
MyMessage isousc_msg(5,V_CURRENT);
MyMessage index_HC_msg(6,V_KWH);
MyMessage index_HP_msg(7,V_KWH);

int delai_TX_mysensors = 3000;
long mem_Timer;
bool Tx_MySensor;

//==============================================================
// teleinfo
//==============================================================
SoftwareSerial Serial_Teleinfo(8,9); // Affection des pins sur la liaison srie teleinfo Pin 8  et 9

long Base, Base_old =0; 
byte Isousc, Isousc_old =0;
long Index_HC, Index_HC_old =0;
long Index_HP, Index_HP_old =0;
byte I_A, I_A_old =0;
int  P_W, P_W_old =0;
int  Imax, Imax_old=0;
float f_base =0;

// memoire timer pour envoi des données périodiques
long Base_mem_timer =0; 
long Isousc_mem_timer =0;
long Index_HC_mem_timer =0;
long Index_HP_mem_timer =0;
long I_A_mem_timer =0;
long P_W_mem_timer =0;
long Imax_mem_timer =0;

int Donnee = 0;

char charIn_Trame_Teleinfo = 0; // stock chaque charactère recu de la trame teleinfo

String Ligne;      // la ligne complette (entre LF(0x0A) et CR(0x0D))
String Etiquette;  // le nom de la mesure via teleinfo
String Valeur;     // la valeur de la mesure
char Checksum;     // pour controle de la validit d des donnees recues
char Controle=0;   

   
//==============================================================
void setup() {
  
  Serial.begin(115200);         // Port série pour liasion Arduino <-> PC pour le debug
  
  Serial.println();
  Serial.println("Teleinfo v1.0");
  
  Serial_Teleinfo.begin(1200);  // Port série pour liasion Arduino <-> Teleinfo

  // le mode reater est activé (true)
  //begin(NULL, ID, true);

  sendSketchInfo("MyRFX TELEINFO", "2.0");
  present(1, S_POWER, "EDF.Consommation");
  present(2, S_POWER,"EDF.PUISSANCE");
  present(3, S_MULTIMETER,"EDF.I.inst");
  present(4, S_MULTIMETER,"EDF.I.maxi");
  present(5, S_MULTIMETER,"EDF.I.sous");
  
  present(6, S_POWER,"Consommation HC");
  present(7, S_POWER,"Consommation HP");



}

//==============================================================
void loop() {
   //process(); 

   if (millis() - mem_Timer > delai_TX_mysensors){Tx_MySensor= true;} 

   Recupere_la_Teleinfo();
      
}

void Recupere_la_Teleinfo(){

 /*
    Information en provenance de la tlinfo  
    ADCO 040422040644 5	        (N° d'identification du compteur : ADCO (12 caractères))
    OPTARIF HC.. <	        (Option tarifaire (type d'abonnement) : OPTARIF (4 car.))
    ISOUSC 45 ?	                (Intensité souscrite : ISOUSC ( 2 car. unité = ampères))
    HCHC 077089461 0	        (Index heures creuses si option = heures creuses : HCHC ( 9 car. unité = Wh))
    HCHP 096066754 >	        (Index heures pleines si option = heures creuses : HCHP ( 9 car. unité = Wh))
    PTEC HP..  	                (Période tarifaire en cours : PTEC ( 4 car.))
    IINST 002 Y	                (Intensité instantanée : IINST ( 3 car. unité = ampères))
    IMAX 044 G	                (Intensité maximale : IMAX ( 3 car. unité = ampères))
    PAPP 00460 +	        (Puissance apparente : PAPP ( 5 car. unité = Volt.ampères))
    HHPHC E 0	                (Groupe horaire si option = heures creuses ou tempo : HHPHC (1 car.))
    MOTDETAT 000000 B	        (Mot d'état (autocontrôle) : MOTDETAT (6 car.))
*/
    
    
   //===========================================================
   // Une ligne de donnee est composee de la facon suivante :
   // 0x0A Etiquette 0X20 Valeur 0X20 Checksum 0X0D
   //===========================================================
   
   if (Serial_Teleinfo.available() > 0) {
   
          charIn_Trame_Teleinfo = Serial_Teleinfo.read() & 0x7F ; 
  
          switch (charIn_Trame_Teleinfo) {
            
            
            case 0x0A:
                //debut d'une donnee 0X0A
                Serial.print(Etiquette);Serial.print("/");Serial.print(Valeur);Serial.print("/");Serial.println(Checksum);
                Etiquette="";
                Donnee = 1;
                break;
                 
            case 0x20:
                // detection d'un espace (deux dans une trame ) 0X20
                Donnee++;
                if (Donnee == 2){
                  Valeur="";
                }
                
                if (Donnee == 3){
                  Checksum=0;
                }
                break;
                
            case 0x0D:
                // detection de la fin de ligne 0x0D
                Controle=0;
                
                // calcul du controle 
                Ligne = Etiquette + " " + Valeur;
                for (byte i=0;i<(Ligne.length());i++){
                          Controle += Ligne[i];
                }  
                //calcul du Checksum pour le controle
                Controle = (Controle & 0x3F) + 0x20;
                Donnee = 0;
                
                // si le controle est egal au checksum affection des valeurs
                if (Controle == Checksum){ 
                
                      //Affection des valeurs en fonction des etiquettes
                      // transmission des valeurs soit sur changement de valeur (ex: comparaison avec la memoire Base_old et Base
                      // ou périodiquement avec la fonction millis() , pas c'est pas très précis....
                      // régler à votre convenance la variable delai_TX_mysensors
                
                      if (Etiquette.substring (0,4)=="BASE") {
                          Base = Valeur.toFloat();Serial.print(" => Consommation : ");Serial.print(Base);Serial.println(" Wh");
                          f_base = float(Base)/1000;
                          if (millis()- Base_mem_timer > delai_TX_mysensors ){
                             present(1, S_POWER, "EDF.Consommation");
                             send(kwh_msg.set(f_base,3));
                             Base_old = Base;
                             Base_mem_timer = millis();}
                          }
                          
                      if (Etiquette.substring (0,4)=="PAPP") {
                          P_W = Valeur.toInt();Serial.print(" => Puissance apparente : ");Serial.print(P_W); Serial.println(" W");
                          if (millis() - P_W_mem_timer > delai_TX_mysensors){
                            present(2, S_POWER,"EDF.Puissance");
                            send(papp_msg.set(P_W));
                            P_W_old = P_W;
                            P_W_mem_timer = millis();}
                          }  
                          
                      if (Etiquette.substring (0,4)=="IINS") {
                          I_A = Valeur.toInt();Serial.print(" => Intensite instantanee : ");Serial.print(I_A);Serial.println(" A");
                          if (I_A != I_A_old){
                            present(3, S_MULTIMETER,"EDF.I.inst");
                            send(current_msg.set(I_A));
                            I_A_old = I_A;
                            I_A_mem_timer = millis();}
                          }
 
                      if (Etiquette.substring (0,4)=="IMAX") {
                          Imax = Valeur.toInt();Serial.print(" => I.Maximum : ");Serial.print(Imax);Serial.println(" A");
                          if (Imax != Imax_old){    
                             present(4, S_MULTIMETER,"EDF.I.maxi");                      
                             send(current_max_msg.set(Imax));
                             Imax_old = Imax;
                             Imax_mem_timer = millis();}
                          }
                                  
                      if (Etiquette.substring (0,6)=="ISOUSC") {
                          Isousc = Valeur.toInt();Serial.print(" => I.Souscrit : ");Serial.print(Isousc);Serial.println(" A");
                          if ( Isousc != Isousc_old){
                             present(5, S_MULTIMETER,"EDF.I.sous");
                             send(isousc_msg.set(Isousc));
                             Isousc_old = Isousc;
                             Isousc_mem_timer = millis();}
                          }
                  
                      if (Etiquette.substring (0,4)=="HCHC") {
                          //Index_HC = Valeur.toFloat();Serial.print(" => Index Heures creuses : ");Serial.print(Index_HC);Serial.println(" Wh");
                          Index_HC = Valeur.toFloat()/1000;Serial.print(" => Index Heures creuses : ");Serial.print(Index_HC);Serial.println(" kWh");
                          if (millis() - Index_HC_mem_timer > delai_TX_mysensors ){
                             send(index_HC_msg.set(Index_HC));
                             Index_HC_old = Index_HC;
                             Index_HC_mem_timer = millis();}
                          }
                      
                      if (Etiquette.substring (0,4)=="HCHP") {
                          //Index_HP = Valeur.toFloat();Serial.print(" => Index Heures pleines : ");Serial.print(Index_HP);Serial.println(" Wh");
                          Index_HP = Valeur.toFloat()/1000;Serial.print(" => Index Heures pleines : ");Serial.print(Index_HP);Serial.println(" kWh");
                          if (millis() - Index_HP_mem_timer > delai_TX_mysensors){
                             send(index_HP_msg.set(Index_HP));
                             Index_HP_old = Index_HP;
                             Index_HP_mem_timer = millis();} 
                          }

                       }
                       
                      break;
                
            default: 
                // prise en compte des caractres significatifs 
                
                if (Donnee == 1){
                  Etiquette = Etiquette + charIn_Trame_Teleinfo; 
                }
                
                if (Donnee == 2){
                  Valeur = Valeur + charIn_Trame_Teleinfo; 
                }
                
                if (Donnee == 3){
                  Checksum = Checksum + charIn_Trame_Teleinfo; 
                }       
         }
      }
   }

  
   
 


Re: [Resolu] Teleinfo avec mysensors

Publié : 04 févr. 2017, 14:20
par ericd
Merci beaucoup pour ta participation

@+
Eric

Re: [Resolu] Teleinfo avec mysensors

Publié : 15 févr. 2017, 11:30
par Beastie
ericd a écrit :Merci beaucoup pour ta participation

@+
Eric
Avec plaisir. Je suis en train d'essayer d'améliorer un peu le code.

Re: [Resolu] Teleinfo avec mysensors

Publié : 15 févr. 2017, 11:55
par ericd
Quand j'aurais un peu de temps je testerai.

@+
Eric