Messages : 62
Sujets : 7
Inscription : Jul 2024
Réputation :
9
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 : 77
Sujets : 0
Inscription : Jun 2024
Réputation :
4
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 V14.21 (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 : 62
Sujets : 7
Inscription : Jul 2024
Réputation :
9
(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 : 77
Sujets : 0
Inscription : Jun 2024
Réputation :
4
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 V14.21 (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 : 62
Sujets : 7
Inscription : Jul 2024
Réputation :
9
(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 : 2)
Messages : 77
Sujets : 0
Inscription : Jun 2024
Réputation :
4
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 V14.21 (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 : 62
Sujets : 7
Inscription : Jul 2024
Réputation :
9
(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 : 77
Sujets : 0
Inscription : Jun 2024
Réputation :
4
Hier, 11:33 AM
(Modification du message : Hier, 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 V14.21 (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 : 62
Sujets : 7
Inscription : Jul 2024
Réputation :
9
(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,
|