Messages : 78 
    Sujets : 8
	 Inscription : Jul 2024
	
	 
 
	
	
		Bonjour, 
Tout est dans le titre: y aurait-il moyen de remonter l'état du contact du linky en MQTT pour une exploitation dans HomeAssistant ?
     
A+
 
Cyril
	  
	
	
	
		
	 
 
 
	
	
	
		
	Messages : 183 
    Sujets : 0
	 Inscription : Jun 2024
	
	 
 
	
		
		
		22-04-2025, 03:32 PM 
(Modification du message : 22-04-2025, 06:45 PM par michy.)
		
	 
	
		 (22-04-2025, 02:35 PM)SC2024 a écrit :  Bonjour, 
Tout est dans le titre: y aurait-il moyen de remonter l'état du contact du linky en MQTT pour une exploitation dans HomeAssistant ? 
 
 
 
A+ 
 
Cyril 
Bonjour,
 
  le bit 0 du registre STGE ?
 
Avec le contenu de STGE tiré des trames du Linky en mode standard (8 caractères) , [Attention André utilise un variable appelé STGE mais elle est utilisée pour représenter les couleurs tempo]
 
alors l'état du contact C1-C1 est donné par :
 
ContactC1C2 =  (strtoul(STGE.c_str(),NULL,16)) & 0b1;  // converti la chaine d'un texte hexa en numérique et ne traite que le bit le plus a droite (le bit 0)
 
après, il faut faire les modif pour diffuser l'info par MQTT
	  
	
	
Merci André    , 
Routeur V15.11 (since V2.01) / 1xESP32 (IP fixe) / Source UxI / 5 actions 
Panneaux 1680Wc 
1 Triac : ECS 2000W 
1 SSR (multi) : ECS 1800W 
1 SSR (On-Off) : Circulateur plancher chauffant eau 50W 
1 SSR (multi) : circuit d'eau 1500W 
1 SSR (multi) : Ultime 2000W
  
	
		
	 
 
 
	
	
	
		
	Messages : 78 
    Sujets : 8
	 Inscription : Jul 2024
	
	 
 
	
	
		 (22-04-2025, 03:32 PM)michy a écrit :   (22-04-2025, 02:35 PM)SC2024 a écrit :  Bonjour, 
Tout est dans le titre: y aurait-il moyen de remonter l'état du contact du linky en MQTT pour une exploitation dans HomeAssistant ? 
 
 
 
A+ 
 
Cyril  
Bonjour, 
 
  le bit 0 du registre STGE ? 
 
Avec le contenu de STGE tiré des trames du Linky en mode standard (8 caractères) , [Attention André utilise un variable appelé STGE mais elle est utilisée pour représenter les couleurs tempo] 
 
alors l'état du contact C1-C1 est donné par : 
 
ContactC1C2 =  (strtoul(STGE.c_str(),NULL,16)) & 0b1;  // converti la chaine d'un texte hexa en numérique et ne traite que le bit le plus a droite (le bit 0) 
 
après, il faut faire les modif pour diffuser l'info par MQTT Merci pour ton retour, mais j'avoue que mes notions en programmations sont très limitées, quand je vois le travail à André je n'ose pas imaginé le temps passé ni les connaissances nécessaires pour arriver à un tel résultat, 
Dans un premier temps j'ai cherché STGE dans le programme, j'en retrouve un paquet dans Source_linky.ino, 
Est-ce que je cherche au bon endroit ?
     
	 
	
	
	
		
	 
 
 
	
	
	
		
	Messages : 183 
    Sujets : 0
	 Inscription : Jun 2024
	
	 
 
	
	
		Bonjour, 
C’est bien là,
 
1) On commence par déclarer des constantes pour lire facilement le code et une variable globale qui sera maintenu à jour à chaque lecture d’une trame Linky 
Dans Solar_Router_Vxxxx.ino
 Code : String LTARF = "";           // Option tarifaire RTE 
#define FERME 0              // Ajout pour remonter contact sec Linky 
#define OUVERT 1             // Ajout pour remonter contact sec Linky  
byte contactC1C2 = OUVERT;   // Ajout pour remonter contact sec Linky  
String STGE = "";            // Status Tempo uniquement RTE 
String NGTF = "";            // Calendrier tarifaire
 
