Decodeur TIC Linky, Le Retour

Bonjour Bert-Dheb,

Waouh... Ca me flatte que vous vouliez utiliser mon code avec une autre carte qui a déjà son propre logiciel...

Ceci dit, je n'ai jamais utilisé d'ESP32 et je ne peux donc pas vous répondre de manière affirmative sur la compatibilité.

S'il s'agit uniquement du décodeur LkyRx_10e, cela ne devrait pas être compliqué. Il suffit de repérer le Serial qui correspond au GPIO08 utilisé par la carte dans la doc ESP32 pour la version de la carte Denky et de configurer le LkyRx_10e en conséquence.

Si vous voulez porter le serveur Linky Lky04j_P, à part la modif sur l'entrée, cela devrait pouvoir se faire, sous réserve que les classes WiFi, WiFiServer, WiFiClient, WiFiUDP, Ticker, IPAddress ne soient pas (trop) différentes et que la PROGMEM et ce qui tient lieu d'EEPROM fonctionnent pareillement. Rien d'impossible, mais la seule façon de savoir c'est de consulter la doc ESP32 et d'essayer...
Certains contributeurs de ce forum ont peut être déjà fait un portage similaire ?

N'ayant pas d'ESp32, je ne pourrais pas vous aider...

Bonne bidouille,

Microquettas

Bonjour MicroQuettas,

Merci pour ton retour !

J'ai dû louper un détail, mais, entre LkyRx_10e et Linky Lky04_P: peux-tu me dire ce que chacun fait et les différences entre les deux ?

Mon idée est avant tout d'avoir quelque chose d'ouvert et dont les informations puissent être utilisées via une API, du XML,websocket ou autre.

Bonne journée,

Bert-dheb.

Bonsoir Bert-Dehb,

Si vous voulez utiliser les informations du Linky dans une application que vous allez développer, c'est un simple décodeur qu'il vous faut :

  • LkyRx_10e peut faire l'affaire, après adaptation de son entrée à la carte Denky D4. C'est un décodeur minimal, écrit pour tourner sur AVR328 et laisser des ressources pour le reste de l'application. Il ne décode que ce qu'il est configuré pour décoder, et seulement sur la TIC historique,
  • vous avez aussi la LibTeleInfo du concepteur de la carte. Pas de souci d'adaptation et un décodeur plus complet, mais plus gourmand en ressources.

Compte tenu de la puissance de l'ESP32 et de la disponibilité d'un décodeur conçu spécifiquement pour la carte Denky D4, je prendrais LibTeleInfo comme premier choix.

Revenez vers moi si vous voulez quand même utiliser LkyRx_10e. et si vous avez besoin d'aide pour modifier son entrée.

Bonne bidouille

MicroQuettas

Merci MicroQuettas pour ces informations.

Je pense que je vais tout tester :grinning:

Dans un premier temps, je vais commander la carte. Je n'ai moi-même jamais travaillé avec l'ESP32, uniquement avec l'ESP8266.
Mais là la carte est proposée entièrement assemblée avec un ESP32, et n'étant pas très doué pour les soudures, je préfère cette solution. Ca m'évitera de me demander pourquoi le code ne marche pas alors qu'il s'agit d'une mauvaise soudure :sweat_smile: :sweat_smile:

Je te tiens au courant au cours de l'évolution.

bonne journée,

Bert-dheb.

Bonjour!

De mon cote, je tente de mettre en place un petit module base sur le code de MicroQuettas (version10e) avec en plus une emission en 433MHz utilisant la librarie VirtualWire.
Neamoins, je ne parviens a faire cohabiter les deux dans une meme solution. D'un point de vue hardware, les deux fonctionnent (reception TIC ou emission 433MHz), mais impossible de produire un code permettant de receptionner les data du linky et de les envoyer par "les ondes".
Je suppose que la cause est une utilisation commune du port serial, mais je ne trouve pas de solution.

J'utilise une carte Nano. J'ai bien fait en sorte de redefinir les ports vers d'autres valeurs que 10, 11 et 12 pour le VirtualWire, mais c'est insufisant.

