Skip to content

Instantly share code, notes, and snippets.

@mathieucarbou
Last active April 7, 2024 07:55
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mathieucarbou/886d2a6f5c0b51bb261d6a1329beb08d to your computer and use it in GitHub Desktop.
Save mathieucarbou/886d2a6f5c0b51bb261d6a1329beb08d to your computer and use it in GitHub Desktop.
Linky Teleinformation (TIC) + ESPHome + Home Assistant
esphome:
name: linky
# https://esphome.io/components/esp8266.html
esp8266:
board: d1_mini
# https://esphome.io/components/esp32.html
#esp32:
# board: lolin_s2_mini
# variant: esp32s2
# WiFi Component: https://esphome.io/components/wifi.html
wifi:
ssid: !secret esphome_wifi_ssid
password: !secret esphome_wifi_password
manual_ip:
static_ip: 192.168.125.84
gateway: 192.168.125.1
subnet: 255.255.255.0
dns1: 192.168.125.1
ap:
ssid: Linky
password: !secret esphome_wifi_password
# OTA Update Component: https://esphome.io/components/ota.html
ota:
password: !secret esphome_ota_password
# Logger Component: https://esphome.io/components/logger.html
logger:
baud_rate: 0 # disable logging via UART, help to avoid numerous crash with ESP_LOGD
hardware_uart : UART1
level: info
esp8266_store_log_strings_in_flash: false
# Native API Component: https://esphome.io/components/api.html
api:
encryption:
key: imB+N0VsxE6Ape4RhsxuyDLjCkeDIHl0GNyj1Gm3ylU=
# Captive Portal: https://esphome.io/components/captive_portal.html
captive_portal:
# Web Server: https://esphome.io/components/web_server.html
web_server:
local: true
port: 80
auth:
username: !secret esphome_web_server_username
password: !secret esphome_web_server_password
# Time: https://esphome.io/components/time.html
time:
- platform: homeassistant
timezone: "Europe/Paris"
id: homeassistant_time
# Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html
binary_sensor:
- platform: status
name: "Linky Status"
# Restart Button: https://esphome.io/components/button/restart.html
button:
- platform: restart
name: "Linky Restart"
# https://esphome.io/custom/uart.html
uart:
id: uart_bus
rx_pin: GPIO3
baud_rate: 9600 # 9600 == mode standard, 1200 == mode historique
parity: EVEN
data_bits: 7
stop_bits: 1
# https://esphome.io/components/sensor/teleinfo.html
teleinfo:
update_interval: 5s
historical_mode: false # false == mode standard, true == mode historique
# https://esphome.io/components/sensor/index.html
sensor:
# WiFi
- platform: wifi_signal
name: "Linky WiFi Signal"
unit_of_measurement: dB
device_class: signal_strength
accuracy_decimals: 0
update_interval: 60s
# Uptime
- platform: uptime
name: "Linky Uptime"
unit_of_measurement: s
device_class: duration
accuracy_decimals: 0
update_interval: 60s
#--------------
# MODE STANDARD
#--------------
# Énergie active soutirée totale
- platform: teleinfo
tag_name: "EAST"
name: "Linky Energie Soutirée"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 01
- platform: teleinfo
tag_name: "EASF01"
name: "Linky Energie Soutirée Tempo Bleu HC"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 02
- platform: teleinfo
tag_name: "EASF02"
name: "Linky Energie Soutirée Tempo Bleu HP"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 03
- platform: teleinfo
tag_name: "EASF03"
name: "Linky Energie Soutirée Tempo Blanc HC"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 04
- platform: teleinfo
tag_name: "EASF04"
name: "Linky Energie Soutirée Tempo Blanc HP"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 05
- platform: teleinfo
tag_name: "EASF05"
name: "Linky Energie Soutirée Tempo Rouge HC"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# Energie active soutirée Fournisseur, index 06
- platform: teleinfo
tag_name: "EASF06"
name: "Linky Energie Soutirée Tempo Rouge HP"
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
# # Energie active soutirée Fournisseur, index 07
# - platform: teleinfo
# tag_name: "EASF07"
# name: "Linky Energie Soutirée F07"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Fournisseur, index 08
# - platform: teleinfo
# tag_name: "EASF08"
# name: "Linky Energie Soutirée F08"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Fournisseur, index 09
# - platform: teleinfo
# tag_name: "EASF09"
# name: "Linky Energie Soutirée F09"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Fournisseur, index 10
# - platform: teleinfo
# tag_name: "EASF10"
# name: "Linky Energie Soutirée F10"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Distributeur, index 01
# - platform: teleinfo
# tag_name: "EASD01"
# name: "Linky Energie Soutirée D01"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Distributeur, index 02
# - platform: teleinfo
# tag_name: "EASD02"
# name: "Linky Energie Soutirée D02"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Distributeur, index 03
# - platform: teleinfo
# tag_name: "EASD03"
# name: "Linky Energie Soutirée D03"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Energie active soutirée Distributeur, index 04
# - platform: teleinfo
# tag_name: "EASD04"
# name: "Linky Energie Soutirée D04"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# Courant Efficace, phase 1
- platform: teleinfo
tag_name: "IRMS1"
name: "Linky Courant Efficace"
unit_of_measurement: A
device_class: current
state_class: measurement
# Tension Efficace, phase 1
- platform: teleinfo
tag_name: "URMS1"
name: "Linky Tension Efficace"
unit_of_measurement: V
device_class: voltage
state_class: measurement
# Puissance app. de référence
# - platform: teleinfo
# tag_name: "PREF"
# name: "Linky Puissance Apparente Référence"
# state_class: measurement
# device_class: apparent_power
# unit_of_measurement: VA
# filters:
# - multiply: 1000
# Puissance app. de coupure
- platform: teleinfo
tag_name: "PCOUP"
name: "Linky Puissance Apparente Coupure"
state_class: measurement
device_class: apparent_power
unit_of_measurement: VA
filters:
- multiply: 1000
# Puissance app. Instantanée Soutirée
- platform: teleinfo
tag_name: "SINSTS"
name: "Linky Puissance Apparente Instantanée Soutirée"
unit_of_measurement: VA
state_class: measurement
device_class: apparent_power
# Puissance app. max. soutirée
# - platform: teleinfo
# tag_name: "SMAXSN"
# name: "Linky Puissance Apparente Maximale Soutirée"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# Point n de la courbe de charge active soutirée
- platform: teleinfo
tag_name: "CCASN"
name: "Linky Puissance Active Soutirée"
unit_of_measurement: W
state_class: measurement
device_class: power
# Point n-1 de la courbe de charge active soutirée
- platform: teleinfo
tag_name: "CCASN-1"
name: "Linky Puissance Active Soutirée N-1"
unit_of_measurement: W
state_class: measurement
device_class: power
# Tension Moyenne, phase 1
# - platform: teleinfo
# tag_name: "UMOY1"
# name: "Linky Tension Moyenne"
# unit_of_measurement: V
# device_class: voltage
# state_class: measurement
#-------------------------
# MODE STANDARD - TRIPHASÉ
#-------------------------
# # Courant Efficace, phase 2
# - platform: teleinfo
# tag_name: "IRMS2"
# name: "Linky Courant Efficace Phase 2"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Courant Efficace, phase 3
# - platform: teleinfo
# tag_name: "IRMS3"
# name: "Linky Courant Efficace Phase 3"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Tension Efficace, phase 2
# - platform: teleinfo
# tag_name: "URMS2"
# name: "Linky Tension Efficace Phase 2"
# unit_of_measurement: V
# device_class: voltage
# state_class: measurement
# # Tension Efficace, phase 3
# - platform: teleinfo
# tag_name: "URMS3"
# name: "Linky Tension Efficace Phase 3"
# unit_of_measurement: V
# device_class: voltage
# state_class: measurement
# # Puissance app. Instantanée Soutirée, phase 1
# - platform: teleinfo
# tag_name: "SINSTS1"
# name: "Linky Puissance Apparente Instantanée Soutirée Phase 1"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. Instantanée Soutirée, phase 2
# - platform: teleinfo
# tag_name: "SINSTS2"
# name: "Linky Puissance Apparente Instantanée Soutirée Phase 2"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. Instantanée Soutirée, phase 3
# - platform: teleinfo
# tag_name: "SINSTS3"
# name: "Linky Puissance Apparente Instantanée Soutirée Phase 3"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. max. Soutirée, phase 1
# - platform: teleinfo
# tag_name: "SMAXSN1"
# name: "Linky Puissance Apparente Maximale Soutirée Phase 1"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. max. Soutirée, phase 2
# - platform: teleinfo
# tag_name: "SMAXSN2"
# name: "Linky Puissance Apparente Maximale Soutirée Phase 2"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. max. Soutirée, phase 3
# - platform: teleinfo
# tag_name: "SMAXSN3"
# name: "Linky Puissance Apparente Maximale Soutirée Phase 3"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Tension Moyenne, phase 2
# - platform: teleinfo
# tag_name: "UMOY2"
# name: "Linky Tension Moyenne Phase 2"
# unit_of_measurement: V
# device_class: voltage
# state_class: measurement
# # Tension Moyenne, phase 3
# - platform: teleinfo
# tag_name: "UMOY3"
# name: "Linky Tension Moyenne Phase 3"
# unit_of_measurement: V
# device_class: voltage
# state_class: measurement
#----------------------------
# MODE STANDARD - PRODUCTEURS
#----------------------------
# # Energie active injectée totale
# - platform: teleinfo
# tag_name: "EAIT"
# name: "Linky Energie Injectée"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Puissance app. Instantanée Injectée
# - platform: teleinfo
# tag_name: "SINSTI"
# name: "Linky Puissance Apparente Instantanée Injectée"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Puissance app. Maximale Injectée
# - platform: teleinfo
# tag_name: "SMAXIN"
# name: "Linky Puissance Apparente Maximale Injectée"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
# # Point n de la courbe de charge active injectée
# - platform: teleinfo
# tag_name: "CCAIN"
# name: "Linky Puissance Active Injectée"
# unit_of_measurement: W
# state_class: measurement
# device_class: power
# # Point n-1 de la courbe de charge active injectée
# - platform: teleinfo
# tag_name: "CCAIN-1"
# name: "Linky Puissance Active Injectée N-1"
# unit_of_measurement: W
# state_class: measurement
# device_class: power
#----------------
# MODE HISTORIQUE
#----------------
# # Intensité souscrite
# - platform: teleinfo
# tag_name: "ISOUSC"
# name: "Linky Intensité souscrite"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Index option Base
# - platform: teleinfo
# tag_name: "BASE"
# name: "Linky Index Base"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Index option HP/HC
# - platform: teleinfo
# tag_name: "HCHC"
# name: "Linky Index HC"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "HCHP"
# name: "Linky Index HP"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Index option EJP
# - platform: teleinfo
# tag_name: "EJPHN"
# name: "Linky Index EJP Normal"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "EJPHPM"
# name: "Linky Index EJP Pointe"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Index option Tempo
# - platform: teleinfo
# tag_name: "BBRHCJB"
# name: "Linky Index Tempo Bleu HC"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "BBRHPJB"
# name: "Linky Index Tempo Bleu HP"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "BBRHCJW"
# name: "Linky Index Tempo Blanc HC"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "BBRHPJW"
# name: "Linky Index Tempo Blanc HP"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "BBRHCJR"
# name: "Linky Index Tempo Rouge HC"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# - platform: teleinfo
# tag_name: "BBRHPJR"
# name: "Linky Index Tempo Rouge HP"
# unit_of_measurement: kWh
# device_class: energy
# state_class: total_increasing
# accuracy_decimals: 3
# filters:
# - multiply: 0.001
# # Intensité Instantanée (monophasé)
# - platform: teleinfo
# tag_name: "IINST"
# name: "Linky Intensité Instantanée"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Avertissement de Dépassement De Puissance Souscrite
# - platform: teleinfo
# tag_name: "ADPS"
# name: "Linky Intensité Instantanée Dépassement"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité maximale appelée (monophasé)
# - platform: teleinfo
# tag_name: "IMAX"
# name: "Linky Intensité Maximale"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Puissance apparente
# - platform: teleinfo
# tag_name: "PAPP"
# name: "Linky Puissance Apparente"
# unit_of_measurement: VA
# state_class: measurement
# device_class: apparent_power
#---------------------------
# MODE HISTORIQUE - TRIPHASÉ
#---------------------------
# # Intensité Instantanée, phase 1
# - platform: teleinfo
# tag_name: "IINST1"
# name: "Linky Intensité Instantanée Phase 1"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité Instantanée, phase 2
# - platform: teleinfo
# tag_name: "IINST2"
# name: "Linky Intensité Instantanée Phase 2"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité Instantanée, phase 3
# - platform: teleinfo
# tag_name: "IINST3"
# name: "Linky Intensité Instantanée Phase 3"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité maximale appelée, phase 1
# - platform: teleinfo
# tag_name: "IMAX1"
# name: "Linky Intensité Maximale Phase 1"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité maximale appelée, phase 2
# - platform: teleinfo
# tag_name: "IMAX2"
# name: "Linky Intensité Maximale Phase 2"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Intensité maximale appelée, phase 3
# - platform: teleinfo
# tag_name: "IMAX3"
# name: "Linky Intensité Maximale Phase 3"
# unit_of_measurement: A
# device_class: current
# state_class: measurement
# # Puissance maximale atteinte
# - platform: teleinfo
# tag_name: "PMAX"
# name: "Linky Puissance Maximale"
# unit_of_measurement: W
# state_class: measurement
# device_class: power
# https://esphome.io/components/text_sensor/index.html
text_sensor:
- platform: wifi_info
ip_address:
name: Linky IP Address
mac_address:
name: Linky Wifi Mac Address
ssid:
name: Linky Wifi SSID
bssid:
name: Linky Wifi BSSID
#--------------
# MODE STANDARD
#--------------
# # Adresse Secondaire du Compteur
# - platform: teleinfo
# tag_name: "ADSC"
# name: "Linky Adresse Secondaire"
# Nom du calendrier tarifaire fournisseur
- platform: teleinfo
tag_name: "NGTF"
name: "Linky Calendrier Tarifaire"
icon: mdi:information
# Libellé tarif fournisseur en cours
- platform: teleinfo
tag_name: "LTARF"
name: "Linky Tarif Actuel"
icon: mdi:information
# Registre de Statuts
# - platform: teleinfo
# tag_name: "STGE"
# name: "Linky Registre de Statuts"
# icon: mdi:information
# # Message court
# - platform: teleinfo
# tag_name: "MSG1"
# name: "Linky Message court"
# # Message Ultra court
# - platform: teleinfo
# tag_name: "MSG2"
# name: "Linky Message Ultra court"
# # PRM
# - platform: teleinfo
# tag_name: "PRM"
# name: "Linky PRM"
# # Relais
# - platform: teleinfo
# tag_name: "RELAIS"
# name: "Linky Relais"
#----------------
# MODE HISTORIQUE
#----------------
# # Adresse du compteur
# - platform: teleinfo
# tag_name: "ADCO"
# name: "Linky Adresse"
# # Option tarifaire choisie
# - platform: teleinfo
# tag_name: "OPTARIF"
# name: "Linky Option Tarifaire"
# # Préavis Début EJP (30 min)
# - platform: teleinfo
# tag_name: "PEJP"
# name: "Linky Préavis EJP"
# # Période Tarifaire en cours
# - platform: teleinfo
# tag_name: "PTEC"
# name: "Linky Période Tarifaire"
# # Couleur du lendemain
# - platform: teleinfo
# tag_name: "DEMAIN"
# name: "Linky Couleur Demain"
# # Horaire Heures Pleines Heures Creuses
# - platform: teleinfo
# tag_name: "HHPHC"
# name: "Linky Horaire HP/HC"
# # Mot d'état du compteur
# - platform: teleinfo
# tag_name: "MOTDETAT"
# name: "Linky Mot d'état"
# # Présence des potentiels
# - platform: teleinfo
# tag_name: "PPOT"
# name: "Linky Présence Potentiels"
@mickaelr3003
Copy link