2) On actualise la variable a chaque lecture 
Dans Source_Linky.ino
 Code : STGE = val;  //Status 
STGE.trim(); 
contactC1C2 = (strtoul(STGE.c_str(),NULL,16)) & 0b1;  // Ajout pour remonter contact sec Linky  // avant que STGE ne soit raccourci pour ne prendre que les couleurs tempo 
STGE = STGE.substring(1, 2);  //Tempo lendemain et jour sur 1 octet
 
3) On prepare MQTT  [A confirmer lors d'essais] 
Dans MQTT.ino
 Code :   DeviceToDiscover("EASF10", "EASF10", "Wh", "energy", "0"); 
  DeviceBin2Discover("contactC1C2 ", "Status contact C1-C2");   // Ajout pour remonter contact sec Linky  
}
  
4) On envoi    [A confirmer lors d'essais]  
Dans MQTT.ino
 Code : if (Source == "Linky") { 
  sprintf(value, "%s,\"NGTF\":\"%s\"", value, NGTF.c_str()); 
  sprintf(value, "%s,\"EASF01\":%d, \"EASF02\":%d, \"EASF03\":%d, \"EASF04\":%d, \"EASF05\":%d, \"EASF06\":%d,\"EASF07\":%d, \"EASF08\":%d, \"EASF09\":%d, \"EASF10\":%d", value, EASF01, EASF02, EASF03, EASF04, EASF05, EASF06, EASF07, EASF08, EASF09, EASF10); 
  sprintf(value, "%s,\"contactC1C2\":\"%d\"", value, contactC1C2);   // Ajout pour remonter contact sec Linky  
}
  
sous réserve d'essai
	  
	
	
Merci André    , 
Routeur V15.11 (since V2.01) / 1xESP32 (IP fixe) / Source UxI / 5 actions 
Panneaux 1680Wc 
1 Triac : ECS 2000W 
1 SSR (multi) : ECS 1800W 
1 SSR (On-Off) : Circulateur plancher chauffant eau 50W 
1 SSR (multi) : circuit d'eau 1500W 
1 SSR (multi) : Ultime 2000W
  
	
		
	 
 
 
	
	
	
		
	Messages : 78 
    Sujets : 8
	 Inscription : Jul 2024
	
	 
 
	
	
		 (23-04-2025, 09:53 AM)michy a écrit :  Bonjour, 
 
C’est bien là, 
 
1) On commence par déclarer des constantes pour lire facilement le code et une variable globale qui sera maintenu à jour à chaque lecture d’une trame Linky 
Dans Solar_Router_Vxxxx.ino 
Code : String LTARF = "";           // Option tarifaire RTE 
#define FERME 0              // Ajout pour remonter contact sec Linky 
#define OUVERT 1             // Ajout pour remonter contact sec Linky  
byte contactC1C2 = OUVERT;   // Ajout pour remonter contact sec Linky  
String STGE = "";            // Status Tempo uniquement RTE 
String NGTF = "";            // Calendrier tarifaire
  
2) On actualise la variable a chaque lecture 
Dans Source_Linky.ino 
Code : STGE = val;  //Status 
STGE.trim(); 
contactC1C2 = (strtoul(STGE.c_str(),NULL,16)) & 0b1;  // Ajout pour remonter contact sec Linky  // avant que STGE ne soit raccourci pour ne prendre que les couleurs tempo 
STGE = STGE.substring(1, 2);  //Tempo lendemain et jour sur 1 octet
  
