TeleInfo et strcmp

Bonsoir
une demande Archéologique sur une Librairie passer de mains en mains.

je cherche à retrouver un fonctionnement sur certaine partie du croquis que voici .

void send_teleinfo_historique(char *name, char *value) {
  if (strcmp_P(name, char_ADCO) == 0) {send(msgTEXT.setSensor(CHILD_ID_ADCO).set(value));return;}
....

la comparaison avec la fonction strcmp() ne fonctionement pas , le "name" n'est pas remonter, cella me donne trop de dialogue sur le Bus.

sur le forum MySensors j'ai poster le croquis de test TeleinfoMySensors.ino

L'histoire à commencer Ici teleinfo-et-mysensors

comment trouver la solutions ??
remétre à plat cette librairie, recoller les parties manquantes !
ou je repart sur une lib la plus simple possible que j'adapte pour MySensors ?

le github de TeleinfoMySensors

Merci

Re_Edit
https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#gad34d5b7d040fcb97939e939f19d88a5f

Je suppose que les autre comparaisons ne fonctionnent pas non plus.
Je pense que le problème vient du fait que les chaînes comme char_ADCO sont définies comme PROGMEM. Du coup, tu ne peux pas passer le pointeur comme argument à strcmp.
Je crois qu'il y a un truc pour contourner ça mais là j'ai un trou.

Bonsoir @fdufnews ... merci du coup d’œil.

pour PROGMEM il y a un truc , une modification sur la lib. originel

FB V2.0.0 - Utilisation librairie universelle LibTeleinfo modifiée (pas d'enregistrement, pas assez de RAM sur l'ATmega328 pour avoir une solution stable en TIC full)

https://github.com/tdouez/TeleinfoMySensors/blob/master/TeleinfoMySensors.ino

peut être la cause du problème ?

"Je suppose que les autre comparaisons ne fonctionnent pas non plus." ..Oui

Re-Edit
j'ai fais des teste avec les deux version , "LibTeleinfoLite.h" et "LibTeleinfo.h"

et trouver les parties modifier , ligne 899 / 818 de la version
LibTeleinfoLite.cpp

Arggg j'avais pas vu que c'était strcmp_P qui accepte un pointeur en mémoire programme sur le second argument.

Ce test fonctionne bien si name est un tableau de char et char_ADCO un tableau de char en mémoire programme.

Je ne comprends pas ce que tu veux dire. Et je ne vois pas le rapport entre ta question ici les liens que tu donnes vers les autres forums.
As-tu fait un print de name pour t'assurer que tu compares bien ce que tu crois?

un test du matin :slight_smile:

 if (strcmp_P(name, char_PAPP) == 0) //
    {Serial.print(F("oui  PAPP :  ")); Serial.println(value);}
  else
    {Serial.print(F("non  PAPP :  ")); Serial.println(value);}

donc PROGMEM et strcmp_P est fonctionnelle.
excuse moi @fdufnews mon interpretation de cette ligne était fausse :frowning:

c'est pas sur un changement de la valeur que le send (l'envoie du msg) est exécuté.
les "if (strcmp_P(name...." c'est comme un tableau, un sélecteur ?

un retour à la casse départ, c'est quoi cette ligne sans lien apparent avec le code et la librairie ??

const unsigned long SEND_FREQUENCY_FULL = 180000; // 3mn, Temps minimum entre les envois (in milliseconds).

.."Je ne comprends pas ce que tu veux dire" .oui oublie je merdouille :frowning:

ma lecture du matin.

Ce define ne semble pas utilisé où que ce soit.

oui , je test autres choses, on récapitule .

Envoyer le msg uniquement lorsque la valeur change et/ou sinon toute les Xminutes.

pour le Tempo

unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    envoyer le msg 
  }

et pour le cdv (le changement de valeur)

if ( valActuelle != valPrecedente )
		{
		...le msg
		valPrecedente = valActuelle;
		}

et la aucune idées de comment inséré les deux fonctionnalité dans la ligne de code ?????

un début de piste ????
Unable to read data from my (Linky) electricity meter | MySensors Forum

je comprend pas , cella fonctionne ......... presque.
ma petite salade tourne presque impeccable, un code moins concis, mais compréhensible.

.. les valeurs en test



//------------------ ajout tempo dialogue --------------
	unsigned long previousMillis1 = 0; 
		const long interval1 = 60000; 
			 byte tempo = false;
 			 byte flag_Tempo = false;