mickaelr3003 commented Sep 25, 2023 via email

@mathieucarbou
Copy link
Author

Bonjour, J'ai 2 compteurs linky, 1 pour de la production et 1 pour de la consommation J'aimerai récupérer les informations de chaque compteur (avec chacun la carte optocoupleur qui va bien) mais avec un seul esphome. Je crois une l'on peux mettre plusieurs capteurs différents mais je ne connais pas encore assez la programmation avec esphome. Cordialement Envoyé à partir de Outlook pour Androidhttps://aka.ms/AAb9ysg

D'accord !!

Alors oui on peut brancher en théorie plusieurs modules TIC sur un esphome mais ça dépend de quel carte ESP est utilisée car c'est gourmand en processing, besoin aussi surement de 2 bus uart (pour avoir 2x rx+tx), et la config esphome sera horrible car il faudra identifier tous les capteurs et tous les bus de donnée.

Je ne connais personne qui a tenté, mais pourquoi pas.

Si vous ne connaissez pas ESPHome, n'essayez pas: ça demande justement des connaissances assez poussées de ESPHome pour le faire.

@bokub
Copy link

bokub commented Sep 29, 2023

Le web_server c'est pas forcément une bonne idée, ça prend pas mal de RAM et sur un device peu puissant ça peut le faire crasher, comme expliqué dans la doc de ESPHome:

Please note that enabling this component will take up a lot of memory and may decrease stability, especially on ESP8266.

https://esphome.io/components/web_server.html

@mathieucarbou
Copy link
Author

mathieucarbou commented Sep 29, 2023

Le web_server c'est pas forcément une bonne idée, ça prend pas mal de RAM et sur un device peu puissant ça peut le faire crasher, comme expliqué dans la doc de ESPHome:

Please note that enabling this component will take up a lot of memory and may decrease stability, especially on ESP8266.

https://esphome.io/components/web_server.html

Tout dépend de l'utilisation ;-)

Ça fonctionne très bien et sans lenteur ici. L'interface n'est utilisée que très rarement pour visualiser si la clé fonctionne.
Elle n'est pas utilisée pour répondre à des requêtes d'outils domotiques (mqtt est là pour ça).
Ce qui coute, ce n'est pas le fait d'activer le web server (car le heap et le cpu reste stable), ce qui coute, c'est le processing des requêtes (en heap et en cpu, sachant que sur 1 seul core, c'est donc des lectures de trames Linky en moins).

@bokub
Copy link

bokub commented Sep 29, 2023

Merci pour ces précisions !

@Turiko313
Copy link

Bonjour, tout d'abord, merci pour votre travail. Aprés quelques soucis cotés hardware, remplacement de la résistance 1koms par une 220oms et j'ai enfin des données mais pas toutes.
Parcontre, j'ai un contrat "ZEN week-en plus" en gros HC/HP de Lundi à Jeudi inclus et HC vendredi et week-end.
Sous home assistant, j'ai :

  • "Horaire HP/HC" "A" je ne vois pas la correspondance du A
  • "Index HC / Index HP" Inconnu.
  • "option tarifaire" "BASE"
    J'ai bien utilisé les paramétres "Mode historique". Je n'arrive pas à voir mon erreur.
    Aprés J'ai bien le reste des infos, wifi, ip, ....

Merci pour votre aide.

@mathieucarbou
Copy link
Author

Bonjour, tout d'abord, merci pour votre travail. Aprés quelques soucis cotés hardware, remplacement de la résistance 1koms par une 220oms et j'ai enfin des données mais pas toutes. Parcontre, j'ai un contrat "ZEN week-en plus" en gros HC/HP de Lundi à Jeudi inclus et HC vendredi et week-end. Sous home assistant, j'ai :

  • "Horaire HP/HC" "A" je ne vois pas la correspondance du A
  • "Index HC / Index HP" Inconnu.
  • "option tarifaire" "BASE"
    J'ai bien utilisé les paramétres "Mode historique". Je n'arrive pas à voir mon erreur.
    Aprés J'ai bien le reste des infos, wifi, ip, ....

Merci pour votre aide.

Il faudrait lire le document de spec Enedis. Une clé Linky ne fait que exposer des code vers des capteurs. Et n'ayant ni le mode historique, ni Zen, je ne peux pas vraiment aider.

@Pronoe
Copy link

Pronoe commented Feb 20, 2024

Bonjour, J'ai 2 compteurs linky, 1 pour de la production et 1 pour de la consommation J'aimerai récupérer les informations de chaque compteur (avec chacun la carte optocoupleur qui va bien) mais avec un seul esphome. Je crois une l'on peux mettre plusieurs capteurs différents mais je ne connais pas encore assez la programmation avec esphome. Cordialement

Bonjour,
pour info je viens de le faire avec les fichiers de config ci-dessous.
La solution est d'utiliser 2 instances d'UART et 2 instances de teleinfo, avec des ID différents.
J'ai utilisé aussi des packages pour éviter d'écrire 2 fois le même code.
Cela donne donc 3 fichiers : linky_main_esp.yaml qui appelle au choix linky_TIC_standard.yaml et linky_TIC_historic.yaml
J'utilise un ESP32 WROOM DEV-KIT V1 qui reçoit 2 trames TIC Linky décommutées et gère également un capteur de température DS18B20.

20240217_154911_label

Voilà ce que ça donne sous Home Assistant
hass

Fichier linky_main_esp.yaml

# Configuration file for an ESP module connected to two separate Linky power meters (smart power meter deployed in France)
# This file is used by esphome tool to build the firmware of the module

esphome:
  name: linky
# slow pwm definition used for LED blinking  
  on_boot:
    priority: -100
    then:
      - output.turn_on:
          my_slow_pwm  
      - output.set_level:
          id: my_slow_pwm
          level: "50%"

# board definition
# https://esphome.io/components/esp8266.html
# esp8266:
#   board: d1_mini

# https://esphome.io/components/esp32.html
esp32:
  board: esp32doit-devkit-v1
  variant: esp32

# For blinking the internal green LED on D2
output:
    platform: slow_pwm
    pin: GPIO2
    id: my_slow_pwm
    period: 1000ms

# WiFi Component: https://esphome.io/components/wifi.html
wifi:
  ssid: !secret esphome_wifi_ssid
  password: !secret esphome_wifi_password
  # manual_ip:
  #   static_ip: 192.168.125.84
  #   gateway: 192.168.0.254
  #   subnet: 255.255.255.0
  #    dns1: 192.168.125.1
  ap:
    ssid: ESP_linky
    password: !secret esphome_wifi_password

# OTA Update Component: https://esphome.io/components/ota.html
ota:
  password: !secret esphome_ota_password

# Logger Component: https://esphome.io/components/logger.html
logger:
  baud_rate: 0   # disable logging via UART, help to avoid numerous crash with ESP_LOGD
  # UART must be activated when you need to view boot messages before WiFi communication is established
  hardware_uart : UART1
  level: info
#  esp8266_store_log_strings_in_flash: false

# Native API Component: https://esphome.io/components/api.html
api:
  encryption:
    key: EOl+kJJ/RoYA0+qfbLxjsnym3Y6qAAempIwh7Vb04QI=

# Captive Portal: https://esphome.io/components/captive_portal.html
captive_portal:

# Web Server: https://esphome.io/components/web_server.html
web_server:
  local: false # true
  port: 80
  auth:
    username: !secret esphome_web_server_username
    password: !secret esphome_web_server_password

# Time: https://esphome.io/components/time.html
time:
  - platform: homeassistant
    timezone: "Europe/Paris"
    id: homeassistant_time

# Configuration data for temperature sensor D18B20
dallas:
  - pin: GPIO14
    update_interval: 60s

# Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html
binary_sensor:
  - platform: status
    name: "Linky Status"

# Restart Button: https://esphome.io/components/button/restart.html
button:
  - platform: restart
    name: "Linky Restart"

packages:
  linky1: !include
    file: linky_TIC_historic.yaml      # comment this line if the counter is in standard mode
    # file: linky_TIC_standard.yaml     # uncomment this line if is in standard mode
    vars:
      bus_id: bus1
      uart_pin: GPIO16
      # use default UART2
      update_interval: 15s

  linky2: !include
    # file: linky_TIC_historic.yaml      # comment this line if the counter is in standard mode
    file: linky_TIC_standard.yaml     # uncomment this line if is in standard mode
    vars:
      bus_id: bus2
      uart_pin: GPIO35  # this is a GPIO input pin only to avoid any risk of conflict
      update_interval: 15s

# https://esphome.io/components/sensor/index.html
sensor:
  # temperature sensor DS18B20 n°1
  - platform: dallas
    address: 0x3a00000d859d0128
    name: "Temperature Dallas #1"
    resolution: 11
    # other valid values
    # 12 => sensor resolution 12 bits - 0.0625°C - 750 ms  conversion time
    # 11 => sensor resolution 11 bits - 0.125°C - 375 ms conversion time
    # 10 => sensor resolution 10 bits - 0.25°C - 187.5 ms conversion time
    # 9 => sensor resolution 9 bits - 0.5°C - 93.75 ms conversion time
  # WiFi
  - platform: wifi_signal
    name: "Linky WiFi Signal"
    unit_of_measurement: dB
    device_class: signal_strength
    accuracy_decimals: 0
    update_interval: 60s
  # Uptime
  - platform: uptime
    name: "Linky Uptime"
    unit_of_measurement: s
    device_class: duration
    accuracy_decimals: 0
    update_interval: 60s
  
# https://esphome.io/components/text_sensor/index.html
text_sensor:
  - platform: wifi_info
    ip_address:
      name: Linky IP Address
    mac_address:
      name: Linky Wifi Mac Address
    ssid:
      name: Linky Wifi SSID
    bssid:
      name: Linky Wifi BSSID

Fichier linky_TIC_historic.yaml

# This file is deicated to one TIC bus for multiple meters configuration
# Version for meters in "historic" mode
#
# https://esphome.io/components/uart.html
uart:
 - id: uart_${bus_id}
   rx_pin: ${uart_pin}
   baud_rate: 1200 # 9600 == mode standard, 1200 == mode historique
   parity: EVEN
   data_bits: 7
   stop_bits: 1
#
# https://esphome.io/components/sensor/teleinfo.html
teleinfo:
 - id: teleinfo_${bus_id}
   update_interval: ${update_interval}
   historical_mode: true # false == mode standard, true == mode historique
   uart_id: uart_${bus_id}