Une suggestion @MicroQuettas ou @JeeLet.
Merci pour vos posts fort interessants!

Bonjour @sam59
pour le 433Mhz quelle base matériel (réf?)
(la je suis pas tout les jours sur mon ordi, oui vielle école )

Bonsoir sam59,

Pour pouvoir vous aider, il faudrait que vous postiez :

  • votre code complet,
  • le schéma de votre projet,
  • une petite description de ce que voulez faire : transmission ASCII, binaire, quoi, quand ?

A+
MicroQuettas

Bonjour @JeeLet
J'utilise ce genre de module emetteur 433MHz.

Bonsoir @MicroQuettas

Je souhaiterai transmettre principalement la puissance consommee en instantane, et l'index a chaque fois qu'ils sont mis a jour, par l'intermediaire d'un module 433MHz (afin de deporter un afficheur, qui ne sera pas necessairement le bienvenu a cote du compteur electrique).

Voici le code complet, base sur la version 10e de votre code. Les quelques lignes ajoutee sont commentees.

Ca n'est pas un code voue a etre complet, mais principalement pour tenter de resoudre le conflit entre la reception Linky et l'Emission RF


/***********************************************************************
                        Récepteur TIC Linky
                        Mode historique

V03  : External SoftwareSerial. Tested OK on 07/03/18.
V04  : Replaced available() by new(). Tested Ok on 08/03/18.
V05  : Internal SoftwareSerial. Cf special construction syntax.
V06  : Separate compilation version.

V10a : Parametric version, initial. Tested OK on 23/10/19.
V10b : fixed bug in ptecIsNew(). Tested OK on 24/10/19.
V10c : added LKYSIMINPUT mode. Tested OK (partial) on 31/10/19.
V10d : adapted to Arduino Uno and Mega. Tested Ok on 27/04/20.
V10e : added optional ISOUSC. OK 26/11/22

***********************************************************************
Configuration parameters are defined in LinkyHistTIC.h

***********************************************************************/

/***************************** Includes *******************************/
#include <string.h>
#include <Streaming.h>

#include "LinkyHistTIC.h"

// include librarie for virtualwire   //ajoute le 17/07/2023 pour emission 433MHz
#include <VirtualWire.h> 

/****************************** Defines *******************************/
#define VERSION "V10e"


// structure definition               //ajoute le 17/07/2023 pour emission 433MHz
typedef struct {
  char commande;
  int valeur;
} MaStructure;

  MaStructure tempds18b20;


/****************************** Constants *****************************/


/************************* Global variables ***************************/




/************************* Object instanciation ***********************/
LinkyHistTIC Linky(LKYRX_INPUT, LKYTXPIN);

/****************************  Routines  ******************************/




/******************************  Setup  *******************************/
void setup()
  {

  /* Initialise serial link */
  #ifndef LKYSIMINPUT
  Serial.begin(9600);
  #endif

  /* Initialise the Linky receiver */
  Linky.Init();

  Serial << F("Bonjour - ") << VERSION << endl;

// ajoute le 17/07/2023 pour emission 433MHz
  
  vw_set_tx_pin(3);      //init=12, changed to 3 to give a try          // pins 13,12,8,7 are working
  vw_set_rx_pin(5);      //init=11, changed to 5 to give a try          // pins 13,12,8,7 are working
  vw_set_ptt_pin(6);      //init=10, changed to 6 to give a try          // pins 13,12,8,7 are working
  vw_setup(2000);
  
  }