// ----- pour les valeurs -----------  
	const char char_PAPP[] PROGMEM = "PAPP";
 	int valPAPP;  int svalPAPP;
 	
	const char char_HCHC[] PROGMEM = "HCHC";
 	int valHCHC;  int svalHCHC;


// -------------- send_teleinfo  ---------------------------- 
  void send_teleinfo(char *etiq, char *val ) 
   {
       send_teleinfo_historique(etiq, val, tempo );


// ---------------- send_teleinfo_historique  ------------------------- 
  void send_teleinfo_historique(char *name, char *value , byte tempo) {
      
//------------- test CDV  et tempo ----------------------
    if (strcmp_P(name, char_PAPP) == 0) { 
      valPAPP=atol(value);
      if (valPAPP != svalPAPP || tempo == true) {
        send(msgVA.setSensor(CHILD_ID_PAPP) .set(valPAPP));}
        svalPAPP = valPAPP; return; }

    if (strcmp_P(name, char_HCHC) == 0) {
      valHCHC=atol(value);  
       if (valHCHC != svalHCHC || tempo == true) {
      	send(msgKWH.setSensor(CHILD_ID_HCHC).set(valHCHC));}
      	svalHCHC = valHCHC;  flag_Tempo = true;
      	return; }
 ....
       
//------- le void loop()  ...la Tempo ---------------------

      unsigned long currentMillis1 = millis();
    if(currentMillis1 - previousMillis1 > interval1) {
      tempo = true;    previousMillis1 = currentMillis1;
       }
 
    if (flag_Tempo) { tempo = false; }
    
 //--------------------   
         
          

bonsoir
programme fonctionnelle , envoie des messages sur changement de la valeur.
la partie Tempo on oublie (non fonctionnelle )
simplification du croquis, passage Mode simple , compteur Mono et Historique.

le programme (pour Mega2560)

/*
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2018 Sensnology AB
 * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
*/

//--------------------------------------------------------------------
//   _| |  |   ` \    -_)   -_)    _ \  |   -_)  |  |   -_)     
//  _| \_,_| _|_|_| \___| \___|   ___/ _| \___| \_,_| \___|  
//--------------------------------------------------------------------    

// sur une base de FB 
// https://community.ch2i.eu/topic/1373/teleinfo-et-mysensors
// https://forum.mysensors.org/topic/12060/send_frequency_full-wait
// https://forum.arduino.cc/t/teleinfo-et-strcmp/1055294/

//-------------------------------------------------------------------------
//******  Arduino Mega2560 - MySesnsors sur bus RS485  *********  nov.2022
//-------------------------------------------------------------------------

// Enable debug prints MySensors, Enable debug prints to serial monitor
//  #define MY_DEBUG   // terminal en 115200baud
//  #define MY_DEBUG_LOCAL

//----------------- MySensors --------------------------

  #define MY_NODE_ID 35                  /*Node en ID static*/
//  #define MY_TRANSPORT_WAIT_READY_MS 3000  //Timeout (ms) pour mis en Com.(0 pour aucun)
/* nécessaire lorsque pas connecté à la passerelle, pour des test*/

//.......... RS485 ..........................

  #define MY_RS485  // Enable RS485 transport layer
  #define MY_RS485_DE_PIN 3  // Define this to enables Cmd DE-pin management on defined pin
  #define MY_RS485_BAUD_RATE 9600 // Set RS485 baud rate to use (9600 mode standard) 
  #define MY_RS485_HWSERIAL Serial3 // choix du port RX-Tx sur Mega2560

// ------------teleinfo -------------

  #define VERSION   "v2.0.1"
  #define DELAY_PREFIX  50
  #define DELAY_SEND    500
  #define DELAY_PRESENTATION  100 // tempo du Wait

//------------- MyS-----------------
//#define MY_LEDS_BLINKING_FEATURE          // Flash leds on rx/tx/err
//#define MY_DEFAULT_LED_BLINK_PERIOD 300   // Set blinking period
//  #define MY_DEFAULT_RX_LED_PIN  5  // Receive led pin
//  #define MY_DEFAULT_TX_LED_PIN  6  // the PCB, on board LED
//  #define MY_DEFAULT_ERR_LED_PIN 7  // Error led pin

//------------- Biblio ------------- 
		#include <MySensors.h>
		#include "LibTeleinfoLite.h"
    
  unsigned long lastTime_full = 0;
  unsigned long lastTime_tic = 0;
  unsigned long startTime; // Date démarrage 
  
  _Mode_e mode_tic;
  
  boolean flag_first = true;
  boolean flag_full_tic = true;
  boolean flag_tic = true;

  TInfo tinfo;

// --------- MySensors -----------

  #define char_AMPERE "A"
  #define char_VOLT "V"
  #define char_WATT "W"
  #define char_WATT_HEURE "Wh"
  #define char_VA "VA"
  #define char_KVA "kVA"
  #define char_VAR_HEURE "VArh"
  #define char_MIN "min"

//-------------  Mode Historique  ------------------------
///----- valeur =-1 pour la remonter sur le Controller (le 1er remonter des points "ID" )

//  const char char_ADCO[] PROGMEM = "ADCO";  			long valADCO=-1;  long svalADCO=-1;         //ID
  const char char_OPTARIF[] PROGMEM = "OPTARIF";	char* valOPTARIF;  char* svalOPTARIF;   //ID
  const char char_ISOUSC[] PROGMEM = "ISOUSC";		long valISOUSC=-1;  long svalISOUSC=-1;       //ID
  const char char_HCHC[] PROGMEM = "HCHC";				long valHCHC=-1;  long svalHCHC=-1;           //ID
  const char char_HCHP[] PROGMEM = "HCHP";				long valHCHP=-1;  long svalHCHP=-1;           //ID    
  const char char_PTEC[] PROGMEM = "PTEC";				char* valPTEC;  char* svalPTEC;         //ID
  const char char_IINST[] PROGMEM = "IINST";			long valIINST=-1;  long svalIINST=-1;         //ID
  const char char_IMAX[] PROGMEM = "IMAX";				long valIMAX=-1;  long svalIMAX=-1;
  const char char_PAPP[] PROGMEM = "PAPP";				long valPAPP=-1;  long svalPAPP=-1;
  const char char_HHPHC[] PROGMEM = "HHPHC";			char* valHHPHC;  char* svalHHPHC;
  const char char_MOTDETAT[] PROGMEM = "MOTDETAT"; char* valMOTDETAT;  char* svalMOTDETAT;

    const char char_START[] PROGMEM = "START";
  
  //en partie  erraser .... mode Mono Historique 

//--------- Define----------- 11 valeurs remonter du linky (monoHistorique)--------------

//#define CHILD_ID_ADCO 1         // N°d'identification du compteur (12 caractères)
#define CHILD_ID_OPTARIF 2      // Option tarifaire, type d'abonnement (4 car.)
#define CHILD_ID_ISOUSC 3       // Intensité souscrite (2 car. unité = ampères)
#define CHILD_ID_HCHC 5       //Index heures creuses si option (9car.unité=Wh)
#define CHILD_ID_HCHP 6       //Index heures pleines si option heures creuses (9car.unité=Wh)
#define CHILD_ID_PTEC 16      //Période tarifaire en cours (4car.)
#define CHILD_ID_IINST 18     //Intensité instantanée (3car. unité=ampères)
#define CHILD_ID_IMAX 20      //Intensité maximale (3car. unité=ampères)
#define CHILD_ID_PAPP 21      //Puissance apparente (5car. unité=Volt.ampères)
#define CHILD_ID_HHPHC 22     //Groupe horaire si option creuses ou tempo (1car.)
#define CHILD_ID_MOTDETAT 23  //Mot d'état (autocontrôle) (6car.)


  #define CHILD_ID_START    99            //etat du node
 
//--------------  Mode Standard  ---------------------
// errase for test ****
//----------------------------------------------------

	MyMessage msgTEXT( 0, V_TEXT);        // S_INFO
	MyMessage msgCURRENT( 0, V_CURRENT ); // S_MULTIMETER
	MyMessage msgVOLTAGE( 0, V_VOLTAGE ); // S_MULTIMETER
	MyMessage msgWATT( 0, V_WATT );       // S_POWER
	MyMessage msgKWH( 0, V_KWH );         // S_POWER
	MyMessage msgVA( 0, V_VA );           // S_POWER
	MyMessage msgPrefix( 0, V_UNIT_PREFIX );

// ---------------------- freeMemory  ----------------------------------- 
// errase 
// ----------------- freeMemory ---------------------------------- 
// errase 
// ----------- change_etat_led_teleinfo -------------------------- 
// errase

// ---------------- send_teleinfo_historique  ------------------------- 
// strcmp :Compare lexicographiquement deux chaînes d'octets.
//crée un message, puis avant de l'envoyer,définissez l' attribut du capteur,puis définissez la valeur et envoyez.
//exemple : send(msgPir.setSensor(Number).set(State?"1":"0"));

  void send_teleinfo_historique(char *name, char *value ) {
      
//------------- modif pour CDV ---------------------
    
//	if (strcmp_P(name, char_ADCO ) == 0) {
//			valADCO = atol(value); if (valADCO  != svalADCO) {
//      	send(msgTEXT.setSensor(CHILD_ID_ADCO).set(valADCO));}
//      		svalADCO = valADCO;  return;}

if (strcmp_P(name, char_OPTARIF ) == 0) {
      valOPTARIF = (value) ; if (valOPTARIF  != svalOPTARIF) {
        send(msgTEXT.setSensor(CHILD_ID_OPTARIF).set(valOPTARIF));}
          svalOPTARIF = valOPTARIF;  return;}
    		
	if (strcmp_P(name, char_ISOUSC ) == 0) {
			valISOUSC=atol(value); if (valISOUSC  != svalISOUSC) {
      	send(msgCURRENT.setSensor(CHILD_ID_ISOUSC).set(valISOUSC));}
      		svalISOUSC = valISOUSC;  return;}
      		
	if (strcmp_P(name, char_HCHC) == 0) {
			valHCHC=atol(value); if (valHCHC != svalHCHC) {
      	send(msgKWH.setSensor(CHILD_ID_HCHC).set(valHCHC));}
      		svalHCHC = valHCHC;  return;}

	if (strcmp_P(name, char_HCHP ) == 0) {
			valHCHP=atol(value); if (valHCHP  != svalHCHP) {
      	send(msgKWH.setSensor(CHILD_ID_HCHP).set(valHCHP));}
      		svalHCHP = valHCHP;  return;}

	if (strcmp_P(name, char_PTEC ) == 0) {
			valPTEC=(value); if (valPTEC  != svalPTEC) {
      	send(msgTEXT.setSensor(CHILD_ID_PTEC).set(valPTEC));}
      		svalPTEC = valPTEC;  return;}

	if (strcmp_P(name, char_IINST ) == 0) {
			valIINST=atol(value); if (valIINST  != svalIINST) {
      	send(msgCURRENT.setSensor(CHILD_ID_IINST).set(valIINST));}
      		svalIINST = valIINST;  return;}

	if (strcmp_P(name, char_IMAX ) == 0) {
			valIMAX=atol(value); if (valIMAX  != svalIMAX) {
      	send(msgCURRENT.setSensor(CHILD_ID_IMAX).set(valIMAX));}
      		svalIMAX = valIMAX;  return;}

	if (strcmp_P(name, char_PAPP) == 0) { 
      valPAPP=atol(value); if (valPAPP != svalPAPP ) {
        send(msgVA.setSensor(CHILD_ID_PAPP).set(valPAPP));}
        	svalPAPP = valPAPP; return; }

	if (strcmp_P(name, char_HHPHC ) == 0) {
			valHHPHC=(value); if (valHHPHC  != svalHHPHC) {
      	send(msgTEXT.setSensor(CHILD_ID_HHPHC).set(valHHPHC));}
      		svalHHPHC = valHHPHC;  return;}

	if (strcmp_P(name, char_MOTDETAT ) == 0) {
			valMOTDETAT=(value); if (valMOTDETAT  != svalMOTDETAT) {
      	send(msgTEXT.setSensor(CHILD_ID_MOTDETAT).set(valMOTDETAT));}
      		svalMOTDETAT = valMOTDETAT;  return;}

  //...... errase une partie ---- version Mono Historique seulement --------------------

    }
  
// -----------------  send_teleinfo_standard  ------------------------------ 
// errase 

// -------------- send_teleinfo  ---------------------------- 
  void send_teleinfo(char *etiq, char *val )  {
 // if (mode_tic == TINFO_MODE_HISTORIQUE)
   send_teleinfo_historique(etiq, val );
   }
     
// --------------  init_speed_TIC ---------------------------- 

  _Mode_e init_speed_TIC()  {
//  boolean flag_timeout = false;
//  boolean flag_found_speed = false;
//  uint32_t currentTime = millis();
  unsigned step = 0;
  
  _Mode_e mode;

   // Test en mode historique 
  // Recherche des éléments de début, milieu et fin de trame (0x0A, 0x20, 0x20, 0x0D)
  Serial1.begin(1200); // mode historique
//  while (!flag_timeout && !flag_found_speed)
  {
    if (Serial1.available()>0) {
      char in = (char)Serial1.read() & 127;  // seulement sur 7 bits
      // début trame
        if (in == 0x0A) {
        step = 1;
      }
      // premier milieu de trame
        if (step == 1 && in == 0x20) {
        step = 2;
      }
      // deuxième milieu de trame
        if (step == 2 && in == 0x20) {
        step = 3;
      }
      // fin trame
        if (step == 3 && in == 0x0D) {
//        flag_found_speed = true;
        step = 0;
      }
    }
    
   // if (currentTime + 10000 <  millis()) flag_timeout = true; // 10s de timeout
   }
  }

// ------------------ UpdatedFrame -------------------
  void UpdatedFrame(ValueList *vl_tic)  {
    
    if (flag_full_tic) {
      send(msgTEXT.setSensor(CHILD_ID_START).set(startTime));
      flag_full_tic = false;  
      }
  }

//-------- This is called when a new time value was received ---------
// errase 

//--------------------------------------------------------------------
	void before() {
    mode_tic = init_speed_TIC();
    tinfo.init(mode_tic);
     }

//-------------------------- SETUP ------------------------------------------
	void setup()  {
    //affiche_freeMemory();
	}

//-------------------------- Presenstation MyS ------------------------------------------
	void presentation() {
  sendSketchInfo("Teleinfo", VERSION);  // Send the sketch version info sur gateway and Controller
  requestTime();	 // Récupere l'heure de la gateway du controller

    present( CHILD_ID_START, S_INFO, F("START"));
 
  if (mode_tic == TINFO_MODE_HISTORIQUE) {
//    present (CHILD_ID_ADCO, S_INFO, F("ADCO"));
    present (CHILD_ID_OPTARIF, S_INFO, F("OPTARIF"));
    present (CHILD_ID_ISOUSC, S_MULTIMETER, F("ISOUSC"));
    present (CHILD_ID_HCHC, S_POWER, F("HCHC"));
    wait(DELAY_PRESENTATION);
    present (CHILD_ID_HCHP, S_POWER, F("HCHP"));
    present (CHILD_ID_PTEC, S_INFO, F("PTEC"));
    present (CHILD_ID_IINST, S_MULTIMETER, F("IINST"));
    present (CHILD_ID_IMAX, S_MULTIMETER, F("IMAX"));
    wait(DELAY_PRESENTATION);
    present (CHILD_ID_PAPP, S_POWER, F("PAPP"));
    present (CHILD_ID_HHPHC, S_INFO, F("HHPHC"));
    present (CHILD_ID_MOTDETAT, S_INFO, F("MOTDETAT"));
    // ...mode HistoMono
  }
   
  }

//----------------------- LOOP ---------------------------------------------
	void loop()  {

    if (flag_first) {
	  // Send prefix au démarrage
        // errase for test
    send(msgTEXT.setSensor(CHILD_ID_START).set(startTime));
         
    flag_first= false;
    }
  if (Serial1.available()) tinfo.process(Serial1.read());
  	}

//----------------------------------------------------------------------------------------
// -------------------------------- Fin du Pgm --------------------------------------------	

Bonjour

une question sur un "atol" :slight_smile:

récup de la valeur dans un long , c'est le bon choix??

 long valISOUSC;
   valISOUSC=atol(value); 

dans la doc https://cplusplus.com/reference/cstdlib/atol/
l'exmple me donne un

 long int  xx;

??

et une autre, pourquoi je doit utilisé un atol pour que cella fonctionne dans cette ligne que je modifie.

 //if (strcmp_P(name, char_ADCO) == 0) {send(msgTEXT.setSensor(CHILD_ID_ADCO).set(value));return;}
	if (strcmp_P(name, char_ADCO ) == 0) {
			valADCO = atol(value); if (valADCO  != svalADCO) {
      	send(msgTEXT.setSensor(CHILD_ID_ADCO).set(valADCO));}
      		svalADCO = valADCO;  return;}

merci

Je ne suis pas super habitué au type Arduino, d'ailleurs une page pour mémo

mais un int c'est une valeur sur 16 bits, donc un long int une valeur sur 32 bits.
un long c'est aussi une valeur sur 32 bits.
Donc les deux types étant équivalent tout va bien :slight_smile:

Il manque la définition de msgTEXT, svalADCO, valADCO, il me semble ne pas les avoir vu dans ton code.
Mais en gros c'est un problème de type.
tu reçois une valeur sous forme de chaine(char *, je suppose?), mais pour envoyer ta valeur tu passe par la fonction d'un objet qui attend visiblement un entier (un long je suppose).

ADCO est l'identifiant du compteur, sur 12 chiffres, par exemple 524563565245
La valeur maxi d'un unsigned long étant 4294967295, ça déborde quand même.

Mais ADCO étant un identifiant, et aucune opération numérique n'étant requise sur celui-ci, on peut se demander quel est l'intérêt de le transformer en nombre. Autant le conserver sous forme de chaîne.

quelque info ...
" Structure d’un message MySensors (API)
MySensors communique avec de petits messages de 32 bytes (la taille maximale des messages envoyés par une puce nRF24L01). L’entête (header) du message d’une taille de 7 bytes est constitué ainsi : la suite ... lien --->

@terwal

"int c'est une valeur sur 16 bits, donc un long int une valeur sur 32 bits" Oui , donc l'utilité d'écrire "long int " pour le programme est inutile !
et pour la définition , oui c'est bien dans le code (au début)

tu dit " la fonction d'un objet qui attend visiblement un entier (un long je suppose)" oui , le Protocol mysensors.

@hbachetti

"La valeur maxi d'un unsigned long étant 4294967295, ça déborde quand même." Aie je risque les surprises, mais les valeurs lue sont correctes.

" quel est l'intérêt de le transformer en nombre. " ... bah
le truc que j'ai voulue faire c'est modifier le [ .set(value)] en [ valADCO = (value); ] .et il faut un atol pour que cella fonctionne.

Mon Problème c'est que j'aime récupéré les veilles choses pour les remettre au kleen ... voitures ... radio ... maison , lave linge ... etc
La je suis tomber sur un croquis/Lib qui à passer les ages (farouches) , et me suis dit tiens qu'il est beau :frowning:

merci les mecs ,

la en fin de la doc. "Vous pouvez manipuler vos messages sortants et entrants avec les getter/setters suivants." ..... mais rien de parlant pour moi.
l'API de MyS https://www.mysensors.org/download/sensor_api_20

https://learn.sparkfun.com/tutorials/data-types-in-arduino/all

atol() ne suffira pas, par contre atoll() avec une valeur retournée en long long (64 bits), si cette fonction existe sur ARDUINO.

@hbachetti
suis à ta remarque, mon château de cartes c écroulé.
j'ai fait un test avec code simple pour la lecture des trames

-> ADCO xxxxxxxxxxxx B (12x) et en plus un espace et une lettre .

sur mon Controller, la valeur remonter xxxxxxxxx (9x) et des valeurs sans raport avec la réalité .

je penche pour reprendre une autre direction, sois le travail de MicroQuettas
et l'adapter pour MySensors

ou la lib de sremy91 https://github.com/sremy91/LibTeleinfo

... une remarque !? .. même désagréable je prend :slight_smile:

Re_Edit
oui la version de MicroQuettas , je test avec MyS,
Puis. app. = 650 VA
Index HC = 6206623 Wh
Index HP = 7441646 Wh
Tarif en cours : heures pleines
oui 4 valeurs , (15%) de l'espace de stockage de programmes sans MyS , 40% avec MyS sur un UNO

J'avoue que je n'ai pas tout compris à ce que tu as dit.
Au final ça marche ?

Ces deux librairies ne tiennent pas compte de ADCO.

Dans ton code tu déclares un objet message avec l'attribut V_TEXT, donc tu dois lui envoyer un texte, et non pas un long.

Merci @hbachetti

la partie ADCO est désactiver (plus utilisé)

et pour "atol" les : valPTEC= atol (value); c'est résolu

revue la définition par un char* valPTEC; et c fonctionnelle,
modif en valPTEC= (value);
( mouais .. chaînes de caractères et pointeurs :frowning: )

donc cette version roule ( mis de coter )
recopie d'écran

je repart avec le code , la version de MicroQuettas , vraiment leger , et plus obliger d'utiliser un
Mega2560 ( la gestion des ports série) ..... avec un Nano-UNO c'est plus léger.

18h30 : sketch mis à Jour