#
# https://esphome.io/components/sensor/index.html
sensor:
 #----------------
 # MODE HISTORIQUE
 #----------------
 # Intensité souscrite
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "ISOUSC"
   id: linky_intensite_souscrite_${bus_id}
   unit_of_measurement: A
   device_class: current
   state_class: measurement
 # Index option Base
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "BASE"
   name: ${bus_id}_linky_index_base
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Index option HP/HC
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HCHC"
 #   name: ${bus_id}_linky_index_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HCHP"
 #   name: ${bus_id}_linky_index_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # # Index option EJP
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "EJPHN"
 #   name: ${bus_id}_linky_index_ejp_normal
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "EJPHPM"
 #   name: ${bus_id}_linky_index_ejp_pointe
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # # Index option Tempo
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJB"
 #   name: ${bus_id}_linky_index_tempo_bleu_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJB"
 #   name: ${bus_id}_linky_index_tempo_bleu_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJW"
 #   name: ${bus_id}_linky_index_tempo_blanc_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJW"
 #   name: ${bus_id}_linky_index_tempo_blanc_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJR"
 #   name: ${bus_id}_linky_index_tempo_rouge_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJR"
 #   name: ${bus_id}_linky_index_tempo_rouge_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # Intensité Instantanée (monophasé)
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "IINST"
   name: ${bus_id}_linky_intensite_instantanee
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1  
 # Avertissement de Dépassement De Puissance Souscrite
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "ADPS"
   name: ${bus_id}_linky_intensite_instantanee_depassement
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1
 # Intensité maximale appelée (monophasé)
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "IMAX"
   name: ${bus_id}_linky_intensite_maximale
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1
 # Puissance apparente
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "PAPP"
   name: ${bus_id}_linky_puissance_apparente
   unit_of_measurement: VA
   state_class: measurement
   device_class: apparent_power
   accuracy_decimals: 0
 #---------------------------
 # MODE HISTORIQUE - TRIPHASÉ
 #---------------------------
 # # Intensité Instantanée, phase 1
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IINST1"
 #   name: ${bus_id}_linky_intensite_instantanee_phase_1
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Intensité Instantanée, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IINST2"
 #   name: ${bus_id}_linky_intensite_instantanee_phase_2
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Intensité Instantanée, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IINST3"
 #   name: ${bus_id}_linky_intensite_instantanee_phase_3
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Intensité maximale appelée, phase 1
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IMAX1"
 #   name: ${bus_id}_linky_intensite_maximale_phase_1
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Intensité maximale appelée, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IMAX2"
 #   name: ${bus_id}_linky_intensite_maximale_phase_2
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Intensité maximale appelée, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IMAX3"
 #   name: ${bus_id}_linky_intensite_maximale_phase_3
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Puissance maximale atteinte
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PMAX"
 #   name: ${bus_id}_linky_puissance_maximale
 #   unit_of_measurement: W
 #   state_class: measurement
 #   device_class: power
#
# https://esphome.io/components/text_sensor/index.html
text_sensor:
 #----------------
 # MODE HISTORIQUE
 #----------------
 # Adresse du compteur
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "ADCO"
   name: ${bus_id}_linky_adresse
 # Option tarifaire choisie
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "OPTARIF"
   name: ${bus_id}_linky_option_tarifaire
 # # Préavis Début EJP (30 min)
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PEJP"
 #   name: ${bus_id}_linky_preavis_ejp
 # # Période Tarifaire en cours
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PTEC"
 #   name: ${bus_id}_linky_periode_tarifaire
 # # Couleur du lendemain
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "DEMAIN"
 #   name: ${bus_id}_linky_couleur_demain
 # # Horaire Heures Pleines Heures Creuses
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HHPHC"
 #   name: ${bus_id}_linky_horaire_hp/hc
 # # Mot d'état du compteur
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "MOTDETAT"
 #   name: ${bus_id}_linky_mot_d_etat
 # # Présence des potentiels
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PPOT"
 #   name: ${bus_id}_linky_presence_potentiels

Fichier linky_TIC_standard.yaml

# This file is deicated to one TIC bus for multiple meters configuration
# Version for meters in "standard" mode
#
# https://esphome.io/components/uart.html
uart:
 - id: uart_${bus_id}
   rx_pin: ${uart_pin}
   baud_rate: 9600 # 9600 == mode standard, 1200 == mode historique
   parity: EVEN
   data_bits: 7
   stop_bits: 1
#
# https://esphome.io/components/sensor/teleinfo.html
teleinfo:
 - id: teleinfo_${bus_id}
   update_interval: ${update_interval}
   historical_mode: false # false == mode standard, true == mode historique
   uart_id: uart_${bus_id}
#
# https://esphome.io/components/sensor/index.html
sensor:
 #------------------------
 # MODE STANDARD MONOPHASE
 #------------------------
 # Énergie active soutirée totale
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EAST"
   name: ${bus_id}_linky_energie_soutiree
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 01
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF01"
   name: ${bus_id}_linky_energie_soutiree_tempo_bleu_hc
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 02
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF02"
   name: ${bus_id}_linky_energie_soutiree_tempo_bleu_hp
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 03
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF03"
   name: ${bus_id}_linky_energie_soutiree_tempo_blanc_hc
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 04
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF04"
   name: ${bus_id}_linky_energie_soutiree_tempo_blanc_hp
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 05
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF05"
   name: ${bus_id}_linky_energie_soutiree_tempo_rouge_hc
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 06
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF06"
   name: ${bus_id}_linky_energie_soutiree_tempo_rouge_hp
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 07
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF07"
   name: ${bus_id}_linky_energie_soutiree_f07
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 08
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF08"
   name: ${bus_id}_linky_energie_soutiree_f08
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 09
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF09"
   name: ${bus_id}_linky_energie_soutiree_f09
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Fournisseur, index 10
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASF10"
   name: ${bus_id}_linky_energie_soutiree_f10
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Distributeur, index 01
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASD01"
   name: ${bus_id}_linky_energie_soutiree_d01
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Distributeur, index 02
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASD02"
   name: ${bus_id}_linky_energie_soutiree_d02
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Distributeur, index 03
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASD03"
   name: ${bus_id}_linky_energie_soutiree_d03
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Energie active soutirée Distributeur, index 04
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "EASD04"
   name: ${bus_id}_linky_energie_soutiree_d04
   unit_of_measurement: kWh
   device_class: energy
   state_class: total_increasing
   accuracy_decimals: 3
   filters:
     - multiply: 0.001
 # Courant Efficace, phase 1
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "IRMS1"
   name: ${bus_id}_linky_courant_efficace
   unit_of_measurement: A
   device_class: current
   state_class: measurement
 # Tension Efficace, phase 1
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "URMS1"
   name: ${bus_id}_linky_tension_efficace
   unit_of_measurement: V
   device_class: voltage
   state_class: measurement
 # Puissance app. de référence
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "PREF"
   name: ${bus_id}_linky_puissance_apparente_reference
   state_class: measurement
   device_class: apparent_power
   unit_of_measurement: VA
   filters:
     - multiply: 1000
 # Puissance app. de coupure
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "PCOUP"
   name: ${bus_id}_linky_puissance_apparente_coupure
   state_class: measurement
   device_class: apparent_power
   unit_of_measurement: VA
   filters:
     - multiply: 1000
 # Puissance app. Instantanée Soutirée
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "SINSTS"
   name: ${bus_id}_linky_puissance_apparente_instantanee_soutiree
   unit_of_measurement: VA
   state_class: measurement
   device_class: apparent_power
 # Puissance app. max. soutirée
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "SMAXSN"
   name: ${bus_id}_linky_puissance_apparente_maximale_soutiree
   unit_of_measurement: VA
   state_class: measurement
   device_class: apparent_power
 # Point n de la courbe de charge active soutirée
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "CCASN"
   name: ${bus_id}_linky_puissance_active_soutiree
   unit_of_measurement: W
   state_class: measurement
   device_class: power
 # Point n-1 de la courbe de charge active soutirée
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "CCASN-1"
   name: ${bus_id}_linky_puissance_active_soutiree_n-1
   unit_of_measurement: W
   state_class: measurement
   device_class: power
 # Tension Moyenne, phase 1
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "UMOY1"
   name: ${bus_id}_linky_tension_moyenne
   unit_of_measurement: V
   device_class: voltage
   state_class: measurement
 #-------------------------
 # MODE STANDARD - TRIPHASÉ
 #-------------------------
 # # Courant Efficace, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IRMS2"
 #   name: ${bus_id}_linky_courant_efficace_phase_2
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Courant Efficace, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "IRMS3"
 #   name: ${bus_id}_linky_courant_efficace_phase_3
 #   unit_of_measurement: A
 #   device_class: current
 #   state_class: measurement
 # # Tension Efficace, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "URMS2"
 #   name: ${bus_id}_linky_tension_efficace_phase_2
 #   unit_of_measurement: V
 #   device_class: voltage
 #   state_class: measurement
 # # Tension Efficace, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "URMS3"
 #   name: ${bus_id}_linky_tension_efficace_phase_3
 #   unit_of_measurement: V
 #   device_class: voltage
 #   state_class: measurement
 # # Puissance app. Instantanée Soutirée, phase 1
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SINSTS1"
 #   name: ${bus_id}_linky_puissance_apparente_instantanee_soutiree_phase_1
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. Instantanée Soutirée, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SINSTS2"
 #   name: ${bus_id}_linky_puissance_apparente_instantanee_soutiree_phase_2
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. Instantanée Soutirée, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SINSTS3"
 #   name: ${bus_id}_linky_puissance_apparente_instantanee_soutiree_phase_3
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. max. Soutirée, phase 1
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SMAXSN1"
 #   name: ${bus_id}_linky_puissance_apparente_maximale_soutiree_phase_1
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. max. Soutirée, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SMAXSN2"
 #   name: ${bus_id}_linky_puissance_apparente_maximale_soutiree_phase_2
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. max. Soutirée, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SMAXSN3"
 #   name: ${bus_id}_linky_puissance_apparente_maximale_soutiree_phase_3
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Tension Moyenne, phase 2
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "UMOY2"
 #   name: ${bus_id}_linky_tension_moyenne_phase_2
 #   unit_of_measurement: V
 #   device_class: voltage
 #   state_class: measurement
 # # Tension Moyenne, phase 3
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "UMOY3"
 #   name: ${bus_id}_linky_tension_moyenne_phase_3
 #   unit_of_measurement: V
 #   device_class: voltage
 #   state_class: measurement
 #----------------------------
 # MODE STANDARD - PRODUCTEURS
 #----------------------------
 # # Energie active injectée totale
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "EAIT"
 #   name: ${bus_id}_linky_energie_injectee
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # # Puissance app. Instantanée Injectée
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SINSTI"
 #   name: ${bus_id}_linky_puissance_apparente_instantanee_injectee
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Puissance app. Maximale Injectée
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "SMAXIN"
 #   name: ${bus_id}_linky_puissance_apparente_maximale_injectee
 #   unit_of_measurement: VA
 #   state_class: measurement
 #   device_class: apparent_power
 # # Point n de la courbe de charge active injectée
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "CCAIN"
 #   name: ${bus_id}_linky_puissance_active_injectee
 #   unit_of_measurement: W
 #   state_class: measurement
 #   device_class: power
 # # Point n-1 de la courbe de charge active injectée
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "CCAIN-1"
 #   name: ${bus_id}_linky_puissance_active_injectee_n-1
 #   unit_of_measurement: W
 #   state_class: measurement
 #   device_class: power
 # # ------------
 # # Option HP/HC
 # # ------------
 # # Index option HP/HC
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HCHC"
 #   name: ${bus_id}_linky_index_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HCHP"
 #   name: ${bus_id}_linky_index_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # # ----------------
 # # Index option EJP
 # # ----------------
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "EJPHN"
 #   name: ${bus_id}_linky_index_ejp_normal
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "EJPHPM"
 #   name: ${bus_id}_linky_index_ejp_pointe
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # # ------------------
 # # Index option Tempo
 # # ------------------
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJB"
 #   name: ${bus_id}_linky_index_tempo_bleu_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJB"
 #   name: ${bus_id}_linky_index_tempo_bleu_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJW"
 #   name: ${bus_id}_linky_index_tempo_blanc_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJW"
 #   name: ${bus_id}_linky_index_tempo_blanc_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHCJR"
 #   name: ${bus_id}_linky_index_tempo_rouge_hc
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "BBRHPJR"
 #   name: ${bus_id}_linky_index_tempo_rouge_hp
 #   unit_of_measurement: kWh
 #   device_class: energy
 #   state_class: total_increasing
 #   accuracy_decimals: 3
 #   filters:
 #     - multiply: 0.001
 # Intensité Instantanée (monophasé)
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "IINST"
   name: ${bus_id}_linky_intensite_instantanee
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1  
 # Avertissement de Dépassement De Puissance Souscrite
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "ADPS"
   name: ${bus_id}_linky_intensite_instantanee_depassement
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1
 # Intensité maximale appelée (monophasé)
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "IMAX"
   name: ${bus_id}_linky_intensite_maximale
   unit_of_measurement: A
   device_class: current
   state_class: measurement
   accuracy_decimals: 1
 # Puissance apparente
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "PAPP"
   name: ${bus_id}_linky_puissance_apparente
   unit_of_measurement: VA
   state_class: measurement
   device_class: apparent_power
   accuracy_decimals: 0
#
# https://esphome.io/components/text_sensor/index.html
text_sensor:
 #--------------
 # MODE STANDARD
 #--------------
 # Adresse Secondaire du Compteur
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "ADSC"
   name: ${bus_id}_linky_adresse_secondaire
 # Nom du calendrier tarifaire fournisseur
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "NGTF"
   name: ${bus_id}_linky_calendrier_tarifaire
   icon: mdi:information
 # Libellé tarif fournisseur en cours
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "LTARF"
   name: ${bus_id}_linky_tarif_actuel
   icon: mdi:information
 # Registre de Statuts
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "STGE"
   name: ${bus_id}_linky_registre_de_statuts
   icon: mdi:information
 # Message court
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "MSG1"
   name: ${bus_id}_linky_message_court
 # Message Ultra court
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "MSG2"
   name: ${bus_id}_linky_message_ultra_court
 # PRM
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "PRM"
   name: ${bus_id}_linky_prm
 # Relais
 - platform: teleinfo
   teleinfo_id: teleinfo_${bus_id}
   tag_name: "RELAIS"
   name: ${bus_id}_linky_relais
 # # ----------
 # # Option EJP
 # # ----------
 # # Préavis Début EJP (30 min)
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PEJP"
 #   name: ${bus_id}_linky_preavis_ejp
 # # Période Tarifaire en cours
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PTEC"
 #   name: ${bus_id}_linky_periode_tarifaire
 # # Couleur du lendemain
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "DEMAIN"
 #   name: ${bus_id}_linky_couleur_demain
 # # Horaire Heures Pleines Heures Creuses
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "HHPHC"
 #   name: ${bus_id}_linky_horaire_hp/hc
 # # Mot d'état du compteur
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "MOTDETAT"
 #   name: ${bus_id}_linky_mot_d_etat
 # # Présence des potentiels
 # - platform: teleinfo
 #   teleinfo_id: teleinfo_${bus_id}
 #   tag_name: "PPOT"
 #   name: ${bus_id}_linky_presence_potentiels