/******************************* Loop *********************************/
void loop()
  {
  uint8_t i;

//  vw_send((byte*) &tempds18b20, sizeof(tempds18b20)); // On envoie le message
//  vw_wait_tx();                                       // On attend la fin de l'envoi

  Linky.Update();

  if (Linky.pappIsNew())
    {
    Serial << F("Puis. app. = ") << Linky.papp() << F(" VA") << endl;
    }

  #ifdef LKY_Base
  if (Linky.baseIsNew())
    {
    Serial << F("Index base = ") << Linky.base() << F(" Wh") << endl;
    }
  #endif

  #ifdef LKY_HPHC
  if (Linky.hchpIsNew())
    {
    Serial << F("Index HP = ") << Linky.hchp() << F(" Wh") << endl;
    }
  if (Linky.hchcIsNew())
    {
    Serial << F("Index HC = ") << Linky.hchc() << F(" Wh") << endl;
    }
  if (Linky.ptecIsNew())
    {
    Serial << F("Tarif en cours : ");
    if (Linky.ptec() == Linky.C_HPleines)
      {
      Serial << F("heures pleines") << endl;
      }
      else
      {
      Serial << F("heures creuses") << endl;
      }
    }
  #endif

  #ifdef LKY_IMono
  if (Linky.iinstIsNew())
    {
    Serial << F("I instant. = ") << Linky.iinst() << F(" A") << endl;
    }
  #endif

  #ifdef LKY_ITri
  for (i = Linky.C_Phase_1; i <= Linky.C_Phase_3; i++)
    {
    if (Linky.iinstIsNew(i))
      {
      Serial << F("I Phase ") << i+1 << F(" = ") \
             << Linky.iinst(i) << F(" A") << endl;
      }
    }
  #endif

  #ifdef LKY_ISOUSC
  if (Linky.isouscIsNew())
    {
    Serial << F("Intensité souscrite = ") << Linky.isousc() << F(" A (par phase)") << endl;
    }
  #endif
  
  }; 

Etant limite en nombre de reponse, je complete celle-ci:

Merci @MicroQuettas pour le retour rapide!
Je ne m'attendais pas a un tel support!

Sur l'aspect linky: je suis en:

  • tarification HSC(Heures Super Creuses) HC HP (Anciennement Direct Energie)
  • mono-phase

Effectivement, je n'utilise generalement le moniteur serie que pour debugger, ca n'est pas pour moi une fin en soi d'avoir un ordi connecte en permanence sur une des arduino

La bibliotheque VirtualWire que j'utilise est effectivement peut etre un peu datee. Je la mets en PJ.

J'utilise l'emission et la reception avec VitualWire notemment sur un capteur exterieur (temperature, humidite, pression atmospherique) qui envoit vers une seconde arduino disposant d'un ecran. Sur cette installation, aucun soucis avec la bibliotheque. Voici les codes correspondants. Desole si je respecte pas l'etat d'art, sur la facon de commenter:

Voici le code emetteur (un capteur DHT22, un capteur BMP180 + un bete capteur de lumiere)

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

 //////////////////////////////
//////                    //////
//////     DEFINITION     //////
//////                    //////
 //////////////////////////////

// include libraries 
#include <VirtualWire.h> 
#include "DHT.h"
#include <Wire.h>
#include <SFE_BMP180.h>

// DHT definition
#define DHTPIN 2     // defines the pin on which DHT22 is connected 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);  // Initialize DHT sensor for normal 16mhz Arduino

// light sensor definition
  int val = 0;  
  int CDSpin = 1; // this pin is used for light measurement
  int tempfinal = 0;
  int humfinal = 0;
  int tressfinal = 0;
  int pressurefinal = 0;
  int delaybet = 300; // delay between sending each data
  int delayend = 10000; // delay when all data was sent

// structure definition 
typedef struct {
  char commande;
  int valeur;
} MaStructure;

  MaStructure temp;
  MaStructure humi;
  MaStructure lumi;
  MaStructure tress;
  MaStructure pressure;

// BMP180 definition (pressure sensor)
SFE_BMP180 bmp180;
int Altitude = 30; //current altitude in meters

 /////////////////////////
//////               //////
//////     SETUP     //////
//////               //////
 /////////////////////////

void setup() {
  Serial.begin(9600);

  // Initialisation de la bibliothèque VirtualWire
  vw_setup(2000);
  vw_set_tx_pin(13); // pins 13,12,8,7 are working
  Serial.println("Go !"); 
  dht.begin();

  delay(300); // small delay is required, otherwise data is not available (ini=300)

  // Initialization for BMP180
  bool success = bmp180.begin();
  if (success) {
    Serial.println("BMP180 init success");

  delay(2000); // just to ensure everything has started properly..., before measuring and sending first data
    
  }
}

 ////////////////////////
