This project provides Python utilities to access data from Enedis energy meters using a serial converter :
serial_teleinfo
provides the classes to read and parse dataserial_teleinfo.server
is a simple web-server to access live readings through a JSON api
You will need a serial adapter such as the Micro Teleinfo to use this package.
The web server exposes a JSON API providing live data read from the energy meter :
{
"connected":true,
"ready":true,
"values":{
"ISOUSC": [30, "A"],
"BASE": [804220, "Wh"],
"PTEC": ["TH", null],
"IINST": [1, "A"],
"IMAX": [90, "A"],
"PAPP": [340, "VA"],
"HHPHC": ["A", null],
"MOTDETAT": ["000000", null],
"ADCO": ["012345678901", null],
"OPTARIF": ["BASE", null]
}
}
The configuration is as follows :
[teleinfo]
device=/dev/ttyUSB0
loglevel=INFO
[http]
listen=127.0.0.1:8000
[users]
apiuser=apipassword
teleinfo/device
: The path to the serial port.teleinfo/loglevel
(optionnal) : Modifies the log verbosity, it can beDEBUG
,INFO
,WARNING
,ERROR
. Default isINFO
.http/listen
: The host and port to listen to.users
: A list of user/password allowed to use the API (using basic authentification).
Install the package :
pip install serial-teleinfo[server]
Create a configuration file teleinfo.ini
as described above and run the command :
python -m serial_teleinfo.server teleinfo.ini
Once the server is running, you can access the values at http://apiuser:apipassword@localhost:8000/status.json.
A docker image is provided, here's an example docker-compose.yml
:
version: '3'
services:
teleinfo:
image: ugomeda/serial-teleinfo
restart: always
devices:
- /dev/ttyUSB0
environment:
HTTP_LISTEN: "0.0.0.0:7777"
USERS_PASSWORD: "Str0ngPa55w0rd!"
TELEINFO_LOGLEVEL: "DEBUG"
ports:
- "7777:7777"
You can access the values at http://apiuser:Str0ngPa55w0rd!@SERVERIP:7777/status.json.
The environment variables are :
Variable | Default value |
---|---|
TELEINFO_DEVICE | /dev/ttyUSB0 |
TELEINFO_LOGLEVEL | INFO |
HTTP_LISTEN | 0.0.0.0:8000 |
USERS_USER | apiuser |
USERS_PASSWORD | apipassword |
Install the package :
pip install serial-teleinfo
This class provides direct access to the values read on the serial port.
Here's an example usage :
import serial
from serial_teleinfo import Client, TeleinfoException
try:
with Client("/dev/ttyUSB0") as client:
while True:
print(client.read_value())
except TeleinfoException as e:
print(e)
except serial.SerialException as e:
print(e)
You can also refer to the serial_teleinfo.ValueUpdater
implementation.
This utility class manages a background thread to update values indefinitely. It will automatically handle reconnection to the serial port and ignore temporary errors or reccuring unknown keys.
It provides 3 main properties :
values
: A dictionary with all the valuesconnected
: True if the client is connected to the meterready
: True if all the values are available
You can also override the update_value
method to access the read values as they are read.
Heres an example usage :
import time
from serial_teleinfo import ValueUpdater
class MyValueUpdater(ValueUpdater):
def update_value(self, value):
print(f"Updated {value.key}")
super().update_value(value)
updater = MyValueUpdater("/dev/ttyUSB0")
updater.start()
try:
while True:
print(f"Connected : {updater.connected}")
print(f"Ready : {updater.ready}")
for value in updater.values.values():
print(value)
time.sleep(2)
finally:
updater.stop()