@mathieucarbou
Copy link
Author

Beau travail !!! 👍

@pledou
Copy link

pledou commented Mar 1, 2024

Merci pour la base de travail! Est-ce que ça te semble opportun d'ajouter la partie Registre de Statuts que j'ai mis dans mon fork? ça évitera à d'autre de chercher^^

@mathieucarbou
Copy link
Author

Merci pour la base de travail! Est-ce que ça te semble opportun d'ajouter la partie Registre de Statuts que j'ai mis dans mon fork? ça évitera à d'autre de chercher^^

Oui n'hésitez pas à ajouter dans les commentaires ici afin que tout le monde en profite! merci!

@pledou
Copy link

pledou commented Mar 1, 2024

Voilà , je n'ai gardé que le mode standard: il y en a déjà beaucoup:

esphome:
  name: linky

# https://esphome.io/components/esp8266.html
esp8266:
  board: d1_mini

# https://esphome.io/components/esp32.html
#esp32:
#  board: lolin_s2_mini
#  variant: esp32s2

# WiFi Component: https://esphome.io/components/wifi.html
wifi:
  ssid: !secret esphome_wifi_ssid
  password: !secret esphome_wifi_password
  manual_ip:
    static_ip: 192.168.125.84
    gateway: 192.168.125.1
    subnet: 255.255.255.0
    dns1: 192.168.125.1
  ap:
    ssid: Linky
    password: !secret esphome_wifi_password

# OTA Update Component: https://esphome.io/components/ota.html
ota:
  password: !secret esphome_ota_password

# Logger Component: https://esphome.io/components/logger.html
logger:
  baud_rate: 0   # disable logging via UART, help to avoid numerous crash with ESP_LOGD
  hardware_uart : UART1
  level: info
  esp8266_store_log_strings_in_flash: false

# Native API Component: https://esphome.io/components/api.html
api:
  encryption:
    key: imB+N0VsxE6Ape4RhsxuyDLjCkeDIHl0GNyj1Gm3ylU=

# Captive Portal: https://esphome.io/components/captive_portal.html
captive_portal:

# Web Server: https://esphome.io/components/web_server.html
web_server:
  local: true
  port: 80
  auth:
    username: !secret esphome_web_server_username
    password: !secret esphome_web_server_password

# Time: https://esphome.io/components/time.html
time:
  - platform: homeassistant
    timezone: "Europe/Paris"
    id: homeassistant_time

# Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html
binary_sensor:
  - platform: status
    name: "Linky Status"

  #--------------
  # MODE STANDARD (Registre de Statuts)
  #--------------
  - platform: template
    name: Contact sec
    id: cs
    # 0 = fermé
    # 1 = ouvert
  
  - platform: template
    name: État du cache-bornes distributeur
    id: Ecbd
    # 0 = fermé
    # 1 = ouvert
   
  - platform: template
    name: Surtension sur une des phases
    id: Sp 
    # 0 = pas de surtension
    # 1 = surtension
    # La mise à 1 de ce bit peut provoquer une alarme à destination du concentrateur en fonction du registre « AlarmFilter »
  
  - platform: template
    name: Dépassement de la puissance de référence
    id: Dpr
    # 0 = pas de dépassement
    # 1 = dépassement en cours
  
  - platform: template
    name: Fonctionnement producteur/consommateur
    id: Fpc
    # 0 = consommateur
    # 1 = producteur
  
  - platform: template
    name: Sens de l'énergie active
    id: Sea 
    # 0 = énergie active positive
    # 1 = énergie active négative
  
  - platform: template
    name: Mode dégradée de l'horloge
    id: Hd
    # 0 = horloge correcte
    # 1 = horloge en mode dégradée
  
  - platform: template
    name: État de la sortie télé-information
    id: Sti
    # 0 = mode historique
    # 1 = mode standard
  
  - platform: template
    name: Synchronisation CPL
    id: SyC
    # 0= compteur non synchronisé
    # 1 = compteur synchronisé
  

# Restart Button: https://esphome.io/components/button/restart.html
button:
  - platform: restart
    name: "Linky Restart"

# https://esphome.io/custom/uart.html
uart:
  id: uart_bus
  rx_pin: GPIO3
  baud_rate: 9600 # 9600 == mode standard, 1200 == mode historique
  parity: EVEN
  data_bits: 7
  stop_bits: 1

# https://esphome.io/components/sensor/teleinfo.html
teleinfo:
  update_interval: 5s
  historical_mode: false # false == mode standard, true == mode historique

# https://esphome.io/components/sensor/index.html
sensor:
  # WiFi
  - platform: wifi_signal
    name: "Linky WiFi Signal"
    unit_of_measurement: dB
    device_class: signal_strength
    accuracy_decimals: 0
    update_interval: 60s
  # Uptime
  - platform: uptime
    name: "Linky Uptime"
    unit_of_measurement: s
    device_class: duration
    accuracy_decimals: 0
    update_interval: 60s
  #--------------
  # MODE STANDARD
  #--------------
  # Énergie active soutirée totale
  - platform: teleinfo
    tag_name: "EAST"
    name: "Linky Energie Soutirée"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 01
  - platform: teleinfo
    tag_name: "EASF01"
    name: "Linky Energie Soutirée Tempo Bleu HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 02
  - platform: teleinfo
    tag_name: "EASF02"
    name: "Linky Energie Soutirée Tempo Bleu HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 03
  - platform: teleinfo
    tag_name: "EASF03"
    name: "Linky Energie Soutirée Tempo Blanc HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 04
  - platform: teleinfo
    tag_name: "EASF04"
    name: "Linky Energie Soutirée Tempo Blanc HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 05
  - platform: teleinfo
    tag_name: "EASF05"
    name: "Linky Energie Soutirée Tempo Rouge HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 06
  - platform: teleinfo
    tag_name: "EASF06"
    name: "Linky Energie Soutirée Tempo Rouge HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 07
  # - platform: teleinfo
  #   tag_name: "EASF07"
  #   name: "Linky Energie Soutirée F07"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 08
  # - platform: teleinfo
  #   tag_name: "EASF08"
  #   name: "Linky Energie Soutirée F08"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 09
  # - platform: teleinfo
  #   tag_name: "EASF09"
  #   name: "Linky Energie Soutirée F09"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 10
  # - platform: teleinfo
  #   tag_name: "EASF10"
  #   name: "Linky Energie Soutirée F10"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 01
  # - platform: teleinfo
  #   tag_name: "EASD01"
  #   name: "Linky Energie Soutirée D01"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 02
  # - platform: teleinfo
  #   tag_name: "EASD02"
  #   name: "Linky Energie Soutirée D02"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 03
  # - platform: teleinfo
  #   tag_name: "EASD03"
  #   name: "Linky Energie Soutirée D03"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 04
  # - platform: teleinfo
  #   tag_name: "EASD04"
  #   name: "Linky Energie Soutirée D04"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # Courant Efficace, phase 1
  - platform: teleinfo
    tag_name: "IRMS1"
    name: "Linky Courant Efficace"
    unit_of_measurement: A
    device_class: current
    state_class: measurement
  # Tension Efficace, phase 1
  - platform: teleinfo
    tag_name: "URMS1"
    name: "Linky Tension Efficace"
    unit_of_measurement: V
    device_class: voltage
    state_class: measurement
  # Puissance app. de référence
  # - platform: teleinfo
  #   tag_name: "PREF"
  #   name: "Linky Puissance Apparente Référence"
  #   state_class: measurement
  #   device_class: apparent_power
  #   unit_of_measurement: VA
  #   filters:
  #     - multiply: 1000
  # Puissance app. de coupure
  - platform: teleinfo
    tag_name: "PCOUP"
    name: "Linky Puissance Apparente Coupure"
    state_class: measurement
    device_class: apparent_power
    unit_of_measurement: VA
    filters:
      - multiply: 1000
  # Puissance app. Instantanée Soutirée
  - platform: teleinfo
    tag_name: "SINSTS"
    name: "Linky Puissance Apparente Instantanée Soutirée"
    unit_of_measurement: VA
    state_class: measurement
    device_class: apparent_power
  # Puissance app. max. soutirée
  # - platform: teleinfo
  #   tag_name: "SMAXSN"
  #   name: "Linky Puissance Apparente Maximale Soutirée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # Point n de la courbe de charge active soutirée
  - platform: teleinfo
    tag_name: "CCASN"
    name: "Linky Puissance Active Soutirée"
    unit_of_measurement: W
    state_class: measurement
    device_class: power
  # Point n-1 de la courbe de charge active soutirée
  - platform: teleinfo
    tag_name: "CCASN-1"
    name: "Linky Puissance Active Soutirée N-1"
    unit_of_measurement: W
    state_class: measurement
    device_class: power
  # Tension Moyenne, phase 1
  # - platform: teleinfo
  #   tag_name: "UMOY1"
  #   name: "Linky Tension Moyenne"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  #-------------------------
  # MODE STANDARD - TRIPHASÉ
  #-------------------------
  # # Courant Efficace, phase 2
  # - platform: teleinfo
  #   tag_name: "IRMS2"
  #   name: "Linky Courant Efficace Phase 2"
  #   unit_of_measurement: A
  #   device_class: current
  #   state_class: measurement
  # # Courant Efficace, phase 3
  # - platform: teleinfo
  #   tag_name: "IRMS3"
  #   name: "Linky Courant Efficace Phase 3"
  #   unit_of_measurement: A
  #   device_class: current
  #   state_class: measurement
  # # Tension Efficace, phase 2
  # - platform: teleinfo
  #   tag_name: "URMS2"
  #   name: "Linky Tension Efficace Phase 2"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Tension Efficace, phase 3
  # - platform: teleinfo
  #   tag_name: "URMS3"
  #   name: "Linky Tension Efficace Phase 3"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Puissance app. Instantanée Soutirée, phase 1
  # - platform: teleinfo
  #   tag_name: "SINSTS1"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 1"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Instantanée Soutirée, phase 2
  # - platform: teleinfo
  #   tag_name: "SINSTS2"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 2"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Instantanée Soutirée, phase 3
  # - platform: teleinfo
  #   tag_name: "SINSTS3"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 3"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 1
  # - platform: teleinfo
  #   tag_name: "SMAXSN1"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 1"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 2
  # - platform: teleinfo
  #   tag_name: "SMAXSN2"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 2"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 3
  # - platform: teleinfo
  #   tag_name: "SMAXSN3"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 3"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Tension Moyenne, phase 2
  # - platform: teleinfo
  #   tag_name: "UMOY2"
  #   name: "Linky Tension Moyenne Phase 2"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Tension Moyenne, phase 3
  # - platform: teleinfo
  #   tag_name: "UMOY3"
  #   name: "Linky Tension Moyenne Phase 3"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  #----------------------------
  # MODE STANDARD - PRODUCTEURS
  #----------------------------
  # # Energie active injectée totale
  # - platform: teleinfo
  #   tag_name: "EAIT"
  #   name: "Linky Energie Injectée"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Puissance app. Instantanée Injectée
  # - platform: teleinfo
  #   tag_name: "SINSTI"
  #   name: "Linky Puissance Apparente Instantanée Injectée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Maximale Injectée
  # - platform: teleinfo
  #   tag_name: "SMAXIN"
  #   name: "Linky Puissance Apparente Maximale Injectée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Point n de la courbe de charge active injectée
  # - platform: teleinfo
  #   tag_name: "CCAIN"
  #   name: "Linky Puissance Active Injectée"
  #   unit_of_measurement: W
  #   state_class: measurement
  #   device_class: power
  # # Point n-1 de la courbe de charge active injectée
  # - platform: teleinfo
  #   tag_name: "CCAIN-1"
  #   name: "Linky Puissance Active Injectée N-1"
  #   unit_of_measurement: W
  #   state_class: measurement
  #   device_class: power
 
