Skip to content

Instantly share code, notes, and snippets.

@mathieucarbou
Last active October 6, 2024 23:35
Show Gist options
  • 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"
@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.

@ArnieO
Copy link

ArnieO commented Aug 8, 2024

EDIT: Corrected link to Enedis document

Bonjour!
(Désolé pour des erreurs orthos eventuelles, je ne suis pas Francais.)

J'essaye de comprendre les differentes données livrés du Linky (ref: Enedis-NOI-CPT_54E).

  • Je ne trouve pas dans le tableau du paragraphe 6.2.2. de données pour Puissance active en W, mais un nombre de paramètres sur la Puissance apparente en VA. Est-on obligé de calculer Puissance active à partir des autres données?
  • Merci de m'aider à comprendre "Point n de la courbe de charge active" etc. C'est quoi?

image

@mathieucarbou
Copy link
Author

@ArnieO :

  • Puissance apparente S en VA
  • Puissance active P en Watts W
  • Facteur puissance PF (interval ]0, 1])

On a:

P = S * PF

Le Linky n'expose pas la puissance active.

Il expose la puissance apparente, qui représente la puissance qui circule à travers les fils et qui est la puissance à utiliser pour dimensionner les circuits électriques.

La puissance active est celle réellement consommée par les électromnagers: certains, comme les machines à laver (moteur) ou four à induction, donc des charges réactives, c'est-à dire que beaucoup de courant circule à travers elles, mais elles ne consommes pas tout (PF < 1).

Le Linky expose uniquement des relevés de la puissance active de la période en cours et celle précédente. Ce n'est pas utile.

Pour mesurer la puissance active en Watts réellement consommée, il faut par exemple un Shelly EM et mettre sa pince de mesure autour de la phase qui entre dans le tableau.

image

@ArnieO
Copy link

ArnieO commented Aug 8, 2024

Merci pour votre réponse claire et complète!

On est bien d'accord que la puissance apparente est ce qui circule, et est nécessaire pour dimensionner les circuits. Mais un consommateur (privé) ne paie que l’énergie active, pas la partie réactive.

Notre société a développe et mis en vente (voir https://amsleser.no) un solution pour lire les données de plusieurs interfaces "standard" utilisées sur compteurs dans un nombre de pays Européens, vendu aux consommateurs privées. L'appareil génère un tableau de bord sur une page web sur une adresse IP interne, et transmettra éventuellement aussi les données via MQTT. Pas d'abonnement, tous données gérés en interne par l'utilisateur.
Notre firmware: https://github.com/UtilitechAS/amsreader-firmware
Guide d'exploitation du firmware: https://wiki.amsleser.no/en/firmware
Distribution géographique de nos clients: https://www.amsleser.no/module/ets_blog/blog?id_post=11

On est en train de considérer si on devrait développer un produit pour lire les Linky. Pour nos clients c'est typiquement l'énergie active qui est le plus intéressant - car c'est ce qu'on trouve sur la facture.

Je ne trouve pas dans la liste de paramètres dans le document Enedis le Facteur de puissance, cos(phi) non plus.
Votre logiciel montre la puissance active, c'est donc à partir d'un Shelly EM? Ou peut-on le calculer à partir des données sortant du Linky?
image

Je vois bien que Linky donne tension et courant RMS, mais dans un système triphasé la somme des (I * U) ne donne pas la bonne réponse que si les charges sont égaux sur les trois phases - ce qui n'est "jamais" le cas.

@mathieucarbou
Copy link
Author

mathieucarbou commented Aug 8, 2024

Mais un consommateur (privé) ne paie que l’énergie active, pas la partie réactive.

Exact.

Pour nos clients c'est typiquement l'énergie active qui est le plus intéressant - car c'est ce qu'on trouve sur la facture.

En effet, mais le Linky n'expose pas ces données: ni le PF, ni la puissance active. Je suis allé voir le projet, super, basé sur ESP (je fais pas mal de développement ESP aussi - j'ai ma clé Linky aussi). Une solution du coup pour la France est de coupler la solution avec un PZEM ou tore de mesure.