//////              //////
//////     LOOP     //////
//////              //////
 ////////////////////////

void loop() {

//  delay(2000); // just to ensure everything has started properly..., before measuring and sending first data

/////////////////////////////////
//////                      //////
//////     MEASUREMENTS     //////
//////                      //////
 ////////////////////////////////

// First, each of the parameters is measured and/or calculated

  float h = dht.readHumidity();
  float inttemp = dht.readTemperature();  // Read temperature as Celsius
  float f = dht.readTemperature(true); // Read temperature as Fahrenheit

  float hi = dht.computeHeatIndex(f, h); // Calcul la température ressentie
  hi = dht.convertFtoC(hi); //Convertion de la temperature ressentie en degre Celsius

/*
  Serial.println(inttemp);
  Serial.println(h);
  Serial.println(f);
  Serial.println(hi); // Affiche la température ressentie
*/

  tempfinal = (int) inttemp; 
  humfinal = (int) h;
  tressfinal = (int) hi;

  val = analogRead(CDSpin); // reads voltage on analog pin 1
  val = map(val, 15, 1007, 0, 99); //Scale down the value from 1023-max to 101-max


  // below is aquisition from BMP180 sensor: 

    char status;
  double T, P;
  bool success = false;

  status = bmp180.startTemperature();

  if (status != 0) {
    delay(20);
    status = bmp180.getTemperature(T);

    if (status != 0) {
      status = bmp180.startPressure(3);

      if (status != 0) {
        delay(status);
        status = bmp180.getPressure(P, T);

        if (status != 0) {
          float comp = bmp180.sealevel(P, Altitude);
          pressurefinal = comp +0.5;

        }
      }
    }
  }

/////////////////////////////////
//////                      //////
//////     TRANSMISSION     //////
//////                      //////
 ////////////////////////////////

// Second, each of the parameters is transmitted via virtualwire

  delay(300); // just to ensure everything from previous section has ended properly... 
          
  temp.commande = 'T';
  temp.valeur = tempfinal;
  
  Serial.print(temp.commande);
  Serial.print("="); 
  Serial.print(temp.valeur); 
  Serial.println("*C");

  vw_send((byte*) &temp, sizeof(temp)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi
  
  delay(delaybet);

  humi.commande = 'H';
  humi.valeur = humfinal;

  Serial.print(humi.commande);
  Serial.print("="); 
  Serial.print(humi.valeur);
  Serial.println("%"); 

  vw_send((byte*) &humi, sizeof(humi)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi

  delay(delaybet);

  tress.commande = 'R';
  tress.valeur = tressfinal;

  Serial.print(tress.commande);
  Serial.print("="); 
  Serial.print(tress.valeur);
  Serial.println("*C");

  vw_send((byte*) &tress, sizeof(tress)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi

  delay(delaybet);

  lumi.commande = 'L';
  lumi.valeur = val;

  Serial.print(lumi.commande);
  Serial.print("=");
  Serial.print(lumi.valeur);
  Serial.println("%");

  vw_send((byte*) &lumi, sizeof(lumi)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi

  delay(delaybet);

  pressure.commande = 'P';
  pressure.valeur = pressurefinal;

  Serial.print(pressure.commande);
  Serial.print("=");
  Serial.print(pressure.valeur);
  Serial.println("hPa");

  vw_send((byte*) &pressure, sizeof(pressure)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi
  
  delay(delayend);
}

et le code reception:

// receiver using using virtual wire to receive data from the emitter + sending part of the information to the LCD display

 //////////////////////////////
//////                    //////
//////     DEFINITION     //////
//////                    //////
 //////////////////////////////

// libraries include
#include <VirtualWire.h>              // include the virtualwire library 
#include <LiquidCrystal.h>            // include the LCD library

// LCD definition
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);  // initialize the library with the numbers of the interface pins
const int inputPin = A0;              // buttons array analog input 
uint16_t inputValue = 0;              // value read from buttons array
// variables definition
int temperature = 0;
int humidity = 0; 
int light = 0;
int tress = 0;
int pressure = 0;

// structure definition 
typedef struct {
  char commande;
  int valeur;
} MaStructure;

// led definition
int led = 13;

 /////////////////////////
//////               //////
//////     SETUP     //////
//////               //////
 /////////////////////////

void setup() {
  Serial.begin(9600);

  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_setup(2000);
  vw_set_rx_pin(11);
    vw_rx_start(); // On peut maintenant recevoir des messages

  Serial.println("Go !"); 
  
  //LCD
  lcd.begin(16, 2);              // set up the LCD's number of columns and rows
  lcd.print("initialisation");  // Print a message on the LCD
  lcd.setCursor(0, 1);           // set the cursor to column 0, line 1
  lcd.print("en cours");

  delay(2000);

  lcd.begin(16, 2);              // set up the LCD's number of columns and rows

//  noTone(8);
  tone(8, 100, 100);
  delay(150);
  tone(8, 100, 100);

  // Led initialization

  pinMode(led, OUTPUT);     // it can also be defined using "BUILTIN": pinMode(LED_BUILTIN, OUTPUT)
                            // in that case, the correct pin is chosen automatically so that the integrated led is used
                            // draw-back is that you pin number is not fully clear... 
                            
}

 ////////////////////////
//////              //////
//////     LOOP     //////
//////              //////
 ////////////////////////

void loop() {
  MaStructure message;
  byte taille_message = sizeof(MaStructure);

  vw_wait_rx();

  if (vw_get_message((byte *) &message, &taille_message)) {
    // On copie le message, qu'il soit corrompu ou non

    Serial.print("commande="); // Affiche le message
    Serial.print(message.commande);
    Serial.print(" valeur=");
    Serial.println(message.valeur);
}

  if (message.commande == 'T') {
    temperature = message.valeur;
//    temperature = -12; //for test only
}

 if (message.commande == 'H') {
    humidity = message.valeur;
}

 if (message.commande == 'L') {
    light = message.valeur;
}

 if (message.commande == 'R') {
    tress = message.valeur;
}

 if (message.commande == 'P') {
    pressure = message.valeur;
}

  tone(8, 35, 100); //audible feedback on pin8 [ tone(8, 35, 100); ]

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(10);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
//  delay(10);               // wait for a second
 
  //print int temperature on LCD
  
  if (temperature > 9) {  
    lcd.setCursor(0, 0);
    lcd.print("deg=");
    lcd.setCursor(4, 0);
    lcd.print(temperature);
    lcd.setCursor(6, 0);
    lcd.print(" ");
  }
  else if (temperature <0) {
    lcd.setCursor(0, 0);
    lcd.print("deg=");
    lcd.setCursor(4, 0);
    lcd.print(temperature);
  }  
  else {
    lcd.setCursor(0, 0);
    lcd.print("deg=");
    lcd.setCursor(4, 0);
    lcd.print("0");
    lcd.setCursor(5, 0);
    lcd.print(temperature);
    lcd.setCursor(6, 0);
    lcd.print(" ");
  }
  
  //print int humidity on LCD
  
  if (humidity > 9) {
  lcd.setCursor(8, 0);
  lcd.print("hum=");
  lcd.setCursor(12, 0);
  lcd.print(humidity);
  }
  else {
  lcd.setCursor(8, 0);
  lcd.print("hum=");
  lcd.setCursor(12, 0);
  lcd.print("0");
  lcd.setCursor(13, 0);
  lcd.print(humidity);
  }

  //print int light on LCD
  
  if (light > 9){
  lcd.setCursor(0, 1);
  lcd.print("lum=");
  lcd.setCursor(4, 1);
  lcd.print(light);
  }
  else {
  lcd.setCursor(0, 1);
  lcd.print("lum=");
  lcd.setCursor(4, 1);
  lcd.print("0");
  lcd.setCursor(5, 1);
  lcd.print(light);
  }

/*
  //print heat index on LCD
    
    if (tress > 9) {  
    lcd.setCursor(8, 1);
    lcd.print("tre=");
    lcd.setCursor(12, 1);
    lcd.print(tress);
    lcd.setCursor(14, 1);
    lcd.print(" ");
  }
  else if (tress <0) {
    lcd.setCursor(8, 1);
    lcd.print("tre=");
    lcd.setCursor(11, 1);
    lcd.print(tress);
  }  
  else {
    lcd.setCursor(8, 1);
    lcd.print("tre=");
    lcd.setCursor(12, 1);
    lcd.print("0");
    lcd.setCursor(13, 1);
    lcd.print(tress);
    lcd.setCursor(14, 1);
    lcd.print(" ");
  }
*/

  //print pressure on LCD
    
    if (pressure > 999) {  
    lcd.setCursor(8, 1);
    lcd.print("pre=");
    lcd.setCursor(12, 1);
    lcd.print(pressure);
  }
  else {
    lcd.setCursor(8, 1);
    lcd.print("pre=");
    lcd.setCursor(12, 1);
    lcd.print(pressure);
    lcd.setCursor(15, 1);
    lcd.print(" ");
  }

  //cleaning of zero digits
    // first row
  lcd.setCursor(6, 0);
  lcd.print(" ");
  lcd.setCursor(7, 0);
  lcd.print(" ");
  lcd.setCursor(14, 0);
  lcd.print(" ");
  lcd.setCursor(15, 0);
  lcd.print(" ");

    // second row
  lcd.setCursor(6, 1);
  lcd.print(" ");
  lcd.setCursor(7, 1);
  lcd.print(" ");

}

Bonsoir,

Merci pour les infos. Encore quelques questions:

  • pour adapter le programme principal à votre cas et n'y mettre que ce qui est pertinent, il faudrait connaître la configuration du décodeur Linky: tarification et si vous êtes en mono ou tri,
  • Je comprends que vous n'aurez plus besoin de la sortie des données Linky sur le moniteur série ?
  • quelle version de la bibliothèque VirtualWire utilisez vous ? D'où l'avez vous chargée ? J'ai vu qu'elle était obsolète, donc il faut se méfier des différentes versions qui peuvent circuler...
  • je comprends de votre post que vous avez testé l'émission et la réception avec VirtualWire entre deux Arduinos et que ça marche ? Pouvez vous poster le code correspondant ?

Merci et bonne bidouille,

MicroQuettas

1 Like

... mais MicroQuettas (bonjour) toujours sur le pont, un sav du code garantie 20ans :slight_smile:

faire un test avec un Uno peut etre ( certain Nano mon fait des blagues, oui rien de clair simple intuition féminine)
courage sam59 tes entre de bonne mains :slight_smile:

1 Like

@JeeLet

Bonjour et merci !
Pour le nano, je n'en ai pas. Je bidouille sur Uno, Micro Pro, Mega et ESP8266.
Pour le SAV pendant 20ans, c'est très incertain... Je vais rajouter votre demande dans mon dossier pour la prolongation du contrat, mais ce n'est pas moi qui décide :smile:

@sam59

Merci pour toutes les infos.

  • Commençons par les choses simples (ou presque). Je ne suis pas sûr que le HSC ait un impact sur le Linky. Avec un peu de chance, c'est uniquement au niveau de la tarification du fournisseur. Pour lever le doute, il faudrait que vous fassiez défiler les infos sur le Linky avec son bouton et me dire combien d'index sont renseignés (différents de zéro),
  • Plus complexe: je comprends de vos posts que vous voulez avoir deux systèmes le Linky et votre station météo qui fonctionnent ensemble avec le même système de transmission radio.
    Le hic c'est que votre système de transmission ne gère pas les accès multiples. Si les deux émetteurs transmettent en même temps, les messages se brouillent mutuellement et le résultat n'est pas exploitable (on appelle cela une collision). Pour éviter cela, il faut utiliser des systèmes et protocoles de transmission plus complexes, c-à-d en pratique changer tout votre matériel et revoir tous les logiciels.
    Comme les transmissions ne sont pas continues, les messages courts et les deux émetteurs asynchrones, on peut quand même essayer, mais il y aura forcément des pertes.
    Répéter les transmissions n'est pas la solution car cela augmente les collisions.
    Vous allez utiliser un ou deux récepteurs ?

Je vais regarder votre code et revenir vers vous avec d'autres questions. N'ayant pas le matériel correspondant, je ne pourrais pas tout tester.
Pour les délais, les Chicoufs arrivent en fin de semaine... ensuite il faudra récupérer... bref ne soyez pas trop pressé !

Enfin, je n'ai pas trouvé la bibliothèque en PJ. Dites moi simplement où vous l'avez prise sur le net et je la chargerai pour être sûr d'avoir la même que la vôtre.

Bonne bidouille,

MicroQuettas

Bonjour @MicroQuettas !

J'ai trois index renseignes (HSC, HC et HP).

Effectivement il y a un risque de collision, mais que je considere acceptable a partir du moment ou je n'utilise pas ces installation pour autre chose que du reporting et si je ne multiplie pas le nombre d'emetteurs.

J'ai cette librairie VirtualWire depuis plusieurs annees, je ne suis pas certain de la version que j'avais pu trouve a l'epoque.
En tout , une version 1v27 est dispo ici:

https://www.airspayce.com/mikem/arduino/VirtualWire/index.html

J'essaierai de mettre a jour vers la version 1v27, on ne sais jamais!

Merci pour votre support!

Bonjour @JeeLet
J'essaierai effectivement avec UNO, c'est une bonne idee de retourner aux bases!
Merci!

Rebonjour @sam59,

Pour le 3ième index, il va falloir adapter le décodeur. Pour cela, j'aurais besoin des enregistrement de la TIC.
Sur votre version 10e:

  • vous commentez la ligne 77 :

//#define LKY_Base true /* Défaut, exclusif avec LKY_HPHC */

  • vous décommentez la ligne 78 :

//#define LKY_HPHC true /* Exclusif avec LKY_Base */

  • vous décommentez la ligne 96 :

//#define LINKYDEBUG true /* Verbose debugging mode */

Le décodeur va devenir très bavard et copier tout ce qu'il reçoit sur le moniteur série. C'est cela qu'il me faut, sur les 3 périodes tarifaires.

Pour la transmission radio, je ne vois pas de difficulté majeure si vous acceptez les collisions et les pertes qui vont avec.

Question importante : allez vous utiliser le même récepteur ou deux récepteurs séparés ? Vous n'avez que deux lignes sur l'afficheur et tout ne tiendra pas...
Le plus simple serait un deuxième récepteur avec un afficheur 4 lignes (la PAPP et les 3 index).

A+ et bonne bidouille,
MicroQuettas

Bonjour @MicroQuettas

Je pense effectivement utiliser deux ecran separes, et donc deux recepteurs. Il y a un risque de colision mais je pense que ca ne devrait pas poser de gros probleme si je reste a deux emetteurs.

J'ai effectue les acquisitions, je ne vois que peu de difference (a mon grand etonnement) entre les 3 creneaux horaires:
(j'ai juste enleve mon num ADCO)

Heures Super Creuses:
Bonjour - V10e
ISOUSC 45 ?
BASE 049689153 8
PTEC TH.. $
Tarif en cours : heures pleines
IINST 011 Y
I instant. = 11 A
IMAX 090 H
PAPP 02500 (
Puis. app. = 2500 VA
HHPHC A ,
MOTDETAT 000000 B
ADCO xxx
OPTARIF BASE 0
ISOUSC 45 ?
BASE 049689154 9
PTEC TH.. $
IINST 011 Y
IMAX 090 H
PAPP 02500 (
HHPHC A ,
MOTDETAT 000000 B

Heures Creuses:
Bonjour - V10e
PTEC TH.. $
Tarif en cours : heures pleines
IINST 001 X
I instant. = 1 A
IMAX 090 H
PAPP 00260 )
Puis. app. = 260 VA
HHPHC A ,
MOTDETAT 000000 B
ADCO xxx
OPTARIF BASE 0
ISOUSC 45 ?
BASE 049682994 >
PTEC TH.. $
IINST 001 X
IMAX 090 H
PAPP 00260 )
HHPHC A ,
MOTDETAT 000000 B

Heure Pleines:
Bonjour - V10e
BASE 049680136 0
PTEC TH.. $
Tarif en cours : heures pleines
IINST 001 X
I instant. = 1 A
IMAX 090 H
PAPP 00310 %
Puis. app. = 310 VA
HHPHC A ,
MOTDETAT 000000 B
ADCO xxx
OPTARIF BASE 0
ISOUSC 45 ?
BASE 049680137 1
PTEC TH.. $
IINST 001 X
IMAX 090 H
PAPP 00300 $
Puis. app. = 300 VA
HHPHC A ,
MOTDETAT 000000 B

Desole pour l'absence d'accents...
Bonne journee!
Samuel

Bonjour Samuel,

Merci pour le message.

Il montre que la tarification à 3 index n'est pas transmise dans la TIC qui est mono index.
Je suppose que l'index TIC est la somme des 3 ?
Peu importe, sauf à faire une usine à gaz, je ne crois pas qu'on puisse les recréer...

Vous n'aurez donc que la PAPP et ça c'est facile, au moins pour faire un essai.

Je reviens vers vous dès que possible...

A+ et bonne bidouille

Frédéric de MicroQuettas

Envoyé depuis l'application Mail Orange

Coucou, me revoilà !

Résumé des épisodes précédents : la TIC transmise avec le tarif HSC est une TIC "base", c-à-d avec un seul index. Conclusion : on ne va garder que la PAPP...

Plus ennuyeux, j'ai regardé dans les bibliothèques VirtualWire et SoftwareSerial et j'ai des doutes sérieux sur la possibilité de les utiliser ensemble... En bon bidouilleur, on va essayer dans l'ordre:

  1. de se passer de SoftwareSerial,
  2. d'essayer de faire avec,
  3. de voir si on peut trouver autre chose...

Pour se passer du SoftwareSerial, on va essayer d'utiliser l'entrée RX (HWSerial) de votre carte. Si l'optocoupleur a suffisamment de gain, ça peut marcher... En tous cas, cela ne coûte, ni ne risque rien, d'essayer. Pour cela, sur votre version 10e, fichier LinkyHistTic.h

  • ligne 71, choisir la configuration 5

#define LKYCONFIG 5

  • ligne 77, décommentez

#define LKY_Base true

  • ligne 78, commentez

//#define LKY_HPHC true

  • ligne 83, commentez

//#define LKY_ISOUSC true

  • ligne 96, commentez

//#define LINKYDEBUG true

Entrez maintenant le signal du récepteur Linky sur la pin 0 de l'Arduino (RX), réglez le moniteur série sur 1200 bds, et regardez s'il gazouille...

Côté récepteur, c'est plus facile.
Quand on aura réglé nos problèmes de cohabitation, on transmettra la PAPP comme les autres infos, dans une structure

typedef struct {
char commande;
int valeur;
} MaStructure;

Pour commande on va choisir un 'p' (minuscule) et on mettra la PAPP dans valeur.
Les lecteurs attentifs vont remarquer que si la PAPP dépasse 32767 VA, l'affichage sera négatif. Ils ont raison, mais dans le cas de sam59, avec une ISOUSC de 45A, cela donne une puissance maximale de 9000 VA et une coupure Linky à 11700 VA. sam59 peut donc être tranquille...

Je vous laisse modifier le logiciel de votre récepteur en conséquence... Si vous voulez, postez le pour vérification.

A+ et bonne bidouille,

MicroQuettas

Bonjour @MicroQuettas

Merci pour ton retour!

Juste un rapide message pour dire que je n'ai pas encore eu le temps d'essayer me passer du SoftwareSerial. Ca me parait etre une bonne solution, il me faut un peu de temps pour l'appliquer.

Entre temps, je suis parvenu a une solution qui fait le job, en utilisant un porte AND exterieure, venant maquer le signal TIC lorsque je souhaite emettre en 433MHz! Solution qui fonctionne, mais qui demande un composant exterieur supplementaire, donc il y a certainement moyen de faire mieux que ca, effectivement!

A bientot pour la suite!

Sam