3) On prepare MQTT  [A confirmer lors d'essais] 
Dans MQTT.ino 
Code :   DeviceToDiscover("EASF10", "EASF10", "Wh", "energy", "0"); 
  DeviceBin2Discover("contactC1C2 ", "Status contact C1-C2");   // Ajout pour remonter contact sec Linky  
}
  
 
4) On envoi    [A confirmer lors d'essais]  
Dans MQTT.ino 
Code : if (Source == "Linky") { 
  sprintf(value, "%s,\"NGTF\":\"%s\"", value, NGTF.c_str()); 
  sprintf(value, "%s,\"EASF01\":%d, \"EASF02\":%d, \"EASF03\":%d, \"EASF04\":%d, \"EASF05\":%d, \"EASF06\":%d,\"EASF07\":%d, \"EASF08\":%d, \"EASF09\":%d, \"EASF10\":%d", value, EASF01, EASF02, EASF03, EASF04, EASF05, EASF06, EASF07, EASF08, EASF09, EASF10); 
  sprintf(value, "%s,\"contactC1C2\":\"%d\"", value, contactC1C2);   // Ajout pour remonter contact sec Linky  
}
  
 
sous réserve d'essai Merci pour ton retour,  
J'ai rajouté (j'espère sans erreur) les lignes que tu suggères),
     
Apparemment les données contactC1C2 ne remonte pas malgré reboot de MQTT et HA,
     
Qu'est-ce que je tester d'autre ?
  
  Solar_Router_V14_22_contact_linky.zip (Taille : 369.25 Ko / Téléchargements : 4)
	  
	
	
	
		
	 
 
 
	
	
	
		
	Messages : 183 
    Sujets : 0
	 Inscription : Jun 2024
	
	 
 
	
		
		
		24-04-2025, 11:14 AM 
(Modification du message : 24-04-2025, 01:16 PM par michy.)
		
	 
	
		Bonjour, 
  J'ai un doute sur le retour d'un état binaire entre guillemet
 
    sprintf(value, "%s,\"contactC1C2\": \"%d \"", value, contactC1C2);  // Ajout pour remonter contact sec Linky
 
 a remplacer par :
 Code :     sprintf(value, "%s,\"contactC1C2\":%d", value, contactC1C2);  // Ajout pour remonter contact sec Linky 
    Serial.printf("Etat contact sec Linky : %d\n", contactC1C2);  // Ajout pour remonter contact sec Linky => temporaire pour vérifier qu'on a bien l'information dans le moniteur série
  
+ faire un retour de ce qui apparait dans le moniteur série
	  
	
	
Merci André    , 
Routeur V15.11 (since V2.01) / 1xESP32 (IP fixe) / Source UxI / 5 actions 
Panneaux 1680Wc 
1 Triac : ECS 2000W 
1 SSR (multi) : ECS 1800W 
1 SSR (On-Off) : Circulateur plancher chauffant eau 50W 
1 SSR (multi) : circuit d'eau 1500W 
1 SSR (multi) : Ultime 2000W
  
	
		
	 
 
 
	
	
	
		
	Messages : 78 
    Sujets : 8
	 Inscription : Jul 2024
	
	 
 
	
	
		 (24-04-2025, 11:14 AM)michy a écrit :  Bonjour, 
 
  J'ai un doute sur le retour d'un état binaire entre guillemet 
 
    sprintf(value, "%s,\"contactC1C2\":\"%d\"", value, contactC1C2);  // Ajout pour remonter contact sec Linky 
 
 a remplacer par : 
 
Code :     sprintf(value, "%s,\"contactC1C2\":%d", value, contactC1C2);  // Ajout pour remonter contact sec Linky 
    Serial.printf("Etat contact sec Linky : %d\n", contactC1C2);  // Ajout pour remonter contact sec Linky => temporaire pour vérifier qu'on a bien l'information dans le moniteur série
  
 
 