# https://esphome.io/components/text_sensor/index.html
text_sensor:
  - platform: wifi_info
    ip_address:
      name: Linky IP Address
    mac_address:
      name: Linky Wifi Mac Address
    ssid:
      name: Linky Wifi SSID
    bssid:
      name: Linky Wifi BSSID
  #--------------
  # MODE STANDARD
  #--------------
  # # Adresse Secondaire du Compteur
  # - platform: teleinfo
  #   tag_name: "ADSC"
  #   name: "Linky Adresse Secondaire"
  # Nom du calendrier tarifaire fournisseur
  - platform: teleinfo
    tag_name: "NGTF"
    name: "Linky Calendrier Tarifaire"
    icon: mdi:information
  # Libellé tarif fournisseur en cours
  - platform: teleinfo
    tag_name: "LTARF"
    name: "Linky Tarif Actuel"
    icon: mdi:information
  # Registre de Statuts
   - platform: teleinfo
     tag_name: "STGE"
     name: "Linky Registre de Statuts"
     icon: mdi:information
     internal: True
     on_value:
       then:
         - lambda: |-
             std::bitset<32> stge = std::bitset<32>(strtol(id(STGE).state.c_str(), NULL, 16));      
             id(cs).publish_state(stge[0] == 1);
             switch( stge[3] << 4 | stge[2] << 2 |  stge[1]) {
               case 0x0: id(Odc).publish_state("fermé"); break;
               case 0x1: id(Odc).publish_state("ouvert sur surpuissance"); break;
               case 0x2: id(Odc).publish_state("ouvert sur surtension"); break;
               case 0x3: id(Odc).publish_state("ouvert sur délestage"); break;
               case 0x4: id(Odc).publish_state("ouvert sur ordre CPL ou Euridis"); break;
               case 0x5: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal"); break;
               case 0x6: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal"); break;
             }
             id(Ecbd).publish_state(stge[4] == 1);
             id(Sp).publish_state(stge[6] == 1);
             id(Dpr).publish_state(stge[7] == 1);
             id(Fpc).publish_state(stge[8] == 1);
             id(Sea).publish_state(stge[9] == 1);
             switch( stge[13] << 8 | stge[12] << 4 | stge[11] << 2 |  stge[10]) {
               case 0x0: id(Teccf).publish_state("énergie ventilée sur Index 1"); break;
               case 0x1: id(Teccf).publish_state("énergie ventilée sur Index 2"); break;
               case 0x2: id(Teccf).publish_state("énergie ventilée sur Index 3"); break;
               case 0x3: id(Teccf).publish_state("énergie ventilée sur Index 4"); break;
               case 0x4: id(Teccf).publish_state("énergie ventilée sur Index 5"); break;
               case 0x5: id(Teccf).publish_state("énergie ventilée sur Index 6"); break;
               case 0x6: id(Teccf).publish_state("énergie ventilée sur Index 7"); break;
               case 0x7: id(Teccf).publish_state("énergie ventilée sur Index 8"); break;
               case 0x8: id(Teccf).publish_state("énergie ventilée sur Index 9"); break;
               case 0x9: id(Teccf).publish_state("énergie ventilée sur Index 10"); break;
             } 
             switch( stge[15] << 2 | stge[14]) { 
               case 0x0: id(Teccd).publish_state("énergie ventilée sur Index 1"); break;
               case 0x1: id(Teccd).publish_state("énergie ventilée sur Index 2"); break;
               case 0x2: id(Teccd).publish_state("énergie ventilée sur Index 3"); break;
               case 0x3: id(Teccd).publish_state("énergie ventilée sur Index 4"); break;
             } 
             id(Hd).publish_state(stge[16] == 1);
             id(Sti).publish_state(stge[17] == 1);
             switch( stge[20] << 2 | stge[19]) { 
               case 0x0: id(ScE).publish_state("désactivée"); break;
               case 0x1: id(ScE).publish_state("activée sans sécurité"); break;
               case 0x3: id(ScE).publish_state("activée avec sécurité"); break;
             }
             switch( stge[22] << 2 | stge[21]) { 
               case 0x0: id(SdC).publish_state("New/Unlock"); break;
               case 0x1: id(SdC).publish_state("New/Lock"); break;
               case 0x2: id(SdC).publish_state("Registered"); break;
             }
             id(SyC).publish_state(stge[23] == 1);
             switch( stge[25] << 2 | stge[24]) { 
               case 0x0: id(CjT).publish_state("Pas d'annonce"); break;
               case 0x1: id(CjT).publish_state("Bleu"); break;
               case 0x2: id(CjT).publish_state("Blanc"); break;
               case 0x3: id(CjT).publish_state("Rouge"); break;
             }
             switch( stge[27] << 2 | stge[26]) {
               case 0x0: id(ClT).publish_state("Pas d'annonce"); break;
               case 0x1: id(ClT).publish_state("Bleu"); break;
               case 0x2: id(ClT).publish_state("Blanc"); break;
               case 0x3: id(ClT).publish_state("Rouge"); break;
             }
             switch( stge[29] << 2 | stge[28]) {
               case 0x0: id(Ppm).publish_state("pas de préavis en cours"); break;
               case 0x1: id(Ppm).publish_state("préavis PM1 en cours"); break;
               case 0x2: id(Ppm).publish_state("préavis PM2 en cours"); break;
               case 0x3: id(Ppm).publish_state("préavis PM3 en cours"); break;
             }
             switch( stge[31] << 2 | stge[30]) {
               case 0x0: id(Pm).publish_state("Pas de pointe mobile"); break;
               case 0x1: id(Pm).publish_state("PM1 en cours"); break;
               case 0x2: id(Pm).publish_state("PM2 en cours"); break;
               case 0x3: id(Pm).publish_state("PM3 en cours"); break;
             }
   - platform: template
     id: Odc
     name: Organe de coupure
   - platform: template
     id: Teccf
     name: Tarif en cours sur le contrat fourniture
   - platform: template
     id: Teccd
     name: Tarif en cours sur le contrat distributeur
   - platform: template
     id: ScE
     name: État de la sortie communication Enedis
   - platform: template
     name: Statut du CPL 
     id: SdC
   - platform: template
     name: Couleur du jour pour le contrat historique tempo
     id: CjT
   - platform: template
     name: Couleur du lendemain pour le contrat historique tempo
     id: ClT
   - platform: template
     name: Préavis pointes mobiles 
     id: Ppm
   - platform: template
     name: Pointe mobile (PM)
     id: Pm
   # Message court
   - platform: teleinfo
     tag_name: "MSG1"
     name: "Linky Message court"
   # Message Ultra court
   - platform: teleinfo
     tag_name: "MSG2"
     name: "Linky Message Ultra court"
   # PRM
   - platform: teleinfo
     tag_name: "PRM"
     name: "Linky PRM"
   # Relais
   - platform: teleinfo
     tag_name: "RELAIS"
     name: "Linky Relais"

@pledou
Copy link

pledou commented Mar 1, 2024

Voilà une version complète pour le mode standard:

esphome:
  name: linky

# https://esphome.io/components/esp8266.html
esp8266:
  board: d1_mini

# https://esphome.io/components/esp32.html
#esp32:
#  board: lolin_s2_mini
#  variant: esp32s2

# WiFi Component: https://esphome.io/components/wifi.html
wifi:
  ssid: !secret esphome_wifi_ssid
  password: !secret esphome_wifi_password
  manual_ip:
    static_ip: 192.168.125.84
    gateway: 192.168.125.1
    subnet: 255.255.255.0
    dns1: 192.168.125.1
  ap:
    ssid: Linky
    password: !secret esphome_wifi_password

# OTA Update Component: https://esphome.io/components/ota.html
ota:
  password: !secret esphome_ota_password

# Logger Component: https://esphome.io/components/logger.html
logger:
  baud_rate: 0   # disable logging via UART, help to avoid numerous crash with ESP_LOGD
  hardware_uart : UART1
  level: info
  esp8266_store_log_strings_in_flash: false

# Native API Component: https://esphome.io/components/api.html
api:
  encryption:
    key: imB+N0VsxE6Ape4RhsxuyDLjCkeDIHl0GNyj1Gm3ylU=

# Captive Portal: https://esphome.io/components/captive_portal.html
captive_portal:

# Web Server: https://esphome.io/components/web_server.html
web_server:
  local: true
  port: 80
  auth:
    username: !secret esphome_web_server_username
    password: !secret esphome_web_server_password

# Time: https://esphome.io/components/time.html
time:
  - platform: homeassistant
    timezone: "Europe/Paris"
    id: homeassistant_time

# Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html
binary_sensor:
  - platform: status
    name: "Linky Status"

  #--------------
  # MODE STANDARD (Registre de Statuts)
  #--------------
  - platform: template
    name: Contact sec
    id: cs
    # 0 = fermé
    # 1 = ouvert
  
  - platform: template
    name: État du cache-bornes distributeur
    id: Ecbd
    # 0 = fermé
    # 1 = ouvert
   
  - platform: template
    name: Surtension sur une des phases
    id: Sp 
    # 0 = pas de surtension
    # 1 = surtension
    # La mise à 1 de ce bit peut provoquer une alarme à destination du concentrateur en fonction du registre « AlarmFilter »
  
  - platform: template
    name: Dépassement de la puissance de référence
    id: Dpr
    # 0 = pas de dépassement
    # 1 = dépassement en cours
  
  - platform: template
    name: Fonctionnement producteur/consommateur
    id: Fpc
    # 0 = consommateur
    # 1 = producteur
  
  - platform: template
    name: Sens de l'énergie active
    id: Sea 
    # 0 = énergie active positive
    # 1 = énergie active négative
  
  - platform: template
    name: Mode dégradée de l'horloge
    id: Hd
    # 0 = horloge correcte
    # 1 = horloge en mode dégradée
  
  - platform: template
    name: État de la sortie télé-information
    id: Sti
    # 0 = mode historique
    # 1 = mode standard
  
  - platform: template
    name: Synchronisation CPL
    id: SyC
    # 0= compteur non synchronisé
    # 1 = compteur synchronisé
  

# Restart Button: https://esphome.io/components/button/restart.html
button:
  - platform: restart
    name: "Linky Restart"

# https://esphome.io/custom/uart.html
uart:
  id: uart_bus
  rx_pin: GPIO3
  baud_rate: 9600 # 9600 == mode standard, 1200 == mode historique
  parity: EVEN
  data_bits: 7
  stop_bits: 1

# https://esphome.io/components/sensor/teleinfo.html
teleinfo:
  update_interval: 5s
  historical_mode: false # false == mode standard, true == mode historique

# https://esphome.io/components/sensor/index.html
sensor:
  # WiFi
  - platform: wifi_signal
    name: "Linky WiFi Signal"
    unit_of_measurement: dB
    device_class: signal_strength
    accuracy_decimals: 0
    update_interval: 60s
  # Uptime
  - platform: uptime
    name: "Linky Uptime"
    unit_of_measurement: s
    device_class: duration
    accuracy_decimals: 0
    update_interval: 60s
  #--------------
  # MODE STANDARD
  #--------------
  # Énergie active soutirée totale
  - platform: teleinfo
    tag_name: "EAST"
    name: "Linky Energie Soutirée"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 01
  - platform: teleinfo
    tag_name: "EASF01"
    name: "Linky Energie Soutirée Tempo Bleu HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 02
  - platform: teleinfo
    tag_name: "EASF02"
    name: "Linky Energie Soutirée Tempo Bleu HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 03
  - platform: teleinfo
    tag_name: "EASF03"
    name: "Linky Energie Soutirée Tempo Blanc HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 04
  - platform: teleinfo
    tag_name: "EASF04"
    name: "Linky Energie Soutirée Tempo Blanc HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 05
  - platform: teleinfo
    tag_name: "EASF05"
    name: "Linky Energie Soutirée Tempo Rouge HC"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # Energie active soutirée Fournisseur, index 06
  - platform: teleinfo
    tag_name: "EASF06"
    name: "Linky Energie Soutirée Tempo Rouge HP"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 07
  # - platform: teleinfo
  #   tag_name: "EASF07"
  #   name: "Linky Energie Soutirée F07"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 08
  # - platform: teleinfo
  #   tag_name: "EASF08"
  #   name: "Linky Energie Soutirée F08"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 09
  # - platform: teleinfo
  #   tag_name: "EASF09"
  #   name: "Linky Energie Soutirée F09"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Fournisseur, index 10
  # - platform: teleinfo
  #   tag_name: "EASF10"
  #   name: "Linky Energie Soutirée F10"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 01
  # - platform: teleinfo
  #   tag_name: "EASD01"
  #   name: "Linky Energie Soutirée D01"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 02
  # - platform: teleinfo
  #   tag_name: "EASD02"
  #   name: "Linky Energie Soutirée D02"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 03
  # - platform: teleinfo
  #   tag_name: "EASD03"
  #   name: "Linky Energie Soutirée D03"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Energie active soutirée Distributeur, index 04
  # - platform: teleinfo
  #   tag_name: "EASD04"
  #   name: "Linky Energie Soutirée D04"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # Courant Efficace, phase 1
  - platform: teleinfo
    tag_name: "IRMS1"
    name: "Linky Courant Efficace"
    unit_of_measurement: A
    device_class: current
    state_class: measurement
  # Tension Efficace, phase 1
  - platform: teleinfo
    tag_name: "URMS1"
    name: "Linky Tension Efficace"
    unit_of_measurement: V
    device_class: voltage
    state_class: measurement
  # Puissance app. de référence
  # - platform: teleinfo
  #   tag_name: "PREF"
  #   name: "Linky Puissance Apparente Référence"
  #   state_class: measurement
  #   device_class: apparent_power
  #   unit_of_measurement: VA
  #   filters:
  #     - multiply: 1000
  # Puissance app. de coupure
  - platform: teleinfo
    tag_name: "PCOUP"
    name: "Linky Puissance Apparente Coupure"
    state_class: measurement
    device_class: apparent_power
    unit_of_measurement: VA
    filters:
      - multiply: 1000
  # Puissance app. Instantanée Soutirée
  - platform: teleinfo
    tag_name: "SINSTS"
    name: "Linky Puissance Apparente Instantanée Soutirée"
    unit_of_measurement: VA
    state_class: measurement
    device_class: apparent_power
  # Puissance app. max. soutirée
  # - platform: teleinfo
  #   tag_name: "SMAXSN"
  #   name: "Linky Puissance Apparente Maximale Soutirée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # Point n de la courbe de charge active soutirée
  - platform: teleinfo
    tag_name: "CCASN"
    name: "Linky Puissance Active Soutirée"
    unit_of_measurement: W
    state_class: measurement
    device_class: power
  # Point n-1 de la courbe de charge active soutirée
  - platform: teleinfo
    tag_name: "CCASN-1"
    name: "Linky Puissance Active Soutirée N-1"
    unit_of_measurement: W
    state_class: measurement
    device_class: power
  # Tension Moyenne, phase 1
  # - platform: teleinfo
  #   tag_name: "UMOY1"
  #   name: "Linky Tension Moyenne"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  #-------------------------
  # MODE STANDARD - TRIPHASÉ
  #-------------------------
  # # Courant Efficace, phase 2
  # - platform: teleinfo
  #   tag_name: "IRMS2"
  #   name: "Linky Courant Efficace Phase 2"
  #   unit_of_measurement: A
  #   device_class: current
  #   state_class: measurement
  # # Courant Efficace, phase 3
  # - platform: teleinfo
  #   tag_name: "IRMS3"
  #   name: "Linky Courant Efficace Phase 3"
  #   unit_of_measurement: A
  #   device_class: current
  #   state_class: measurement
  # # Tension Efficace, phase 2
  # - platform: teleinfo
  #   tag_name: "URMS2"
  #   name: "Linky Tension Efficace Phase 2"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Tension Efficace, phase 3
  # - platform: teleinfo
  #   tag_name: "URMS3"
  #   name: "Linky Tension Efficace Phase 3"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Puissance app. Instantanée Soutirée, phase 1
  # - platform: teleinfo
  #   tag_name: "SINSTS1"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 1"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Instantanée Soutirée, phase 2
  # - platform: teleinfo
  #   tag_name: "SINSTS2"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 2"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Instantanée Soutirée, phase 3
  # - platform: teleinfo
  #   tag_name: "SINSTS3"
  #   name: "Linky Puissance Apparente Instantanée Soutirée Phase 3"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 1
  # - platform: teleinfo
  #   tag_name: "SMAXSN1"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 1"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 2
  # - platform: teleinfo
  #   tag_name: "SMAXSN2"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 2"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. max. Soutirée, phase 3
  # - platform: teleinfo
  #   tag_name: "SMAXSN3"
  #   name: "Linky Puissance Apparente Maximale Soutirée Phase 3"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Tension Moyenne, phase 2
  # - platform: teleinfo
  #   tag_name: "UMOY2"
  #   name: "Linky Tension Moyenne Phase 2"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  # # Tension Moyenne, phase 3
  # - platform: teleinfo
  #   tag_name: "UMOY3"
  #   name: "Linky Tension Moyenne Phase 3"
  #   unit_of_measurement: V
  #   device_class: voltage
  #   state_class: measurement
  #----------------------------
  # MODE STANDARD - PRODUCTEURS
  #----------------------------
  # # Energie active injectée totale
  # - platform: teleinfo
  #   tag_name: "EAIT"
  #   name: "Linky Energie Injectée"
  #   unit_of_measurement: kWh
  #   device_class: energy
  #   state_class: total_increasing
  #   accuracy_decimals: 3
  #   filters:
  #     - multiply: 0.001
  # # Puissance app. Instantanée Injectée
  # - platform: teleinfo
  #   tag_name: "SINSTI"
  #   name: "Linky Puissance Apparente Instantanée Injectée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Puissance app. Maximale Injectée
  # - platform: teleinfo
  #   tag_name: "SMAXIN"
  #   name: "Linky Puissance Apparente Maximale Injectée"
  #   unit_of_measurement: VA
  #   state_class: measurement
  #   device_class: apparent_power
  # # Point n de la courbe de charge active injectée
  # - platform: teleinfo
  #   tag_name: "CCAIN"
  #   name: "Linky Puissance Active Injectée"
  #   unit_of_measurement: W
  #   state_class: measurement
  #   device_class: power
  # # Point n-1 de la courbe de charge active injectée
  # - platform: teleinfo
  #   tag_name: "CCAIN-1"
  #   name: "Linky Puissance Active Injectée N-1"
  #   unit_of_measurement: W
  #   state_class: measurement
  #   device_class: power
 
