F1ATB forum
Remonter état du contact du linky ? - Version imprimable

+- F1ATB forum (https://f1atb.fr/forum_f1atb)
+-- Forum : Forum de F1ATB (https://f1atb.fr/forum_f1atb/forum-3.html)
+--- Forum : Domotique (https://f1atb.fr/forum_f1atb/forum-6.html)
+--- Sujet : Remonter état du contact du linky ? (/thread-1379.html)



Remonter état du contact du linky ? - SC2024 - 22-04-2025

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


RE: Remonter état du contact du linky ? - michy - 22-04-2025

(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


RE: Remonter état du contact du linky ? - SC2024 - 22-04-2025

(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 ?
   


RE: Remonter état du contact du linky ? - michy - 23-04-2025

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


RE: Remonter état du contact du linky ? - SC2024 - 23-04-2025

(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 ?
.zip   Solar_Router_V14_22_contact_linky.zip (Taille : 369.25 Ko / Téléchargements : 3)


RE: Remonter état du contact du linky ? - michy - 24-04-2025

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


RE: Remonter état du contact du linky ? - SC2024 - 25-04-2025

(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 ?
   


RE: Remonter état du contact du linky ? - michy - 25-04-2025

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


RE: Remonter état du contact du linky ? - SC2024 - 26-04-2025

(Hier, 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,


RE: Remonter état du contact du linky ? - michy - 26-04-2025

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,