+ faire un retour de ce qui apparait dans le moniteur série 
Merci, 
Je vais mettre un peux de temps il faut que je trouve une rallonge USB de 5 m (je n'ai pas de PC portable) pour brancher l'ESP en service, 
J'avais essayé en rallongeant les fils de la TIC mais sans succès a cause de la distance,
 
Par contre j'ai remarqué que dans MQTT.ino ligne 318 et 319 on retrouve les codes 1 et 2 qui devraient correspondre au contact, est-ce que tu penses que c'est exploitable ?
     
	 
	
	
	
		
	 
 
 
	
	
	
		
	Messages : 183 
    Sujets : 0
	 Inscription : Jun 2024
	
	 
 
	
		
		
		25-04-2025, 11:33 AM 
(Modification du message : 25-04-2025, 12:06 PM par michy.)
		
	 
	
		Bonjour, 
 
  de ce que je peux voir sur la capture des info MQTT, tu es en tempo 
 
  on peut faire un contournement , plutôt que récupérer l'état du contact, on peut se baser sur l'heure : les horaires de basculement tempo HC et HP sont fixe (HP de 06h00 à 22h00 et HC de 22h00 à 06h00)  [jusqu’à ce que ENEDIS décide de modifier la règle ...] le contact doit suivre ce rythme a quelques minutes prêt 
 
  Pour les lignes 318/319 ... de MQTT.ino, c'est la ligne "Code Tarifaire" qui remonte en MQTT , les codes 1 et 2 c'est pour la tarifications heures creuse/heures pleine, ça ne donnera rien avec un contrat tempo 
En allant un peu plus loin, les codes 11,13,15 correspondent aux heures creuse TEMPO et les codes 12,14,16 aux heures pleine tempo 
 
Sauf que, si la case a cocher pour obtenir la couleur tempo depuis le site RTE est actif, c'est les codes 17, 18, 19 qui remplace l'info provenant du linky ... et la on perd l'info HC HP 
 
Faire un essai en décochant la case "Couleur tempo RTE" pour voir si l'info Code Tarifaire retombe bien entre dans la plage entre 11 et 16
	 
	
	
Merci André    , 
Routeur V15.11 (since V2.01) / 1xESP32 (IP fixe) / Source UxI / 5 actions 
Panneaux 1680Wc 
1 Triac : ECS 2000W 
1 SSR (multi) : ECS 1800W 
1 SSR (On-Off) : Circulateur plancher chauffant eau 50W 
1 SSR (multi) : circuit d'eau 1500W 
1 SSR (multi) : Ultime 2000W
  
	
		
	 
 
 
	
	
	
		
	Messages : 78 
    Sujets : 8
	 Inscription : Jul 2024
	
	 
 
	
	
		 (25-04-2025, 11:33 AM)michy a écrit :  Bonjour, 
 
  de ce que je peux voir sur la capture des info MQTT, tu es en tempo 
 
  on peut faire un contournement , plutôt que récupérer l'état du contact, on peut se baser sur l'heure : les horaires de basculement tempo HC et HP sont fixe (HP de 06h00 à 22h00 et HC de 22h00 à 06h00)  [jusqu’à ce que ENEDIS décide de modifier la règle ...] le contact doit suivre ce rythme a quelques minutes prêt 
 
  Pour les lignes 318/319 ... de MQTT.ino, c'est la ligne "Code Tarifaire" qui remonte en MQTT , les codes 1 et 2 c'est pour la tarifications heures creuse/heures pleine, ça ne donnera rien avec un contrat tempo 
En allant un peu plus loin, les codes 11,13,15 correspondent aux heures creuse TEMPO et les codes 12,14,16 aux heures pleine tempo 
 
Sauf que, si la case a cocher pour obtenir la couleur tempo depuis le site RTE est actif, c'est les codes 17, 18, 19 qui remplace l'info provenant du linky ... et la on perd l'info HC HP 
 
Faire un essai en décochant la case "Couleur tempo RTE" pour voir si l'info Code Tarifaire retombe bien entre dans la plage entre 11 et 16 Bonjour, 
Merci pour toutes ces explications,  
Vu mon niveau en programmation j'ignorais le fonctionnement des lignes 316 à 329, 
Voici ce que ça donne avec la couleur tempo cochée:
     
Et décochée:
     
Dans ce cas le HC/HP est exploitable mais comme tu le précises c'est ENEDIS qui fixe les règles, 
 
Bon week-end,
	  
	
	
	
		
	 
 
 
	
	
	
		
	Messages : 183 
    Sujets : 0
	 Inscription : Jun 2024
	
	 
 
	
	
		Bonjour, 
  avec la capture "couleur depuis RTE" décoché, il y a une incohérence, le champ "Option Tarifaire" cerclé en rouge donne HP BLEU mais le champ "Code Tarifaire" est encore a 0 (ça devrait être 12)
 
  Je me demande s'il n'y aurait pas 2 espaces entre HP et BLEU  "HP  BLEU" de la même manière qu'entre HEURE et CREUSE ou HEURE et PLEINE
 
Si possible de me faire une capture texte (pas une capture d'écran) du cadre "Données brutes Linky" [faut aller vite, ça rafraichi toutes les 2 secondes ..]
  
 
prêt pour un autre essai ? 
 
je ne sais pas comment HA gère le contact binaire, donc on va faire autrement
 
On ajoute une ligne   DeviceToDiscoverWithoutUnit, (j'ai légèrement modifier le nom)
 Code :     DeviceToDiscover("EASF10", "EASF10", "Wh", "energy", "0"); 
    //DeviceBin2Discover("contactC1C2 ", "Status contact C1-C2");   // Ajout pour remonter contact sec Linky 
    DeviceToDiscoverWithoutUnit("contact_C1C2", "contact_C1C2", "0");   // Ajout pour remonter contact sec Linky 
  }
  
On test le cas double espaces (6 nouvelles lignes) et on remonte le nouveau topic  contact_C1C2
 Code :   if (Source == "Linky" || TempoRTEon == 1) { 
    int code = 0; 
    if (LTARF.indexOf("HEURE  CREUSE") >= 0) code = 1;  // Code Linky 
    if (LTARF.indexOf("HEURE  PLEINE") >= 0) code = 2; 
    if (LTARF.indexOf("HC BLEU") >= 0) code = 11; 
    if (LTARF.indexOf("HC  BLEU") >= 0) code = 11;    // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("HP BLEU") >= 0) code = 12; 
    if (LTARF.indexOf("HP  BLEU") >= 0) code = 12;    // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("HC BLANC") >= 0) code = 13; 
    if (LTARF.indexOf("HC  BLANC") >= 0) code = 13;   // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("HP BLANC") >= 0) code = 14; 
    if (LTARF.indexOf("HP  BLANC") >= 0) code = 14;   // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("HC ROUGE") >= 0) code = 15; 
    if (LTARF.indexOf("HC  ROUGE") >= 0) code = 15;   // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("HP ROUGE") >= 0) code = 16; 
    if (LTARF.indexOf("HP  ROUGE") >= 0) code = 16;   // Ajout pour remonter contact sec Linky code avec 2 espaces 
    if (LTARF.indexOf("TEMPO_BLEU") >= 0) code = 17;  // Code RTE 
    if (LTARF.indexOf("TEMPO_BLANC") >= 0) code = 18; 
    if (LTARF.indexOf("TEMPO_ROUGE") >= 0) code = 19; 
    sprintf(value, "%s,\"LTARF\":\"%s\", \"Code_Tarifaire\":%d", value, LTARF.c_str(), code); 
  } 
  if (Source == "Linky") { 
    sprintf(value, "%s,\"NGTF\":\"%s\"", value, NGTF.c_str()); 
    sprintf(value, "%s,\"EASF01\":%d, \"EASF02\":%d, \"EASF03\":%d, \"EASF04\":%d, \"EASF05\":%d, \"EASF06\":%d,\"EASF07\":%d, \"EASF08\":%d, \"EASF09\":%d, \"EASF10\":%d", value, EASF01, EASF02, EASF03, EASF04, EASF05, EASF06, EASF07, EASF08, EASF09, EASF10); 
    //sprintf(value, "%s,\"contactC1C2\":%d", value, contactC1C2);     // Ajout pour remonter contact sec Linky 
    sprintf(value, "%s,\"contact_C1C2\":%d", value, contactC1C2);    // Ajout pour remonter contact sec Linky 
  }
 
par retour, l'extrait texte données brutes et après mise a jour du firmware, les 2 captures d'écran avec et sans la coche tempo depuis RTE
 
merci,
	  
	
	
Merci André    , 
Routeur V15.11 (since V2.01) / 1xESP32 (IP fixe) / Source UxI / 5 actions 
Panneaux 1680Wc 
1 Triac : ECS 2000W 
1 SSR (multi) : ECS 1800W 
1 SSR (On-Off) : Circulateur plancher chauffant eau 50W 
1 SSR (multi) : circuit d'eau 1500W 
1 SSR (multi) : Ultime 2000W
  
	
		
	 
 
 
			 
		 |