# https://esphome.io/components/text_sensor/index.html
text_sensor:
  - platform: wifi_info
    ip_address:
      name: Linky IP Address
    mac_address:
      name: Linky Wifi Mac Address
    ssid:
      name: Linky Wifi SSID
    bssid:
      name: Linky Wifi BSSID
  #--------------
  # MODE STANDARD
  #--------------
  # # Adresse Secondaire du Compteur
  # - platform: teleinfo
  #   tag_name: "ADSC"
  #   name: "Linky Adresse Secondaire"
  # Nom du calendrier tarifaire fournisseur
  - platform: teleinfo
    tag_name: "NGTF"
    name: "Linky Calendrier Tarifaire"
    icon: mdi:information
  # Libellé tarif fournisseur en cours
  - platform: teleinfo
    tag_name: "LTARF"
    name: "Linky Tarif Actuel"
    icon: mdi:information
  # Registre de Statuts
   - platform: teleinfo
     tag_name: "STGE"
     name: "Linky Registre de Statuts"
     icon: mdi:information
     internal: True
     on_value:
       then:
         - lambda: |-
             std::bitset<32> stge = std::bitset<32>(strtol(id(STGE).state.c_str(), NULL, 16));      
             id(cs).publish_state(stge[0] == 1);
             switch( stge[3] << 4 | stge[2] << 2 |  stge[1]) {
               case 0x0: id(Odc).publish_state("fermé"); break;
               case 0x1: id(Odc).publish_state("ouvert sur surpuissance"); break;
               case 0x2: id(Odc).publish_state("ouvert sur surtension"); break;
               case 0x3: id(Odc).publish_state("ouvert sur délestage"); break;
               case 0x4: id(Odc).publish_state("ouvert sur ordre CPL ou Euridis"); break;
               case 0x5: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal"); break;
               case 0x6: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal"); break;
             }
             id(Ecbd).publish_state(stge[4] == 1);
             id(Sp).publish_state(stge[6] == 1);
             id(Dpr).publish_state(stge[7] == 1);
             id(Fpc).publish_state(stge[8] == 1);
             id(Sea).publish_state(stge[9] == 1);
             switch( stge[13] << 8 | stge[12] << 4 | stge[11] << 2 |  stge[10]) {
               case 0x0: id(Teccf).publish_state("énergie ventilée sur Index 1"); break;
               case 0x1: id(Teccf).publish_state("énergie ventilée sur Index 2"); break;
               case 0x2: id(Teccf).publish_state("énergie ventilée sur Index 3"); break;
               case 0x3: id(Teccf).publish_state("énergie ventilée sur Index 4"); break;
               case 0x4: id(Teccf).publish_state("énergie ventilée sur Index 5"); break;
               case 0x5: id(Teccf).publish_state("énergie ventilée sur Index 6"); break;
               case 0x6: id(Teccf).publish_state("énergie ventilée sur Index 7"); break;
               case 0x7: id(Teccf).publish_state("énergie ventilée sur Index 8"); break;
               case 0x8: id(Teccf).publish_state("énergie ventilée sur Index 9"); break;
               case 0x9: id(Teccf).publish_state("énergie ventilée sur Index 10"); break;
             } 
             switch( stge[15] << 2 | stge[14]) { 
               case 0x0: id(Teccd).publish_state("énergie ventilée sur Index 1"); break;
               case 0x1: id(Teccd).publish_state("énergie ventilée sur Index 2"); break;
               case 0x2: id(Teccd).publish_state("énergie ventilée sur Index 3"); break;
               case 0x3: id(Teccd).publish_state("énergie ventilée sur Index 4"); break;
             } 
             id(Hd).publish_state(stge[16] == 1);
             id(Sti).publish_state(stge[17] == 1);
             switch( stge[20] << 2 | stge[19]) { 
               case 0x0: id(ScE).publish_state("désactivée"); break;
               case 0x1: id(ScE).publish_state("activée sans sécurité"); break;
               case 0x3: id(ScE).publish_state("activée avec sécurité"); break;
             }
             switch( stge[22] << 2 | stge[21]) { 
               case 0x0: id(SdC).publish_state("New/Unlock"); break;
               case 0x1: id(SdC).publish_state("New/Lock"); break;
               case 0x2: id(SdC).publish_state("Registered"); break;
             }
             id(SyC).publish_state(stge[23] == 1);
             switch( stge[25] << 2 | stge[24]) { 
               case 0x0: id(CjT).publish_state("Pas d'annonce"); break;
               case 0x1: id(CjT).publish_state("Bleu"); break;
               case 0x2: id(CjT).publish_state("Blanc"); break;
               case 0x3: id(CjT).publish_state("Rouge"); break;
             }
             switch( stge[27] << 2 | stge[26]) {
               case 0x0: id(ClT).publish_state("Pas d'annonce"); break;
               case 0x1: id(ClT).publish_state("Bleu"); break;
               case 0x2: id(ClT).publish_state("Blanc"); break;
               case 0x3: id(ClT).publish_state("Rouge"); break;
             }
             switch( stge[29] << 2 | stge[28]) {
               case 0x0: id(Ppm).publish_state("pas de préavis en cours"); break;
               case 0x1: id(Ppm).publish_state("préavis PM1 en cours"); break;
               case 0x2: id(Ppm).publish_state("préavis PM2 en cours"); break;
               case 0x3: id(Ppm).publish_state("préavis PM3 en cours"); break;
             }
             switch( stge[31] << 2 | stge[30]) {
               case 0x0: id(Pm).publish_state("Pas de pointe mobile"); break;
               case 0x1: id(Pm).publish_state("PM1 en cours"); break;
               case 0x2: id(Pm).publish_state("PM2 en cours"); break;
               case 0x3: id(Pm).publish_state("PM3 en cours"); break;
             }
   - platform: template
     id: Odc
     name: Organe de coupure
   - platform: template
     id: Teccf
     name: Tarif en cours sur le contrat fourniture
   - platform: template
     id: Teccd
     name: Tarif en cours sur le contrat distributeur
   - platform: template
     id: ScE
     name: État de la sortie communication Enedis
   - platform: template
     name: Statut du CPL 
     id: SdC
   - platform: template
     name: Couleur du jour pour le contrat historique tempo
     id: CjT
   - platform: template
     name: Couleur du lendemain pour le contrat historique tempo
     id: ClT
   - platform: template
     name: Préavis pointes mobiles 
     id: Ppm
   - platform: template
     name: Pointe mobile (PM)
     id: Pm
   # Message court
   - platform: teleinfo
     tag_name: "MSG1"
     name: "Linky Message court"
   # Message Ultra court
   - platform: teleinfo
     tag_name: "MSG2"
     name: "Linky Message Ultra court"
   # PRM
   - platform: teleinfo
     tag_name: "PRM"
     name: "Linky PRM"
   # Relais
   - platform: teleinfo
     tag_name: "RELAIS"
     name: "Linky Relais"
