Maîtrisez votre consommation électrique avec une solution DIY
Une réalisation DIY !
Les compteurs Linky, et les anciens compteurs électronique sont équipés d’une sortie de données appelée TIC (Télé-Information Client) qui peut être utilisée pour récupérer les informations de consommation d’électrique et traiter par soi-même ces informations.
Il s’avère que nous ne sommes pas contraints de dépendre des services en ligne pour accéder en temps réel à nos données de compteur ! Depuis l’avènement des compteurs électroniques d’électricité (depuis 1985-1990), ces informations sont directement accessibles en ajoutant un module supplémentaire à notre compteur. Cette option était disponible avant l’installation des compteurs Linky ; J’ai mis au point ce projet personnel sur un compteur Sagem.
C’est une réalisation DIY. Je n’ai pas trouvé dans le commerce ce genre de dispositifs qui ne dépendent pas d’Internet. Et, dans tous mes projets, j’attache une importance particulière à minimiser ma dépendance constante au réseau internet.
Depuis quelques années, je gère les données de mon compteur en local en utilisant un Raspberry Pi associé à un Wemos R1D1. La chance a été de mon côté avec l’arrivée du compteur Linky, car aucune mise à jour de mon système n’a été nécessaire. Il est même possible de coupler ses informations de production solaire (je l’ai fait avec un onduleur hybride) avec celles du réseaux national et afficher de superbes graphiques de nos besoins, de notre production, et de notre consommation …
Pour concrétiser ce projet, j’ai utilisé les éléments suivants :
Pour traiter les informations :
- Raspberry Pi 3B+ (20 € d’occasion) (avec installation d’un serveur Web Apache, d’une base de données MySQL, et développement d’une application PHP pour le traitement des données du compteur et faire une interface utilisateur -> Chiffres, puissance instantanée, consommation, périodes (heures, jours, semaines, mois, années) , graphiques, coûts, comparaisons … Tout est possible 🙂 ). Lien : installer un serveur web sur Raspberry pi 3B.
- Un Disque dur externe SSD (20-30 € 120 GO)
Pour collecter les informations en sortie des bornes télé infos du compteur électrique :
- Wemos D1R1 (9€)
- Un optocoupleur SFH620a-2 (< 1€), deux résistances, une diode, un peu de fil, une plaque de prototypage. (<5€)
Si vous possédez déjà Home Assistant, ce petit module pour suivre en temps réel votre consommation électrique vous coûtera environ 10€. Le projet est largement adaptable sur un ESP8266.
Il est envisageable donc d’utiliser un ESP8266 pour récupérer les données du compteur. Je prévois d’ajuster mon projet pour le rendre compatible avec l’ESP8266, ce qui simplifierait la conception d’un boîtier pouvant se fixer directement sur le compteur (la carte est bien plus petite), éliminant ainsi le besoin de connexions filaires. Les dimensions de l’espace disponible sur le compteur sont précisées par Enedis 🙂 La modélisation sur Fusion 360 ne devrait pas être trop complexe.
Le Raspberry Pi n’est pas utile si vous utilisez déjà Home Assistant.
Des boitiers :
- Des petites impressions 3d pour protéger l’ensemble (créés sous fusion 360 et imprimés sur une ender 3). Avant d’avoir mon imprimante, je m’étais amusé à construire des boites avec des légos lol Ca fonctionne aussi, c’est moins esthétique. (20€/kg de PLA; une boite 50g de PLA nécessaire)
Montage du circuit, prototypage avant soudure sur PCB :
Le circuit est connecté aux bornes I1 et I2 (Les fils gris et violet), indépendamment de leur position. Le cache vert du compteur Linky peut être retiré très facilement en utilisant le clipse situé en haut et un autre en bas.
J’utilise ma LiveBox pour rendre l’application de suivi électrique accessible depuis n’importe quel appareil de mon réseau local et depuis l’extérieur de mon domicile (mes données sont évidement stockées à mon domicile et ne transitent jamais par internet). Il est également possible de se connecter directement au Raspberry Pi pour accéder à l’application. Un serveur web peut également être installé sur votre boîte domotique Home Assistant, offrant ainsi plusieurs options. Le choix de la configuration reste personnel. Si votre compteur est éloigné de votre box ou de votre serveur Home Assistant, une solution économique consiste à créer un petit répéteur Wi-Fi avec un ESP (matériel entre 2 et 5€).
Pour que ce projet soit autonome (sans Home Assistant), j’ai téléversé mon code sur la carte Wemos à l’aide de l’application Arduino IDE. Ce code permet d’envoyer les informations du compteur à un serveur web (et de stoker les informations sur une base de données Mysql) sur le Raspberry Pi3 B+ en wifi.
#include <ESP8266WiFi.h> // Inclut la bibliothèque WiFi
#include <SoftwareSerial.h> // Inclut la bibliothèque SoftwareSerial pour la communication série logicielle
#define startTrame 0x02 // Définit le début d'une trame
#define endTrame 0x03 // Définit la fin d'une trame
#define startLigne 0x0A // Définit le début d'une ligne
#define endLigne 0x0D // Définit la fin d'une ligne
SoftwareSerial serialPort(D8, D9); // Initialise le port série logiciel avec les broches D8 et D9
String donneesPost; // Variable pour stocker les données à envoyer
String variablePost = "var1="; // Variable pour le préfixe des données POST
WiFiClient client; // Initialise un client WiFi
String reseauSansFil = "Mon Wifi"; // Nom du réseau WiFi
const char* motDePasse = "Mon Mot de Passe Wifi"; // Mot de passe du réseau WiFi
String serveur = "https://mon-url-local"; // URL du serveur
// const char* serveur = "192.168.1.100"; // Adresse IP du serveur, en commentaire car non utilisée ici
// Fonction pour obtenir les données de téléinformation
String obtenirTeleInfo() {
String teleInfo = "";
char caractere = 0;
while (caractere != startLigne) {
caractere = serialPort.read() & 0x7F;
}
while (caractere != endLigne) {
if (serialPort.available() > 0) {
caractere = serialPort.read() & 0x7F;
teleInfo += caractere;
}
}
return teleInfo;
}
// Fonction pour afficher les données de téléinformation
String afficherTeleInfo(String motCle, String unite, int longueur) {
int essai = 0;
// Nombre d'essais maximum, cf documentation ERDF
int maxEssais = 10;
String donnees = "";
String message = "";
while(donnees.substring(0,motCle.length()) != motCle && essai != maxEssais) {
donnees = obtenirTeleInfo();
essai++;
}
if (essai != maxEssais) {
message += donnees.substring((motCle.length() + 1),(longueur + (motCle.length() + 1)));
}
else {
message += "NA";
}
message += " ";
message += motCle;
message += " ";
return message;
}
// Fonction de configuration initiale
void setup() {
Serial.begin(115200); // Initialise la communication série à 115200 bauds
serialPort.begin(1200); // Initialise la communication série logicielle à 1200 bauds
WiFi.begin(reseauSansFil, motDePasse); // Démarre la connexion au réseau WiFi
// Attente de la connexion au réseau WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connecté à "+reseauSansFil);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// Fonction principale exécutée en boucle
void loop() {
// Construction des données de téléinformation
String donneesTeleInfo = afficherTeleInfo("ADCO","",12)+"_"+afficherTeleInfo("ISOUSC","A",2)+"_"+afficherTeleInfo("BASE","Wh",9)+"_"+afficherTeleInfo("HCHC","Wh",9)+"_"+afficherTeleInfo("HCHP","Wh",9)+"_"+afficherTeleInfo("PTEC","",4)+"_"+afficherTeleInfo("IINST","A",3)+"_"+afficherTeleInfo("IMAX","A",3)+"_"+afficherTeleInfo("PAPP","VA",5)+"_"+afficherTeleInfo("HHPHC","",1)+"__"+afficherTeleInfo("PMAX","W",5);
// Construction des données POST
donneesPost = variablePost + donneesTeleInfo;
// Connexion au serveur
if (client.connect(serveur, 443)) {
client.println("POST /enedis/post.php HTTP/1.1");
client.println("Host: "+serveur);
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(donneesPost.length());
client.println();
client.print(donneesPost);
}
// Déconnexion du serveur
if (client.connected()) {
client.stop();
}
// Attente avant de renvoyer les informations au serveur
delay(3000);
}
Une application PHP / Mysql sur le serveur web interprète les informations du compteur.
Par la suite, j’ai adapté le module à Home Assistant. Mes données ne transitent toujours pas par internet.
Code à téléverser sur le Wemos avec ESPHome, code YAML (pour HomeAssistant)
esphome:
name: esphome-web-78a0de
friendly_name: ESPHome TeleInfos
platform: ESP8266
board: esp01_1m
# Enable Home Assistant API
api:
encryption:
key: "Bzhqg6JpUtiG+FncGGiCRDzL7a+m2jB+qQlQ/TT+RUA="
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esphome-Web-78A0De"
password: "KXSDKnTLRlVe"
# Example configuration entry
#debug: # When enabled, logger must be at least debug (default) below.
# Logger configuration
logger:
baud_rate: 0 # disable logging via UART
level: INFO # INFO for less log
esp8266_store_log_strings_in_flash: False # recommanded for ESP8266
# ajout du composant uart pour la communication série avec la sortie TIC du compteur
# GPIO13 = Pin D7 sur Wemos D1
uart:
id: uart_bus
rx_pin: GPIO13
baud_rate: 1200
parity: EVEN
data_bits: 7
teleinfo:
id: esp_teleinfo
update_interval: 3s
historical_mode: true
binary_sensor:
- platform: status
id: teleinfo_status
name: "Teleinfo Status"
sensor:
- platform: wifi_signal
name: "Signal wifi"
update_interval: 60s
unit_of_measurement: dB
accuracy_decimals: 0
force_update: false
icon: mdi:wifi
- platform: uptime
id: uptime_seconds
name: "Uptime Sensor"
update_interval: 3s
unit_of_measurement: s
accuracy_decimals: 0
force_update: false
icon: mdi:timer
- platform: teleinfo
tag_name: "IINST"
name: "Intensité"
unit_of_measurement: "A"
icon: mdi:current-ac
- platform: teleinfo
tag_name: "PMAX"
name: "PMAX"
unit_of_measurement: "W"
icon: mdi:current-ac
- platform: teleinfo
tag_name: "ISOUSC"
name: "ISOUSC"
unit_of_measurement: "A"
icon: mdi:current-ac
- platform: teleinfo
tag_name: "IMAX"
name: "IMAX"
unit_of_measurement: "A"
icon: mdi:current-ac
- platform: teleinfo
tag_name: "PAPP"
name: "Puissance"
unit_of_measurement: "VA"
icon: mdi:flash
- platform: teleinfo
tag_name: "HCHC"
id: hchc
name: "Teleinfo index_hc_kwh"
unit_of_measurement: "kWh"
device_class: "energy"
state_class: "total_increasing"
accuracy_decimals: 3
filters:
- multiply: 0.001
icon: mdi:gauge
- platform: teleinfo
tag_name: "HCHP"
id: hchp
unit_of_measurement: "kWh"
device_class: "energy"
state_class: "total_increasing"
name: "Teleinfo index_hp_kwh"
accuracy_decimals: 3
filters:
- multiply: 0.001
icon: mdi:gauge
- platform: teleinfo
tag_name: "BASE"
id: base
unit_of_measurement: "kWh"
device_class: "energy"
state_class: "total_increasing"
name: "Teleinfo index_kwh"
accuracy_decimals: 3
filters:
- multiply: 0.001
icon: mdi:gauge
button:
- platform: restart
name: "Teleinfo Restart"
text_sensor:
- platform: teleinfo
tag_name: "PTEC"
name: "Tarif actuel"
icon: mdi:clock-time-nine-outline
- platform: template
name: Uptime
update_interval: 60s
icon: mdi:clock-start
lambda: |-
int seconds = (id(uptime_seconds).state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
if ( days ) {
return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
} else if ( hours ) {
return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
} else if ( minutes ) {
return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
} else {
return { (String(seconds) +"s").c_str() };
}
L’avantage de Home Assistant est la possibilité d’ajouter facilement des détails à ma consommation en utilisant d’autres objets connectés (à Home assistant). Ainsi, il devient très simple d’identifier les appareils énergivores dans ma maison, ou déterminer les efforts qui peuvent être fait pour réduire les dépenses en électricité.
On peut également, grâce à Home Assistant mettre en place des scénarios, tels que : « si la consommation instantanée approche trop de la puissance maximale fournie par mon forfait électrique, alors je peux automatiser un délestage pour éviter que mon compteur électrique ne saute et ne coupe l’alimentation de tout mon logement. »
On peut associer un ruban LED connecté pour refléter la situation de la consommation électrique 🙂 Rouge pour une consommation élevée, jaune pour une consommation modérée, vert lorsque tout va bien 🙂 Cela devient un jeu d’essayer d’être aussi souvent que possible dans la zone verte. Un jeu qui peut faire faire des économies sans avoir le nez en permanence sur notre consommation. Les possibilités sont nombreuses… Je suis alerté sur mon téléphone lorsque la consommation reste anormalement élevée pendant un certain laps de temps. Grâce à cela, j’ai pu éviter plusieurs problèmes, comme une pompe de relevage des eaux sales bloquée à pleine puissance, évitant ainsi un débordement et la casse de la pompe.
Pour en savoir plus sur le TIC, Enedis nous propose les documents ci-dessous :
DOCUMENT ENEDIS pour le linky : Sorties de télé-information client des appareils de comptage Linky utilisés en généralisation par Enedis
DOCUMENT ENEDIS pour les compteur Sagem : Sorties de télé-information client des appareils de comptage électroniques utilisés par Enedis
Anciennes captures d’écran de mon appli :
Home Assistant :
Bonjour Nicolas,
J’ai quelques panneaux solaires et un home assistant et j’aurais aimé récupéré les données TIC de mon Linky pour savoir quand je suis en surplus de production pour déclencher quelques prises connectés. J’ai tenté avec un compteur d’energie connecté en mettant la pince amperemetrique entre le tableau electrique et le linky mais je n’ai pas la difference entre la consommation et la production. Je vois bien la puissance descendre jusqu’à 0 quand les panneaux produisent pas elle passe en positif ensuite (j’imagine que le surplus est injecté dans le réseau). Je n’ai pas donc la possibilité de savoir quand je suis en consommation ou en production avec cette pince amperemetrique? Ma solution est donc de relevé les informations TIC et d’activer mes prises electriques quand le compteur Linky affichera 0. Je pensais avoir quelques notions en électronique et en code mais j’avoue que je suis un peu perdu avec votre solution qui est la plus abouti que j’ai pu glaner sur le net. Pouvez-vous modifier légèrement votre tuto pour mon cas ? Matos a acheter et code à injecté. Je pense que nous sommes beaucoup dans mon cas. Merci
Bonjour
La pince ampèremétrique mesure le courant circulant dans le câble. Cependant, elle ne peut pas faire la distinction entre l’énergie consommée par les appareils de la maison et l’énergie produite par les panneaux solaires et réinjectée dans le réseau.
Je comprends que vous souhaitez récupérer les données de télé-information client (TIC) de votre compteur Linky pour savoir quand vous êtes en surplus de production solaire et déclencher des prises connectées en conséquence.
Dans mon cas je l’ai fais sur un onduleur hybride en connectant directement un Raspberry à l’onduleur.
Sinon cela doit être possible en exploitant les infos de votre compteur.
Si la puissance fourni par votre fournisseur d’électricité est très basse voir à 0, c’est que vos panneaux fournissent la totalité de l’énergie. Il doit dans ce cas y avoir un surplus d’électricité.
Voici une petite aide, à vérifier dans le détail :
Voici une solution simplifiée pour atteindre cet objectif.
Matériel nécessaire :
ESP8266 (ou Wemos D1R1)
Optocoupleur SFH620a-2 (avec deux résistances, une diode, un peu de fil, et une plaque de prototypage)
Home Assistant (déjà installé chez vous)
Câbles pour les connexions
Étapes à suivre :
1. Préparation du matériel :
Optocoupleur : Connectez l’optocoupleur aux bornes télé info de votre compteur Linky (I1 et I2) comme décrit dans le guide initial.
ESP8266 : Branchez l’optocoupleur à votre ESP8266. Voici un schéma de base :
Bornes I1 et I2 du compteur -> Optocoupleur -> Pins GPIO de l’ESP8266 (D7 recommandé)
2. Configuration du code pour ESP8266 :
Utilisez le code suivant pour ESPHome. Ce code permet de récupérer les données TIC et de les envoyer à Home Assistant.
yaml
Copier le code
esphome:
name: esphome-teleinfo
platform: ESP8266
board: esp01_1m
wifi:
ssid: « Votre_SSID »
password: « Votre_Mot_de_Passe »
api:
ota:
logger:
baud_rate: 0
uart:
rx_pin: GPIO13
baud_rate: 1200
parity: EVEN
data_bits: 7
teleinfo:
update_interval: 3s
sensor:
– platform: teleinfo
tag_name: « BASE »
name: « Index Base »
unit_of_measurement: « kWh »
state_class: « total_increasing »
filters:
– multiply: 0.001
icon: mdi:gauge
– platform: teleinfo
tag_name: « HCHC »
name: « Heures Creuses »
unit_of_measurement: « kWh »
state_class: « total_increasing »
filters:
– multiply: 0.001
icon: mdi:gauge
– platform: teleinfo
tag_name: « HCHP »
name: « Heures Pleines »
unit_of_measurement: « kWh »
state_class: « total_increasing »
filters:
– multiply: 0.001
icon: mdi:gauge
– platform: teleinfo
tag_name: « PAPP »
name: « Puissance Apparente »
unit_of_measurement: « VA »
icon: mdi:flash
binary_sensor:
– platform: status
name: « Teleinfo Status »
3. Configuration de Home Assistant :
Ajoutez les capteurs de télé-information dans votre configuration Home Assistant.
Assurez-vous que ESPHome est configuré dans Home Assistant.
Ajoutez l’intégration ESPHome :
Allez dans Configuration > Intégrations > Ajouter une intégration.
Recherchez ESPHome et suivez les instructions pour ajouter votre ESP8266.
Créez des automatisations :
Créez une automatisation pour activer les prises connectées quand la puissance apparente (PAPP) est nulle ou en fonction d’autres paramètres.
Exemple d’automatisation :
yaml
Copier le code
automation:
– alias: « Activer prise en surplus de production »
trigger:
platform: numeric_state
entity_id: sensor.puissance_apparente
below: 10
action:
– service: switch.turn_on
entity_id: switch.votre_prise_connectee
Cette automatisation allumera la prise connectée lorsque la puissance apparente est inférieure à 10 VA, indiquant un possible surplus de production.
En suivant ces étapes, vous pourrez surveiller votre consommation électrique et activer des prises connectées en fonction de votre production solaire. Cette solution permet de gérer efficacement l’énergie produite par vos panneaux solaires et de réduire vos dépenses énergétiques.
Bonne chance avec votre projet !
Cordialement,
Nicolas
Merci Nicolas. J’ai réussi à injecter le code dans le Wemos avec ESP Home . Maintenant il me reste à le brancher à la sortie TIC du Linky mais je ne trouve pas la valeur des deux resistances que vous avez mis sur votre circuit. Je n’arrive pas à distinguer les couleurs.
Coté compteur R1 : 1KOhm (je crois)
R2 : 4.7 KOhm
Les spécifications d’ERDF (Électricité Réseau Distribution France) indiquent que la résistance parallèle pour tout appareil connecté à la sortie Téléinfo doit être entre 750 et 5000 ohms. Pour permettre la connexion de plusieurs récepteurs, il est conseillé de se rapprocher de la limite supérieure de 5000 ohms.
Dans la version 2015 la valeur cible a été révisée à 2000 ohms. Tant que nous restons au-dessus de 750 ohms, cela ne pose pas de problème majeur. Une résistance plus élevée permet de brancher davantage d’appareils en parallèle tout en maintenant un signal correct.
Mon choix final : une résistance R1 de 1K ohm garanti un signal propre et puissant.
R2 maintient la sortie à un niveau stable lorsqu’il n’y a pas de signal actif.
Bonjour Nicolas, Merci pour votre réponse. J’ai bien le nouveau peripherique ESP Home qui a été reconnu par Home Assistant mais la seule info qui remonte est la valeur Uptime. Les autres cases affichent la mention « Inconnu ». J’ai bien installer la resistance 1KOhm coté compteur (celle que l’on voit en bas de votre photo près des cables violet et noir qui vont au tic et une resistance de 4.7KOhm entre le 3.3V et la led verte (qui reste eteinte).
Bonjour,
Vous n’êtes pas en triphasé ? Quel code avez vous utilisé ? Celui du commentaire ? La diode doit clignoter.
Bonjour Nicolas, je ne suis pas en triphasé. J’ai utilisé le code donné dans l’article, celui du commentaire avait des erreurs et ESP Home n’en voulait pas. La led est eteinte avec la resistance 4.7K. J’ai éssayé avec une resistance de 330ohm et elle reste allumée fixe.