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