Making a custom board to connect an esp8266 to the french energy meter
The Linky energy meter is "connected" energy meter it transmit the energy consumed by their user to the energy company (Enedis).
The arrow on the second picture above show the user teleinfo port. Here the user is free to plug something like the "Linky ERL" or any device to monitor the meter
The linky provides 3 "easy" to use ports I1 I2 and A. The actual data comes from the circuit I1 and I2 and you have an alimentation circuit between I1 and A. For reference P, N, P', N' are the mains connections C1 and C2 connection to a water boiler and T1 / T2 are I think for technicians and are locked.
The actual signal is a unidirectional serial connection with a 50kHz carrier. The documentation (available at the bottom) says that the signal is at 9600bps 7E1 but the signal is actually 1200bps at 7E1. Converting this signal is really simple I used the following circuit:
The linky spits out frames composed of these lines (For the one I have):
ADCO <censored> OPTARIF HC.. ISOUSC 30 HCHC 000582078 HCHP 000599002 PTEC HP.. IINST 005 IMAX 090 PAPP 01115 HHPHC A MOTDETAT 000000
Here's a table to see what stands for what:
The documentation tells us how a frame is transmitted: First you have the char 0x02 there for each line start 0x0A and 0x0D the end of a line the end of a frame is signaled by the char 0x03 and a premature end of data by 0x04
As I wanted to make my module compatible with 3-phased devices I added all these in the code as well and here's my structure for holding the data:
Receiving the data is as simple as creating a new software serial with the right pins and the incoming byte by 0x7F to get only the 7 bits since arduino software serial can't strictly do 7E1 communications. Then I created a char array of the size of 100 (It will never be used completely) and incremented a variable at each valid char received to store it.
Then I created a couple of function that ease the parsing of the data by a lot (getCommandValue_int / getCommandValue_long / getCommandValue_str) to use these function you have to pass the actual command name like ADCO the length in this case 4 and the expected length of the output in this case 12 plus some other values like the size of received line.
Implementing everything into the ESP8266:
The code is working on some meters but on some other I cannot get data to be read by the esp8266 it seems to be an optocoupler issue.
Want to chat about this article? Just post a message down here. Chat is powered by giscus and all discussions can be found here: TheStaticTurtle/blog-comments