à savoir aussi, le Linky ne donne pas les puissances injectées sur le réseau (ni l'énergie injectée). C'est uniquement réservé aux compteur dédiés à la production solaire (mode producteur).

Les consommateurs normaux n'ont donc pas le choix que de d'utiliser vers un Shelly EM par exemple pour avoir:

  • PF
  • puissance active
  • énergie et puissance injectée

Actuellement en France, toutes les solutions commerciales qui se basent sur le Linky et affichent des Watts en fait les prennent du VA (puissance apparente). Beaucoup de gens se font avoir et ne le savent pas. Certaines solutions commencent à sortir avec un tore de mesure en plus mais c'est tout récent.

@ArnieO
Copy link

ArnieO commented Aug 8, 2024

Merci de tes précisions, mais cela est vraiment surprenant.

Oui, on est actuellement sur un ESP32-S2 (car pas besoin de BLE).

Si les solutions commerciales en France affichent Watts en prenant le chiffre VA, le seul avantage est que le puissance est toujours sur estimé (Puss App >= Puiss Act). Et le paramètre EAST donne au moins le bon chiffre pour les kWh.

L'idée de livrer avec un PZEM / tore de mesure ne me plais pas du tout. Il faut être compétent pour bricoler la-dedans (potentiellement risqué).

Tu dis que le Linky ne donne pas les puissances injectées sur le réseau (qui aussi est surprenant). Il y a donc un autre gamme de compteur pour des installations avec production solaire?

Tous les compteurs qu'on supporte avec notre solution donnent le production (puissance et énergie) dans des paramètres séparés. Le plus souvent comme un chiffre "net" (export/"injectée" ou import/"soutirée" est toujours zero), mais certains gammes de compteurs triphasés peuvent indiquer les deux puissances au même temps, si il y a injection sur une phase et soutirage sur un autre phase.

Encore merci beaucoup: vos informations sont importants pour notre évaluation!

@ArnieO
Copy link

ArnieO commented Aug 8, 2024

Après avoir réfléchi, je ne comprends pas le solution CT. Ils ne font que mesurer le courant par phase, et c'est un information déjà livré par le Linky, non?
image

A mon avis, on ne peut pas faire une bonne calcule de Puissance active à partir des trois U et I dans un installation triphasé que dans le cas ou les charges ("load") sont balancés entre les phases - ce qui est rarement le cas dans un installation privé.

Cela va uniquement fonctionner bien dans un installation monophasé.

Ou je me trompe?

@mathieucarbou
Copy link
Author

@ArnieO :

Il y a donc un autre gamme de compteur pour des installations avec production solaire?

C'est le même, mais Enedis active par CPL à distance une option pour le faire changer de mode afin qu'il compte l'injection et l'expose. Seuls les personnes ayant une production solaire dédiés à la revente totale (donc non en auto-consommaton) ont accès au mode producteur du Linky.

Ils ne font que mesurer le courant par phase, et c'est un information déjà livré par le Linky, non?

IRMS1 est dispo en modo, et IRMS1,2,3 en tri. Mais c'est une indication, pas une mesure. Regarde le graphe que ça donne. Ce sont des paliers d'intensité pris à des longs intervalles:

image

Ça fait des années que des pros s'y collent ;-) La seule solution pour mesurer la puissance active et PF, c'est le tore comme un Shelly EM. Et un PZEM en plus ne mesurerait que dans un sens (la consommation), mais pas les deux. Un JSY peut faire les deux, ou un truc custom.

Du coup les solutions sont de coupler la solution avec une pince ou alors de faire une solution basée sur un capteur à effet de Hall comme ce que fait une solution commericale.

@ArnieO
Copy link

ArnieO commented Aug 8, 2024

Ça fait des années que des pros s'y collent ;-)

Je te crois!

Regarde le graphe que ça donne.

Effectivement, c'est vraiment décevant - et pas utile du tout quand le résolution est 1A.
Le Linky ne cesse pas de surprendre de façon négatif.
Il y a une multitude de bons compteurs sur le marché - et Enedis a choisi ça.

@mathieucarbou
Copy link
Author

Comme tu dis...

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