```

@mathieucarbou
Copy link
Author

Merci, c'est top! J'avais vraiment la flemme de faire toutes ces conditions pour les registres...

@nicolas-r
Copy link

Bonjour

Merci pour vos configurations. J'ai pris celle de @pledou (https://gist.github.com/mathieucarbou/886d2a6f5c0b51bb261d6a1329beb08d?permalink_comment_id=4958030#gistcomment-4958030) mais j'ai ce message quand je veux l'installer. Ne pas faire attention à la ligne 513 car je n'ai le même fichier au debut

text_sensor.teleinfo: [source /config/esphome/esphome-web-65d418.yaml:513]
platform: teleinfo
tag_name: STGE
name: Linky Registre de Statuts
icon: mdi:information
internal: True
on_value:
- then:
-
Couldn't find ID 'STGE'. Please check you have defined an ID with that name in your configuration.
lambda: !lambda |-
std::bitset<32> stge = std::bitset<32>(strtol(id(STGE).state.c_str(), NULL, 16));
id(cs).publish_state(stge[0] == 1);
switch( stge[3] << 4 | stge[2] << 2 | stge[1]) {
case 0x0: id(Odc).publish_state("fermé"); break;
case 0x1: id(Odc).publish_state("ouvert sur surpuissance"); break;
case 0x2: id(Odc).publish_state("ouvert sur surtension"); break;
case 0x3: id(Odc).publish_state("ouvert sur délestage"); break;
case 0x4: id(Odc).publish_state("ouvert sur ordre CPL ou Euridis"); break;
case 0x5: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal"); break;
case 0x6: id(Odc).publish_state("ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal"); break;
}
id(Ecbd).publish_state(stge[4] == 1);
id(Sp).publish_state(stge[6] == 1);
id(Dpr).publish_state(stge[7] == 1);
id(Fpc).publish_state(stge[8] == 1);
id(Sea).publish_state(stge[9] == 1);
switch( stge[13] << 8 | stge[12] << 4 | stge[11] << 2 | stge[10]) {
case 0x0: id(Teccf).publish_state("énergie ventilée sur Index 1"); break;
case 0x1: id(Teccf).publish_state("énergie ventilée sur Index 2"); break;
case 0x2: id(Teccf).publish_state("énergie ventilée sur Index 3"); break;
case 0x3: id(Teccf).publish_state("énergie ventilée sur Index 4"); break;
case 0x4: id(Teccf).publish_state("énergie ventilée sur Index 5"); break;
case 0x5: id(Teccf).publish_state("énergie ventilée sur Index 6"); break;
case 0x6: id(Teccf).publish_state("énergie ventilée sur Index 7"); break;
case 0x7: id(Teccf).publish_state("énergie ventilée sur Index 8"); break;
case 0x8: id(Teccf).publish_state("énergie ventilée sur Index 9"); break;
case 0x9: id(Teccf).publish_state("énergie ventilée sur Index 10"); break;
}
switch( stge[15] << 2 | stge[14]) {
case 0x0: id(Teccd).publish_state("énergie ventilée sur Index 1"); break;
case 0x1: id(Teccd).publish_state("énergie ventilée sur Index 2"); break;
case 0x2: id(Teccd).publish_state("énergie ventilée sur Index 3"); break;
case 0x3: id(Teccd).publish_state("énergie ventilée sur Index 4"); break;
}
id(Hd).publish_state(stge[16] == 1);
id(Sti).publish_state(stge[17] == 1);
switch( stge[20] << 2 | stge[19]) {
case 0x0: id(ScE).publish_state("désactivée"); break;
case 0x1: id(ScE).publish_state("activée sans sécurité"); break;
case 0x3: id(ScE).publish_state("activée avec sécurité"); break;
}
switch( stge[22] << 2 | stge[21]) {
case 0x0: id(SdC).publish_state("New/Unlock"); break;
case 0x1: id(SdC).publish_state("New/Lock"); break;
case 0x2: id(SdC).publish_state("Registered"); break;
}
id(SyC).publish_state(stge[23] == 1);
switch( stge[25] << 2 | stge[24]) {
case 0x0: id(CjT).publish_state("Pas d'annonce"); break;
case 0x1: id(CjT).publish_state("Bleu"); break;
case 0x2: id(CjT).publish_state("Blanc"); break;
case 0x3: id(CjT).publish_state("Rouge"); break;
}
switch( stge[27] << 2 | stge[26]) {
case 0x0: id(ClT).publish_state("Pas d'annonce"); break;
case 0x1: id(ClT).publish_state("Bleu"); break;
case 0x2: id(ClT).publish_state("Blanc"); break;
case 0x3: id(ClT).publish_state("Rouge"); break;
}
switch( stge[29] << 2 | stge[28]) {
case 0x0: id(Ppm).publish_state("pas de préavis en cours"); break;
case 0x1: id(Ppm).publish_state("préavis PM1 en cours"); break;
case 0x2: id(Ppm).publish_state("préavis PM2 en cours"); break;
case 0x3: id(Ppm).publish_state("préavis PM3 en cours"); break;
}
switch( stge[31] << 2 | stge[30]) {
case 0x0: id(Pm).publish_state("Pas de pointe mobile"); break;
case 0x1: id(Pm).publish_state("PM1 en cours"); break;
case 0x2: id(Pm).publish_state("PM2 en cours"); break;
case 0x3: id(Pm).publish_state("PM3 en cours"); break;
}
disabled_by_default: False

Ne faudrait-il pas définir un ID: STGE quelque part ?

Merci

Nicolas

@nicolas-r
Copy link

J'ai rajouté un id: "STGE" sous tag_name: "STGE" et l'erreur est partie. PAr contre, je ne sais pas si ça fonctionne, je n'a pas encore tiré les câbles entre mon compteur linky en limite de propriété et l'intérieur de la maison

@pledou
Copy link

pledou commented Mar 5, 2024

Mmh, je confirme que ca marche pas... on tombe pas sur les bons bits. Il doit y avoir une inversion qq part

@nicolas-r
Copy link

Et pour le ID not found, tu as une idée ? Ma solution de rajouter l'id est la bonne ? Ou alors j'ai un autre soucis ?

Merci

@pledou
Copy link

pledou commented Mar 5, 2024

Oui, effectivement c'est un oubli de ma part... mais il ya peut être moyen de faire plus simple pour récupérer la valeur dans on_value: j'ai pas le tps de regarder la doc tt de suite

@Eldonmanuel
Copy link

Bonjour,
Super travail très complet et assez clair pour pourvoir l'adapter à son propre abonnement! un grand merci.
J'ai une question @Pronoe j'ai aussi deux compteurs, mais comment arrives tu a charger plusieurs fichiers yaml dans un esp32? j'utilise ESPhome pour faire les updates du fichier yaml de mon ESP32.

Merci

@Pronoe
Copy link

Pronoe commented Mar 8, 2024

Bonjour,
lors de la compilation du firmware par esphome, il faut appeler un seul fichier qui est linky_main_esp.yaml que j'ai mis au début de mon précédent post.
Le 2ème fichier linky_TIC_historic.yaml ou linky_TIC_standard.yaml selon le cas, doit être dans le même répertoire que le premier. Il va être appelé automatiquement car le premier fichier comporte les lignes suivantes :

packages:
  linky1: !include
    file: linky_TIC_historic.yaml      # comment this line if the counter is in standard mode
    # file: linky_TIC_standard.yaml     # uncomment this line if is in standard mode
    vars:
      bus_id: bus1
      uart_pin: GPIO16
      # use default UART2
      update_interval: 15s

  linky2: !include
    # file: linky_TIC_historic.yaml      # comment this line if the counter is in standard mode
    file: linky_TIC_standard.yaml     # uncomment this line if is in standard mode

Par contre pour le moment, mes compteurs sont encore en mode historique et je n'ai pu tester que cette configuration.
J'ai demandé il y a plus de 2 semaines à mon fournisseur Total Energie de basculer en mode standard. Cela fait 2 fois qu'ils me répondent que leur service technique doit me rappeler mais il ne se passe toujours rien.
A noter aussi que le driver teleinfo semble avoir un peu de mal a gérer les 2 compteurs car j'ai de nombreux warning sur la console signalant des temps de réponse trop longs du driver. Mais ça ne gène apparemment pas le fonctionnement, les informations remontent bien dans Home Assistant depuis 3 semaines maintenant.

@Pronoe
Copy link

Pronoe commented Mar 11, 2024

Bonjour,
plus d'info sur ma config avec 2 compteurs dans Github : https://github.com/Pronoe/DUAL_TIC_LINKY_ESPHOME_HASS

@hartigoon
Copy link

hartigoon commented Mar 16, 2024

Bonjour,
Pour éviter de surcharger l'ESP il faudrait peut-être faire le traitement du registre depuis Home Assistant.
Cette approche sépare efficacement la collecte des données (gérée par ESPHome) et leur traitement/logique (géré par Home Assistant), permettant à chaque système de faire ce qu'il fait le mieux.

Exemple:
--> ESPHome

text_sensor:
  - platform: teleinfo
    tag_name: "STGE"
    name: "Linky Registre de Statuts"
    icon: mdi:information

--> Home Assistant

template:
  - sensor:
      - name: "Organe de coupure"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit1 = stge | bitwise_and(2) %}
          {% set bit2 = stge | bitwise_and(4) %}
          {% set bit3 = stge | bitwise_and(8) %}
          {% set combined = (bit3 > 0) * 4 + (bit2 > 0) * 2 + (bit1 > 0) %}
          {% if combined == 0 %}
            fermé
          {% elif combined == 1 %}
            ouvert sur surpuissance
          {% elif combined == 2 %}
            ouvert sur surtension
          {% elif combined == 3 %}
            ouvert sur délestage
          {% elif combined == 4 %}
            ouvert sur ordre CPL ou Euridis
          {% elif combined == 5 %}
            ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal
          {% elif combined == 6 %}
            ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal
          {% endif %}

@mathieucarbou
Copy link
Author

mathieucarbou commented Mar 16, 2024

C'est ce que je fais aussi et conseille. Mais je le fais différemment:

ESPHome:

  # Nom du calendrier tarifaire fournisseur
  - platform: teleinfo
    tag_name: "NGTF"
    name: "Linky Calendrier Tarifaire"
    icon: mdi:information
  # Libellé tarif fournisseur en cours
  - platform: teleinfo
    tag_name: "LTARF"
    name: "Linky Tarif Actuel"
    icon: mdi:information

HA:

      - name: Linky Calendrier Tarifaire Trimmed
        unique_id: "01e37eed-3045-4eee-a786-1249567fe700"
        state: "{{ states.sensor.linky_calendrier_tarifaire.state | trim }}"

      - name: Linky Tarif Actuel Trimmed
        unique_id: "01e37eed-3045-4eee-a786-1249567fe701"
        state: "{{ states.sensor.linky_tarif_actuel.state | trim | replace('  ', ' ') }}"

      - name: Linky Tarif Actuel Energy Meter
        unique_id: "01e37eed-3045-4eee-a786-1249567fe702"
        availability: "{{ states.sensor.linky_tarif_actuel_trimmed.state | upper in ['HP BLEU', 'HC BLEU', 'HP BLANC', 'HC BLANC', 'HP ROUGE', 'HC ROUGE'] }}"
        state: |-
          {% set l = states.sensor.linky_tarif_actuel_trimmed.state | upper %}
          {% if l == "HP BLEU" %}EDF Tempo Bleu HP
          {% elif l == "HC BLEU" %}EDF Tempo Bleu HC
          {% elif l == "HP BLANC" %}EDF Tempo Blanc HP
          {% elif l == "HC BLANC" %}EDF Tempo Blanc HC
          {% elif l == "HP ROUGE" %}EDF Tempo Rouge HP
          {% elif l == "HC ROUGE" %}EDF Tempo Rouge HC
          {% else %}unavailable
          {% endif %}

Je n'avais rien vu permettant de faire facilement un trim sur la sortie du Linky directement à même ESPHome, sauf à passer par du code c++, donc j'ai dupliqué ces capteurs.

Également ces 3 capteurs me servent juste à renommer correctement, car auparavant j'utilisais ces noms là ailleurs (EDF Tempo Bleu HP, etc)

@hartigoon
Copy link

hartigoon commented Mar 16, 2024

J'ai modifié mon commentaire précédant par une solution que j'ai testé. L'idée est de passer par un template avec l'utilisation de filtres bitwise_and pour les opérations sur les bits dans Home Assistant, il convertit la logique du code de registre de Statuts impliquant un switch basé sur une combinaison de bits. Cette logique combine plusieurs bits en un seul nombre, puis sélectionne un état basé sur ce nombre.

En effet, la logique suivante (bien que fonctionnelle) met l'ESP32 à genou et génère l'erreur Components should block for at most 20-30ms

  # Registre de Statuts
   - platform: teleinfo
     tag_name: "STGE"
     id: "STGE"
     name: "Linky Registre de Statuts"
     icon: mdi:information
     internal: True
     on_value:
       then:
         - lambda: |-
             std::bitset<32> stge = std::bitset<32>(strtol(id(STGE).state.c_str(), NULL, 16)); 
            ...

@hartigoon
Copy link

hartigoon commented Mar 17, 2024

Voici le code complet. De quoi soulager votre ESP32, en espérant ne pas avoir fait d'erreur ;)

ESPHome:

text_sensor:
  # Registre de Statuts
  - platform: teleinfo
    tag_name: "STGE"
    name: "Linky Registre de Statuts"
    icon: mdi:information

Votre configuration.yaml sur Home Assistant:

template:
  - sensor:
  # bit 0
      - name: "Linky: Contact sec"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set ouverture = stge | bitwise_and(1) %}
          {{ 'Ouvert' if ouverture > 0 else 'Fermé' }}

  # bits 1 (LSB) à 3 (MSB)
      - name: "Linky: Organe de coupure"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit1 = stge | bitwise_and(2) %}
          {% set bit2 = stge | bitwise_and(4) %}
          {% set bit3 = stge | bitwise_and(8) %}
          {% set combined = (bit3 > 0) * 4 + (bit2 > 0) * 2 + (bit1 > 0) %}
          {% if combined == 0 %}
            fermé
          {% elif combined == 1 %}
            ouvert sur surpuissance
          {% elif combined == 2 %}
            ouvert sur surtension
          {% elif combined == 3 %}
            ouvert sur délestage
          {% elif combined == 4 %}
            ouvert sur ordre CPL ou Euridis
          {% elif combined == 5 %}
            ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal
          {% elif combined == 6 %}
            ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal
          {% endif %}

  # bit 4
      - name: "Linky: État du cache-bornes distributeur"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set is_open = stge | bitwise_and(16) %}
          {{ 'Ouvert' if is_open > 0 else 'Fermé' }}

  # bit 6
      - name: "Linky: Surtension sur une des phases"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set surtension = stge | bitwise_and(32) %}
          {{ 'Surtension' if surtension > 0 else 'Pas de surtension' }}

  # bit 7
      - name: "Linky: Dépassement de la puissance de référence"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set depassement = stge | bitwise_and(128) %}
          {{ 'Dépassement en cours' if depassement > 0 else 'Pas de dépassement' }}

  # bit 8
      - name: "Linky: Fonctionnement producteur/consommateur"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set role = stge | bitwise_and(256) %}
          {{ 'Producteur' if role > 0 else 'Consommateur' }}

  # bit 9
      - name: "Linky: Sens de l'énergie active"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set energie_active = stge | bitwise_and(512) %}
          {{ 'Énergie active négative' if energie_active > 0 else 'Énergie active positive' }}

  # bits 10 (LSB) à 13 (MSB)
      - name: "Linky: Tarif en cours sur le contrat fourniture"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit10 = stge | bitwise_and(1024) %}
          {% set bit11 = stge | bitwise_and(2048) %}
          {% set bit12 = stge | bitwise_and(4096) %}
          {% set bit13 = stge | bitwise_and(8192) %}
          {% set combined = (bit13 // 8192) * 8 + (bit12 // 4096) * 4 + (bit11 // 2048) * 2 + (bit10 // 1024) %}
          {% if combined == 0 %}
            Énergie ventilée sur Index 1
          {% elif combined == 1 %}
            Énergie ventilée sur Index 2
          {% elif combined == 2 %}
            Énergie ventilée sur Index 3
          {% elif combined == 3 %}
            Énergie ventilée sur Index 4
          {% elif combined == 4 %}
            Énergie ventilée sur Index 5
          {% elif combined == 5 %}
            Énergie ventilée sur Index 6
          {% elif combined == 6 %}
            Énergie ventilée sur Index 7
          {% elif combined == 7 %}
            Énergie ventilée sur Index 8
          {% elif combined == 8 %}
            Énergie ventilée sur Index 9
          {% elif combined == 9 %}
            Énergie ventilée sur Index 10
          {% endif %}

  # bits 14 (LSB) et 15 (MSB)
      - name: "Linky: Tarif en cours sur le contrat distributeur"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit14 = stge | bitwise_and(16384) %}
          {% set bit15 = stge | bitwise_and(32768) %}
          {% set combined = (bit15 // 32768) * 2 + (bit14 // 16384) %}
          {% if combined == 0 %}
            Énergie ventilée sur Index 1
          {% elif combined == 1 %}
            Énergie ventilée sur Index 2
          {% elif combined == 2 %}
            Énergie ventilée sur Index 3
          {% elif combined == 3 %}
            Énergie ventilée sur Index 4
          {% endif %}

  # bit 16
      - name: "Linky: Mode dégradée de l’horloge"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set horloge_status = stge | bitwise_and(65536) %}
          {{ 'Horloge en mode dégradée' if horloge_status > 0 else 'Horloge correcte' }}

  # bit 17
      - name: "Linky: État de la sortie télé-information"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set mode_operatoire = stge | bitwise_and(131072) %}
          {{ 'Mode standard' if mode_operatoire > 0 else 'Mode historique' }}

  # bits 19 (LSB) et 20 (MSB)
      - name: "Linky: Fonctionnalité Sécurité Status"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit19 = stge | bitwise_and(524288) %}
          {% set bit20 = stge | bitwise_and(1048576) %}
          {% set combined = (bit20 // 1048576) * 2 + (bit19 // 524288) %}
          {% if combined == 0 %}
            désactivée
          {% elif combined == 1 %}
            activée sans sécurité
          {% elif combined == 3 %}
            activée avec sécurité
          {% endif %}

  # bits 21 (LSB) et 22 (MSB)
      - name: "Linky: Statut du CPL"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit21 = stge | bitwise_and(2097152) %}
          {% set bit22 = stge | bitwise_and(4194304) %}
          {% set combined = (bit22 // 4194304) * 2 + (bit21 // 2097152) %}
          {% if combined == 0 %}
            New/Unlock
          {% elif combined == 1 %}
            New/Lock
          {% elif combined == 2 %}
            Registered
          {% endif %}

  # bit 23
      - name: "Linky: Synchronisation CPL"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set sync_status = stge | bitwise_and(8388608) %}
          {{ 'Compteur synchronisé' if sync_status > 0 else 'Compteur non synchronisé' }}

  # bits 24 (LSB) et 25 (MSB)
      - name: "Linky: Couleur du jour"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit24 = stge | bitwise_and(16777216) %}
          {% set bit25 = stge | bitwise_and(33554432) %}
          {% set combined = (bit25 // 33554432) * 2 + (bit24 // 16777216) %}
          {% if combined == 0 %}
            Pas d'annonce
          {% elif combined == 1 %}
            Bleu
          {% elif combined == 2 %}
            Blanc
          {% elif combined == 3 %}
            Rouge
          {% endif %}

  # bits 26 (LSB) et 27 (MSB)
      - name: "Linky: Couleur du lendemain"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit26 = stge | bitwise_and(67108864) %}
          {% set bit27 = stge | bitwise_and(134217728) %}
          {% set combined = (bit27 // 134217728) * 2 + (bit26 // 67108864) %}
          {% if combined == 0 %}
            Pas d'annonce
          {% elif combined == 1 %}
            Bleu
          {% elif combined == 2 %}
            Blanc
          {% elif combined == 3 %}
            Rouge
          {% endif %}

  # bit 28 (LSB) à 29 (MSB)
      - name: "Linky: Préavis pointes mobiles"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit28 = stge | bitwise_and(268435456) %}
          {% set bit29 = stge | bitwise_and(536870912) %}
          {% set combined = (bit29 // 536870912) * 2 + (bit28 // 268435456) %}
          {% if combined == 0 %}
            Pas de préavis en cours
          {% elif combined == 1 %}
            Préavis PM1 en cours
          {% elif combined == 2 %}
            Préavis PM2 en cours
          {% elif combined == 3 %}
            Préavis PM3 en cours
          {% endif %}

  # bit 30 (LSB) à 31 (MSB)
      - name: "Linky: Pointe mobile (PM)"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit30 = stge | bitwise_and(1073741824) %}
          {% set bit31 = stge | bitwise_and(2147483648) %}
          {% set combined = (bit31 // 2147483648) * 2 + (bit30 // 1073741824) %}
          {% if combined == 0 %}
            Pas de pointe mobile
          {% elif combined == 1 %}
            PM1 en cours
          {% elif combined == 2 %}
            PM2 en cours
          {% elif combined == 3 %}
            PM3 en cours
          {% endif %}

@mathieucarbou
Copy link
Author

mathieucarbou commented Mar 17, 2024

hartigoon merci pour l'ajout: c'est très complet!

J'utilise RTE pour la couleur du lendemain, qui est connue souvent le matin très tôt, je suis curieux de savoir à quelle heure le Linky donne la couleur du lendemain.

@mathieucarbou
Copy link
Author

mathieucarbou commented Mar 17, 2024

@hartigoon : alors je me suis permis de tester tout ]a avec de légères modifs. Je confirme que RTE connais déjà la couleur du lendemain à 9h30 mais pas le Linky ;-)

template:
  # https://www.home-assistant.io/integrations/sensor/
  - sensor:
      - name: "Linky: Tarif Actuel Energy Meter"
        unique_id: "01e37eed-3045-4eee-a786-1249567fe702"
        availability: "{{states.sensor.linky_tarif_actuel.state | trim | replace('  ', ' ') | upper in ['HP BLEU', 'HC BLEU', 'HP BLANC', 'HC BLANC', 'HP ROUGE', 'HC ROUGE'] }}"
        state: |-
          {% set l = states.sensor.linky_tarif_actuel.state | trim | replace('  ', ' ') | upper %}
          {% if l == "HP BLEU" %}EDF Tempo Bleu HP
          {% elif l == "HC BLEU" %}EDF Tempo Bleu HC
          {% elif l == "HP BLANC" %}EDF Tempo Blanc HP
          {% elif l == "HC BLANC" %}EDF Tempo Blanc HC
          {% elif l == "HP ROUGE" %}EDF Tempo Rouge HP
          {% elif l == "HC ROUGE" %}EDF Tempo Rouge HC
          {% else %}unavailable
          {% endif %}

      # bits 1 (LSB) à 3 (MSB)
      - name: "Linky: Organe de coupure"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit1 = stge | bitwise_and(2) %}
          {% set bit2 = stge | bitwise_and(4) %}
          {% set bit3 = stge | bitwise_and(8) %}
          {% set combined = (bit3 > 0) * 4 + (bit2 > 0) * 2 + (bit1 > 0) %}
          {% if combined == 0 %}
            Fermé
          {% elif combined == 1 %}
            Ouvert sur surpuissance
          {% elif combined == 2 %}
            Ouvert sur surtension
          {% elif combined == 3 %}
            Ouvert sur délestage
          {% elif combined == 4 %}
            Ouvert sur ordre CPL ou Euridis
          {% elif combined == 5 %}
            Ouvert sur une surchauffe avec une valeur du courant supérieure au courant de commutation maximal
          {% elif combined == 6 %}
            Ouvert sur une surchauffe avec une valeur de courant inférieure au courant de commutation maximal
          {% endif %}

      # bit 8
      - name: "Linky: Fonctionnement producteur/consommateur"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set role = stge | bitwise_and(256) %}
          {{ 'Producteur' if role > 0 else 'Consommateur' }}

      # bit 9
      - name: "Linky: Sens de l'énergie active"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set energie_active = stge | bitwise_and(512) %}
          {{ 'Énergie active négative' if energie_active > 0 else 'Énergie active positive' }}

      # bits 10 (LSB) à 13 (MSB)
      - name: "Linky: Tarif en cours sur le contrat fourniture"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit10 = stge | bitwise_and(1024) %}
          {% set bit11 = stge | bitwise_and(2048) %}
          {% set bit12 = stge | bitwise_and(4096) %}
          {% set bit13 = stge | bitwise_and(8192) %}
          {% set combined = (bit13 // 8192) * 8 + (bit12 // 4096) * 4 + (bit11 // 2048) * 2 + (bit10 // 1024) %}
          Index {{ combined + 1 }}

      # bits 14 (LSB) et 15 (MSB)
      - name: "Linky: Tarif en cours sur le contrat distributeur"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit14 = stge | bitwise_and(16384) %}
          {% set bit15 = stge | bitwise_and(32768) %}
          {% set combined = (bit15 // 32768) * 2 + (bit14 // 16384) %}
          Index {{ combined + 1 }}

      # bit 17
      - name: "Linky: État de la sortie télé-information"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set mode_operatoire = stge | bitwise_and(131072) %}
          {{ 'Mode standard' if mode_operatoire > 0 else 'Mode historique' }}

      # bits 19 (LSB) et 20 (MSB)
      - name: "Linky: Fonctionnalité Sécurité Status"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit19 = stge | bitwise_and(524288) %}
          {% set bit20 = stge | bitwise_and(1048576) %}
          {% set combined = (bit20 // 1048576) * 2 + (bit19 // 524288) %}
          {% if combined == 0 %}
            Désactivée
          {% elif combined == 1 %}
            Activée sans sécurité
          {% elif combined == 3 %}
            Activée avec sécurité
          {% endif %}

      # bits 21 (LSB) et 22 (MSB)
      - name: "Linky: Statut du CPL"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit21 = stge | bitwise_and(2097152) %}
          {% set bit22 = stge | bitwise_and(4194304) %}
          {% set combined = (bit22 // 4194304) * 2 + (bit21 // 2097152) %}
          {% if combined == 0 %}
            New/Unlock
          {% elif combined == 1 %}
            New/Lock
          {% elif combined == 2 %}
            Registered
          {% endif %}

      # bits 24 (LSB) et 25 (MSB)
      - name: "Linky: Couleur du jour"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit24 = stge | bitwise_and(16777216) %}
          {% set bit25 = stge | bitwise_and(33554432) %}
          {% set combined = (bit25 // 33554432) * 2 + (bit24 // 16777216) %}
          {% if combined == 0 %}
            Pas d'annonce
          {% elif combined == 1 %}
            Bleu
          {% elif combined == 2 %}
            Blanc
          {% elif combined == 3 %}
            Rouge
          {% endif %}

      # bits 26 (LSB) et 27 (MSB)
      - name: "Linky: Couleur du lendemain"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit26 = stge | bitwise_and(67108864) %}
          {% set bit27 = stge | bitwise_and(134217728) %}
          {% set combined = (bit27 // 134217728) * 2 + (bit26 // 67108864) %}
          {% if combined == 0 %}
            Pas d'annonce
          {% elif combined == 1 %}
            Bleu
          {% elif combined == 2 %}
            Blanc
          {% elif combined == 3 %}
            Rouge
          {% endif %}

      # bit 28 (LSB) à 29 (MSB)
      - name: "Linky: Préavis pointes mobiles"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit28 = stge | bitwise_and(268435456) %}
          {% set bit29 = stge | bitwise_and(536870912) %}
          {% set combined = (bit29 // 536870912) * 2 + (bit28 // 268435456) %}
          {% if combined == 0 %}
            Pas de préavis en cours
          {% elif combined == 1 %}
            Préavis PM1 en cours
          {% elif combined == 2 %}
            Préavis PM2 en cours
          {% elif combined == 3 %}
            Préavis PM3 en cours
          {% endif %}

      # bit 30 (LSB) à 31 (MSB)
      - name: "Linky: Pointe mobile (PM)"
        state: >
          {% set stge = states('sensor.linky_registre_de_statuts') | int(base=16) %}
          {% set bit30 = stge | bitwise_and(1073741824) %}
          {% set bit31 = stge | bitwise_and(2147483648) %}
          {% set combined = (bit31 // 2147483648) * 2 + (bit30 // 1073741824) %}
          {% if combined == 0 %}
            Pas de pointe mobile
          {% elif combined == 1 %}
            PM1 en cours
          {% elif combined == 2 %}
            PM2 en cours
          {% elif combined == 3 %}
            PM3 en cours
          {% endif %}

  - binary_sensor:
      # bit 0
      - name: "Linky: Contact sec"
        device_class: plug
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(1) == 0 }}"

      # bit 4
      - name: "Linky: État du cache-bornes distributeur"
        device_class: opening
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(16) == 1 }}"

      # bit 6
      - name: "Linky: Problème de surtension sur une des phases"
        device_class: problem
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(32) == 1 }}"

      # bit 7
      - name: "Linky: Problème de dépassement de la puissance de référence"
        device_class: problem
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(128) == 1 }}"

      # bit 16
      - name: "Linky: Problème de de dégradation de l'horloge interne"
        device_class: problem
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(65536) == 1 }}"

      # bit 23
      - name: "Linky: Compteur synchronisé"
        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(8388608) == 1 }}"

Ça fonctionne bien, mais j'ai une grosse inconnue par rapport à Linky: Synchronisation CPL.

La spec d'Enedis est très avare en doc sur le CPL, et la seule info est:
image
Hors d'habitude, le bit à 1 signifie une erreur (horloge, dépassement puissance, etc)...

Chez moi, le Statut du CPL est à New/Lock.

Donc j'ai inversé la condition dans mon template:

Selon la spec:

        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(8388608) == 0 }}"

J'ai mis:

        state: "{{ states('sensor.linky_registre_de_statuts') | int(base=16) | bitwise_and(8388608) == 1 }}"

Je ne sais pas trop si c'est une erreur du document, ou bien si c'est normal d'avoir le CPL désynchronisé en permanence...

@mathieucarbou
Copy link
Author

Ah, ce document répond à la question: https://www.poal.fr/appfree/img/pdf/ERDF-CPT-Linky-SPEC-FONC-CPL_Specifications_fonctionnelles_du_profil_CPL_Linky.pdf

En réalité, l'état ’compteur non synchronisé’ n'Est pas une erreur car le compteur est en processus de synchro lorsqu'il es en new / lock. Donc c'est un on / off normal et non un probléme.

Je corrige.

@hartigoon
Copy link

Le compteur Linky se synchronise généralement une fois par jour au concentrateur. Mais cela peut varier selon les usages ou les fournisseurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment