HA-Teleinformation Linky-Mode Historique

Intro

C’est fait, j’ai enfin câblé la télé information de mon compteur Linky. Rien de bien méchant il suffit de se raccorder aux bornes i1/i2 du linky, le plus délicat fut le passage du câble de 60 ml entre le compteur Linky et mon tableau électrique.

Cet article traite le mode « Historique » du linky, il peut également communiqué en mode « Standard » plus élaboré, voir mon article sur le sujet.

Raccordement du Linky

Pré requis

Mes fichiers « .yaml » sont regroupés dans un dossier « config/packages ». J’utilise la directive « !include_dir_named packages » dans mon « configuration.yaml » très pratique pour organiser son HA.

Choix du matériel

Les informations transmises par le Linky ne sont pas directement exploitables par un ESP, elles nécessitent un adaptateur, vous trouverez beaucoup de modèles sur le Net, perso j’ai choisi la facilité en achetant un module Wemos Teleinfo.

WeMos Teleinfo 2

C’est un module pas très cher, correctement étudié et bien fini, compatible avec les esp8266 et ESP32 Mini, qui dispose également d’une Led WS2812 RGB programmable, d’un connecteur I2C disponible pour un afficheur OLED ou autres capteurs compatibles, et d’une led indiquant l’état de la connexion avec le Linky qui se raccorde sur le bornier vert.

Perso j’utilise un L’ESP32 Mini ou ici , en effet l’ESP8266 est trop juste en puissance de calcul si on utilise l’intégration ESPHOME plus un afficheur, j’ai galéré avec, je ne le recommande pas, le constructeur du wemos téléinfo non plus d’ailleurs.

L’ESP32 Mini est un ESP32 au format ESP8266 D1, pratique si l’on souhaite utiliser des cartes d’extension, mais avec une puissance de calcul et de traitement bien supérieure.

Descriptif fonctionnel

Les compteurs Linky disposent de 2 modes de téléinformation :
• Le mode Historique, qui correspond à l’ancien mode des compteurs électroniques.
• Le mode Standard, qui est le nouveau format et qui comporte plus d’informations.

Vous trouverez les informations détaillées dans le document Enedis suivant:

J’ai utilisé dans un premier temps le mode historique du Linky, puis je suis passé au mode standard, le nombre d’informations disponibles est plus élevés, voir mon article sur le sujet.

Le module WEMOS Teleinfo est compatible, le changement de mode passe obligatoirement par une demande auprès de votre fournisseur d’énergie qui relaye vers Enedis.

Concernant l’intégration dans HA, pas de problème particulier grâce à « teleinfo » disponible sur ESP Home, il est compatible avec les deux modes, les différences étant dans la vitesse de transmission et la validation du mode historique ou pas:

Mode Historique

Mode Standard

Informations collectées

Pour information le linky, dans l’entité « PAPP », remonte des VoltAmpére et non des Watt ».

Je collecte les énergies Heures creuses « HCHC » et heures pleines »HPHC » en wh, je les additionne dans un « template » (Linky HPHC KWH) et divise par 1000 pour obtenir des kWh. C’est cette entité que j’utilise dans les « utility meter » de HA pour calculer mes consommations journalière, semaine, mois, année.

Si vous avez un seul tarif, il faut remonter le tag « base à la place de HCHP et HPHP »

Je collecte également l’intensité instantanée « IINST » et l’intensité souscrite « ISOUSC », je calcule dans un « Template » « Linky I/Imax » le ratio entre les deux en %, ce qui me donne une idée de la réserve d’intensité disponible et plus tard, m’en servir pour vérifier si mon abonnement peut être revue à la baisse.

L’information PTEC nous indique si le tarif est en heure creuse ou heure pleine, variable utilisée dans l’automatisme de comptabilisation de l’énergie avec les « utility_meter ».

Code ESP

Si vous avez des difficultés de flashage avec ESPHome, parcourez mon article https://domo.rem81.com/home-assistant_esp-home/ cela devrait vous aider.

L’afficheur utilise une police de caractère « Arial », vous pouvez télécharger le fichier arial.ttf ici puis le transférer dans un dossier « fonts » de votre « /config/esphome ». Bien entendu vous pouvez utiliser une autre police de caractéres, « size » détermine la taille des caractères.

Double Tarif

substitutions:
  device_name: esp124-tic
  adress_ip: "192.168.0.124"
  friendly_name: esp124
  time_timezone: "Europe/Paris"
  
esphome:
  name: ${device_name}
  platform: ESP32
  board: mhetesp32minikit
  platformio_options:
    lib_deps: NeoPixelBus@2.6.0
  on_boot:
    then:
      - light.control:
          id: led1
          brightness: 0.25
          state: on
wifi:
  networks:
    - ssid: !secret wifi_esp
      password: !secret mdpwifi_esp
      priority: 1
    - ssid: !secret wifi
      password: !secret mdpwifi
      priority: 0
  reboot_timeout: 5min

  manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.0.1
    subnet: 255.255.255.0


# Enable logging
logger:
#  baud_rate: 0
# Enable Home Assistant API
api:

ota:

web_server:
  port: 80

font:
  - file: "fonts/arial.ttf"
    id: arial
    size: 15

i2c:
  sda: GPIO21 #D2=pin 19
  scl: GPIO22 #D1=pin 20
  scan: True
  id: bus_a
  
# 
uart:
  id: uart_a
  rx_pin: GPIO23
#  tx_pin: GPIO1
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

teleinfo:
  id: myteleinfo
  uart_id: uart_a
  update_interval: 10s
  historical_mode: true
  
# Led WS2812 RGB  
light:
  - platform: partition
    name: led1
    id: led1
    default_transition_length: 0s
    segments:
      - id: rgb_led
        from: 0
        to: 0

  - platform: neopixelbus
    num_leds: 1
    pin: GPIO18
    name: "RGB strip"
    variant: ws2812
    id: rgb_led
    default_transition_length: 0s  


sensor:
  - platform: teleinfo
    id: hchc
    tag_name: "HCHC"     # Si un seul tarif mettre "BASE" dans le tag_name
    name: "Linky HC Wh"  # Si un seul tarif: "Linky base Wh"
    unit_of_measurement: "Wh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    
  - platform: teleinfo  # A supprimer si un seul tarif
    id: hchp
    tag_name: "HCHP"
    name: "Linky HP Wh"
    unit_of_measurement: "Wh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
 
  - platform: teleinfo
    id: papp
    tag_name: "PAPP"
    name: "Linky PAPP"
    unit_of_measurement: "VA"
    device_class: "power"
    state_class: "measurement"  
    icon: mdi:flash
    teleinfo_id: myteleinfo
    on_value:
      - if:
          condition:
            sensor.in_range:
              id: papp
              below: 1000
          then: 
            - light.control:
                id: led1
                red: 0%
                green: 100% # vert
                blue: 0%
      - if:
          condition:
            sensor.in_range:
              id: papp
              above: 1000
              below: 3000
          then: 
            - light.control:
                id: led1
                red: 0%
                green: 0% # bleu
                blue: 100%
      - if:
          condition:
            sensor.in_range:
              id: papp
              above: 3000
          then: 
            - light.control:
                id: led1
                red: 100% #rouge
                green: 0%
                blue: 0%
           
    
  - platform: teleinfo
    id: isousc
    tag_name: "ISOUSC"
    name: "Linky I Sousc"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: teleinfo
    id: iinst
    tag_name: "IINST"
    name: "Linky I Inst"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: teleinfo
    id: imax
    tag_name: "IMAX"
    name: "linky I Max"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: template
    name: "Linky I/Imax"
    id: i100
    icon: mdi:flash
    unit_of_measurement: "%"
    accuracy_decimals: 0
    lambda: |-
      return (id(iinst).state/id(isousc).state*100);

  - platform: template
    name: "Linky HPHC KWH"
    id: hphc_kwh
    icon: mdi:flash
    unit_of_measurement: "kWh"
    accuracy_decimals: 0
    lambda: |-
      return ((id(hchc).state+id(hchp).state)/1000);
      
  - platform: homeassistant
    name: "HCHP J"
    unit_of_measurement: "kWh"
    entity_id: sensor.energie_totale_linky_jour
    id: hphcj

  - platform: wifi_signal
    id: wif
    name: "${friendly_name} WiFi Signal Sensor"
    update_interval: 60s
    
  - platform: uptime
    id: uptime_seconds
    name: "${friendly_name} Uptime"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer

text_sensor:
  - platform: teleinfo
    tag_name: "OPTARIF"
    name: "Linky OPTARIF"
    teleinfo_id: myteleinfo
    
  - platform: teleinfo
    tag_name: "PTEC"
    id: tarif
    name: "Linky PTEC"
    teleinfo_id: myteleinfo

  - platform: template
    name: "${friendly_name} Uptime"
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
      int seconds = (id(uptime_seconds).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else {
        return { (String(seconds) +"s").c_str() };
      }

#Etat de la connection
binary_sensor:
  - platform: status
    name: "${friendly_name} Status"

switch:   
  - platform: restart
    name: "${friendly_name} Restart"


display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    brightness: 100%
    lambda: |-
      it.printf(0,0,id(arial),"PuC=%.0f VA",id(papp).state);
      it.printf(0,15,id(arial),"I Inst=%.0f A",id(iinst).state);
      it.printf(70,15,id(arial),"-%.0f %%",id(i100).state);
      it.printf(0,30,id(arial),"ConsoJ=%.0f kWh",id(hphcj).state);
      std::string tarif_ = id(tarif).state;
      it.printf(0,45,id(arial), "Tarif: %s", tarif_.c_str());  
      
   

Simple tarif:

substitutions:
  device_name: esp124-tic
  adress_ip: "192.168.0.124"
  friendly_name: esp124
  time_timezone: "Europe/Paris"
  
esphome:
  name: ${device_name}
  platform: ESP32
  board: mhetesp32minikit
  platformio_options:
    lib_deps: NeoPixelBus@2.6.0
  on_boot:
    then:
      - light.control:
          id: led1
          brightness: 0.25
          state: on
wifi:
  networks:
    - ssid: !secret wifi_esp
      password: !secret mdpwifi_esp
      priority: 1
    - ssid: !secret wifi
      password: !secret mdpwifi
      priority: 0
  reboot_timeout: 5min

  manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.0.1
    subnet: 255.255.255.0


# Enable logging
logger:
#  baud_rate: 0
# Enable Home Assistant API
api:

ota:

web_server:
  port: 80

font:
  - file: "fonts/arial.ttf"
    id: arial
    size: 15

i2c:
  sda: GPIO21 #D2=pin 19
  scl: GPIO22 #D1=pin 20
  scan: True
  id: bus_a
  
# 
uart:
  id: uart_a
  rx_pin: GPIO23
#  tx_pin: GPIO1
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

teleinfo:
  id: myteleinfo
  uart_id: uart_a
  update_interval: 10s
  historical_mode: true
  
# Led WS2812 RGB  
light:
  - platform: partition
    name: led1
    id: led1
    default_transition_length: 0s
    segments:
      - id: rgb_led
        from: 0
        to: 0

  - platform: neopixelbus
    num_leds: 1
    pin: GPIO18
    name: "RGB strip"
    variant: ws2812
    id: rgb_led
    default_transition_length: 0s  


sensor:
  - platform: teleinfo
    id: base
    tag_name: "BASE"     
    name: "Linky base Wh"  
    unit_of_measurement: "Wh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    

  - platform: teleinfo
    id: papp
    tag_name: "PAPP"
    name: "Linky PAPP"
    unit_of_measurement: "VA"
    device_class: "power"
    state_class: "measurement"  
    icon: mdi:flash
    teleinfo_id: myteleinfo
    on_value:
      - if:
          condition:
            sensor.in_range:
              id: papp
              below: 1000
          then: 
            - light.control:
                id: led1
                red: 0%
                green: 100% # vert
                blue: 0%
      - if:
          condition:
            sensor.in_range:
              id: papp
              above: 1000
              below: 3000
          then: 
            - light.control:
                id: led1
                red: 0%
                green: 0% # bleu
                blue: 100%
      - if:
          condition:
            sensor.in_range:
              id: papp
              above: 3000
          then: 
            - light.control:
                id: led1
                red: 100% #rouge
                green: 0%
                blue: 0%
           
    
  - platform: teleinfo
    id: isousc
    tag_name: "ISOUSC"
    name: "Linky I Sousc"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: teleinfo
    id: iinst
    tag_name: "IINST"
    name: "Linky I Inst"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: teleinfo
    id: imax
    tag_name: "IMAX"
    name: "linky I Max"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

  - platform: template
    name: "Linky I/Imax"
    id: i100
    icon: mdi:flash
    unit_of_measurement: "%"
    accuracy_decimals: 0
    lambda: |-
      return (id(iinst).state/id(isousc).state*100);

  - platform: homeassistant
    name: "Conso J"
    unit_of_measurement: "kWh"
    entity_id: sensor.energie_totale_linky_jour
    id: conso

  - platform: wifi_signal
    id: wif
    name: "${friendly_name} WiFi Signal Sensor"
    update_interval: 60s
    
  - platform: uptime
    id: uptime_seconds
    name: "${friendly_name} Uptime"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer

text_sensor:

  - platform: template
    name: "${friendly_name} Uptime"
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
      int seconds = (id(uptime_seconds).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else {
        return { (String(seconds) +"s").c_str() };
      }

#Etat de la connection
binary_sensor:
  - platform: status
    name: "${friendly_name} Status"

switch:   
  - platform: restart
    name: "${friendly_name} Restart"


display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    brightness: 100%
    lambda: |-
      it.printf(0,0,id(arial),"PuC=%.0f VA",id(papp).state);
      it.printf(0,15,id(arial),"I Inst=%.0f A",id(iinst).state);
      it.printf(70,15,id(arial),"-%.0f %%",id(i100).state);
      it.printf(0,30,id(arial),"ConsoJ=%.0f kWh",id(conso).state);

    

Affichage local

J’affiche quelques valeurs en local sur un oled SSD1306 128×64, pratique pour une visu rapide à la puissance et l’intensité instantanée, du ratio I/imax et la conso du jour.

Je joue également avec la Led WS2812 RGB connectée sur le GPIO18. En fonction de la puissance la led change de couleur:

  • Verte de 0 à 1000 VA
  • Bleu entre 1000 et 3000 VA
  • Rouge si supérieure à 3000 VA
  • Les combinaisons sont infinies et facilement programmables.

Codes du fichier linky.yaml

Remarque: dans ce code vous pouvez supprimer les utility meter et utiliser la méthode décrite dans cet article: https://domo.rem81.com/2022/06/06/ha-compteur-de-service-utility-meter/

Double Tarif

On y retrouve:

  • les « utility meter » qui comptabilisent les energies consommées HC/HP par jour, semaine, mois, année
  • un ‘binary_sensor » HC utilisé dans l’affichage des graphiques de puissance permettant de matérialiser la zone HC
  • les « templates » qui cumulent les HC/HP des utility meter et calculent en € les coûts de consommations
####################################################
#                                                  #
#                       LINKY                      #
#                                                  #
####################################################


utility_meter:
# usage jour  
  energy_total_usage_daily:
    source: sensor.linky_hphc_kwh
    cycle: daily
    tariffs:
      - hp
      - hc
# usage semaine
  energy_total_usage_weekly:
    source: sensor.linky_hphc_kwh
    cycle: weekly
    tariffs:
      - hp
      - hc
# usage mois
  energy_total_usage_monthly:
    source: sensor.linky_hphc_kwh
    cycle: monthly
    tariffs:
      - hp
      - hc
#usage an
  energy_total_usage_yearly:
    source: sensor.linky_hphc_kwh
    cycle: yearly
    tariffs:
      - hp
      - hc
## 
input_boolean:
  com_linky:
    name: Comm Linky OK=On

input_number:
  # Calcul des coûts journaliers
  cout_kwh_hp:
    name: Cout du Kwh HP
    min: 0
    max: 10
    unit_of_measurement: €
    icon: mdi:currency-eur
    step: 0.00001
    mode: box

  cout_kwh_hc:
    name: Cout du Kwh HC
    min: 0
    max: 10
    unit_of_measurement: €
    icon: mdi:currency-eur
    step: 0.00001
    mode: box

input_text:
  # Permet de simuler des Statuts pour les tests unitaires
  linky_test_status:   
    name: Test statuts Linky

template:
  - binary_sensor:
    # Utilisé dans l'affichage des graphiques de puissance permettant de materialiser la zone HC
    # = true si HC
    - name: "display_hp_hc"
      unique_id: "display_hp_hc"
      state: >-
        {{ states('sensor.linky_n_tarif')|int(default=0) == 1 }} # =1 si HC =2 si HP

# Consommation journalière HP + HC - addition des utility meter
  - sensor:
    - name: "Energie Totale Jour"
      unique_id: "energy_total_daily"
      state: >-
        {% set p = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}
        {% set o = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}
        {{ (o + p) | round(2) }}
      unit_of_measurement: "kWh"
      device_class: "energy"
      state_class: "total"

# Consommation semaine HP + HC
    - name: "energy_total_weekly"
      state: >-
        {% set p = states('sensor.energy_total_usage_weekly_hp') | float(default=0) | round(2) %}
        {% set o = states('sensor.energy_total_usage_weekly_hc') | float(default=0) | round(2) %}
        {{ (o + p) | round(2) }}
      unit_of_measurement: "kWh"
      device_class: "energy"
      state_class: "total"  

# Consommation mensuelle HP + HC
    - name: "energy_total_monthly"
      state: >-
        {% set p = states('sensor.energy_total_usage_monthly_hp') | float(default=0) | round(2) %}
        {% set o = states('sensor.energy_total_usage_monthly_hc') | float(default=0) | round(2) %}
        {{ (o + p) | round(2) }}
      unit_of_measurement: "kWh"
      device_class: "energy"
      state_class: "total"  

# Consommation annuelle HP + HC
    - name: "energy_total_yearly"
      state: >-
        {% set p = states('sensor.energy_total_usage_yearly_hp') | float(default=0) | round(2) %}
        {% set o = states('sensor.energy_total_usage_yearly_hc') | float(default=0) | round(2) %}
        {{ (o + p) | round(2) }}
      unit_of_measurement: "kWh"
      device_class: "energy"
      state_class: "total"  

# Cout de l'Energie
# les couts du kWh HP et HC sont calculés dans excel en fonction des factures recues
# et saisis manuellement dans HA

    - name: "Cout Energy Total Jour HPHC"
      state: >-
        {% set hp = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}
        {% set hc = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}
        {% set chp = states('input_number.cout_kwh_hp') | float(default=0) | round(5) %}
        {% set chc = states('input_number.cout_kwh_hc') | float(default=0) | round(5) %}
        {{((hc*chc) + (hp*chp)) | round(2) }}
      unit_of_measurement: "€"
      device_class: "monetary"
      state_class: "total"  
      unique_id: "cout_energy_total_jour_hphc"

    - name: "Cout Energy Total Jour HP"
      state: >-
        {% set hp = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}
        {% set chp = states('input_number.cout_kwh_hp') | float(default=0) | round(5) %}
        {{(hp*chp) | round(2) }}
      unit_of_measurement: "€"
      device_class: "monetary"
      state_class: "total"  
      unique_id: "cout_energy_total_jour_hp"
      
    - name: "Cout Energy Total Jour HC"
      state: >-
        {% set hc = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}
        {% set chc = states('input_number.cout_kwh_hc') | float(default=0) | round(5) %}
        {{(hc*chc) | round(2) }}
      unit_of_measurement: "€"
      device_class: "monetary"
      state_class: "total"  
      unique_id: "cout_energy_total_jour_hc"
      

Tarif unique

On y retrouve:

  • les « utility meter » qui comptabilisent les energies consommées HC/HP par jour, semaine, mois, année
  • le « template » qui calcule en € le coût de consommation
####################################################
#                                                  #
#                       LINKY                      #
#                                                  #
####################################################


utility_meter:
# usage jour  
  energy_total_linky_usage_daily:
    source: sensor.linky_base_wh
    cycle: daily

# usage semaine
  energy_total_linky_usage_weekly:
    source: sensor.linky_base_wh
    cycle: weekly

# usage mois
  energy_total_linky_usage_monthly:
    source: sensor.linky_base_wh
    cycle: monthly

#usage an
  energy_total_linky_usage_yearly:
    source: sensor.linky_base_wh
    cycle: yearly
 

input_boolean:
  com_linky:
    name: Comm Linky OK=On

input_number:

  # Calcul du coût journalier
  cout_kwh_hp:
    name: Cout du Kwh
    min: 0
    max: 10
    unit_of_measurement: €
    icon: mdi:currency-eur
    step: 0.00001
    mode: box


template:

  - sensor:
 # Cout de l'Energie
# le cout du kWh est calculé en fonction des factures recues
# et saisi manuellement dans HA

    - name: "Cout Energy Total Jour"
      state: >-
        {% set conso = states('sensor.energy_total_linky_usage_daily') | float(default=0) | round(2) %}
        {% set cout = states('input_number.cout_kwh_hp') | float(default=0) | round(5) %}
        {{(conso*cout) | round(2) }}
      unit_of_measurement: "€"
      device_class: "monetary"
      state_class: "total"  
      unique_id: "cout_energy_total_jour"

Automatismes

Commutation de HP vers HC et Inversement

Il permet de permuter la tarification des utiliy meter en fonction du tarif récupéré dans le Linky (PTEC)

Code de l’automatisme

- id: '1642614758763'
  alias: 6_1_1 Energie Changement HP<->HC simplifié
  description: ''
  trigger:
  - platform: state
    entity_id: sensor.linky_ptec
    id: tarif_hc
    from: HP..
    to: HC..
  - platform: state
    entity_id: sensor.linky_ptec
    from: HC..
    to: HP..
    id: tarif_hp
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: tarif_hc
      sequence:
      - service: select.select_option
        data:
          option: hc
        target:
          entity_id:
          - utility_meter.energy_total_linky_usage_daily
          - utility_meter.energy_total_linky_usage_monthly
          - utility_meter.energy_total_linky_usage_weekly
          - utility_meter.energy_total_linky_usage_yearly
    - conditions:
      - condition: trigger
        id: tarif_hp
      sequence:
      - service: select.select_option
        data:
          option: hp
        target:
          entity_id:
          - utility_meter.energy_total_linky_usage_daily
          - utility_meter.energy_total_linky_usage_monthly
          - utility_meter.energy_total_linky_usage_weekly
          - utility_meter.energy_total_linky_usage_yearly
    default: []
  mode: single

Automatisme de contrôle de la communication du Linky

Descriptif fonctionnel

Le but est de surveiller si la communication entre le Linky et HA est établie.

A chaque changement d’état de l’entité PAPP (puissance instantanée), l’automatisme est déclenché:

  • l' »input_boolean.com_linky » signifiant que la communication entre le linky et HA est OK est forcé sur On
  • Un délai d’une heure est déclenché,
  • si durant ce délai PAPP change d’état, l’automatisme est relancé (mode:restart) et « input_boolean.com_linky » reste sur On
  • sinon, passé ce délai, l' »input_boolean.com_linky » est forcé sur Off, et la communication est considérée en défaut, il sera remis sur On au prochain changement d’état de PAPP

Je surveillance la puissance PAPP, c’est la valeur plus évolutive, mais il arrive que quelques fois, surtout de nuit que la puissance reste stable pas et déclare donc un défaut fantôme.

En mode standard, nous pourrions utiliser l’entité « DATE ».

Code de l’automatisme:

- id: '1638118858848'
  alias: 2_2_2 Alarme_Notification Time Out Linky
  description: ' '
  trigger:
  - platform: state
    entity_id: sensor.linky_papp
  condition: []
  action:
  - service: input_boolean.turn_on
    target:
      entity_id: input_boolean.com_linky
  - delay:
      hours: 1
      minutes: 0
      seconds: 0
      milliseconds: 0
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.com_linky
  mode: restart

Blueprint Notification défaut communication:

J’exploite le défaut avec un blueprint « Nagging Alerting Notification Automation » plus pratique que l’intégration « alert » qui nécessite un redémarrage de HA à chaque modification. J’utilise ce blueprint dans d’autres cas de surveillance, portes, communication, etc..

- id: '1638119466260'
  alias: 2_1_11 Alarme Blueprints Notification Def Com Linky
  description: Blue Print
  use_blueprint:
    path: pavax/nagging_alert_notification.yaml
    input:
      condition_entity_state: 'on'
      sensor_entity: input_boolean.com_linky
      alert_state: 'off'
      alert_action:
      - service: notify.telegram
        data:
          message: Com Linky off Line{{-"\n"-}}{{states("sensor.date_time") }}
          title: Etat Reseau !!!
      - service: persistent_notification.create
        data:
          message: Com Linky Off Line {{-"\n"-}}{{states("sensor.date_time") }}
      resolved_action:
      - service: notify.telegram
        data:
          message: Com Linky On Line{{-"\n"-}} {{states("sensor.date_time") }}
          title: Etat RESEAU!!!
      - service: persistent_notification.create
        data:
          message: Com Linky On Line{{-"\n"-}}{{states("sensor.date_time") }}
      notify_device: 62cdce054a9d3448484b4df8e44cc499
      repeat_delay: 300
      initial_delay: 1
      max_alerts: 100
      resolved_message: Alert {{ entity_name }} resolved
      notify_message: Alert {{ entity_name }} triggered

Lovelace

Exemple d’affichage des données

Un autre exemple d’affichage utilisant « custom:mini-graph-card » de HACS

type: vertical-stack
cards:
  - type: custom:mini-graph-card
    entities:
      - entity: sensor.energie_totale_linky_jour
    name: Conso Linky 7j
    hours_to_show: 168
    aggregate_func: max
    group_by: date
    show:
      graph: bar
    icon: mdi:flash
  - type: custom:mini-graph-card
    color_thresholds:
      - color: '#00FF00'
        value: 0
      - color: '#FF9900'
        value: 4000
      - color: '#EA9999'
        value: 6000
      - color: '#CC0000'
        value: 10000
    color_thresholds_transition: hard
    line_width: 2
    icon: mdi:flash
    show:
      extrema: true
      fill: true
      icon: true
      labels: false
      name: true
      state: true
    hour24: true
    points_per_hour: 4
    hours_to_show: 24
    group: false
    state_map:
      - label: hp
        value: 'off'
      - label: hc
        value: 'on'
    style: |
      ha-card {
        border: solid 2px var(--primary-color);
      }
    entities:
      - entity: sensor.linky_papp
        name: Totale
      - color: '#CCC0cCC'
        entity: binary_sensor.display_hp_hc
        name: HC
        show_line: false
        y_axis: secondary
    name: Puissance Linky 24h

Un autre exemple d’affichage utilisant « custom:apexcharts-card » de HACS

type: custom:apexcharts-card
chart_type: donut
header:
  show: true
  title: Conso du Jour
  show_states: false
  colorize_states: true
series:
  - entity: sensor.energy_total_linky_usage_daily_hp
    name: HP
    color: green
  - entity: sensor.energy_total_linky_usage_daily_hc
    name: HC
    color: blue

Affichage du tableau Energie

Affichage dans Grafana

Vous trouverez ci-après le fichier Graphana correspondant (A renommer en .json)

Conclusion

Pas grand chose d’autre à ajouter, c’est simple à mettre en oeuvre (si le Linky est accessible), fiable et peu onéreux, il ne reste plus qu’a exploiter les informations.

Publication en lien avec cet article:

https://domo.rem81.com/ha-teleinformation-linky-mode-standard/

90 Comments on “HA-Teleinformation Linky-Mode Historique”

      1. Bonjour Remi,

        Merci pour ce tuto !

        J’y suis presque mais impossible de compiler mon fichier avec HA
        Il m’affiche toujours une erreur :

        INFO Reading configuration /config/esphome/test.yaml…
        Failed config

        i2c: [source /config/esphome/test.yaml:28]

        ESP8266: Invalid pin number: 21.
        sda: GPIO21

        ESP8266: Invalid pin number: 22.
        scl: GPIO22
        scan: True
        id: bus_a
        uart: [source /config/esphome/test.yaml:35]
        – id: uart_a

        ESP8266: Invalid pin number: 23.
        rx_pin: GPIO23
        baud_rate: 9600
        parity: EVEN
        data_bits: 7
        light.neopixelbus: [source /config/esphome/test.yaml:60]
        platform: neopixelbus
        num_leds: 1

        ESP8266: Invalid pin number: 18.
        pin: GPIO18
        name: RGB strip
        variant: ws2812
        id: rgb_led
        default_transition_length: 0s

        Tu as une idée ?

        Merci beaucoup 🙂

          1. Bonjour Rémi,

            Merci pour votre réponse.
            J’ai bien une carte mini ESP32 D1 je n’ai pas fait attention qu’il y en avait plusieurs

            Merci pour tout 😀

            Il me reste plus que cette erreur et tout est réglé : ========================= [SUCCESS] Took 42.76 seconds =========================
            INFO Successfully compiled program.
            INFO Resolving IP address of dernier-test.local
            ERROR Error resolving IP address of dernier-test.local. Is it connected to WiFi?
            ERROR (If this error persists, please set a static IP address: https://esphome.io/components/wifi.html#manual-ips)
            ERROR Error resolving IP address: Error resolving address with mDNS: Did not respond. Maybe the device is offline., [Errno -5] No address associated with hostname

            Merci pour tout depuis le temps que je galère avec ca !

          2. Bonjour
            Réponse tardive, tu a surement résolu ton pbm, sinon, Il semblerait que l’esp n’arrive pas à se connecter, vérifier la connexion wifi dans « secrets » de esphome en haut à droite, et/ou mettre une adresse ip statique
            Cdlt

          3. C’est tout bon !

            En faite je n’arrivais pas a flasher la carte car j’avais le fichier factory

            J’ai pris la dernière option pour flasher et c’est passé !

            merci beaucoup 🙂 à bientôt !

  1. Merci beaucoup pour ce tuto detaillé, j’ai essayé de l’adapter à ma config mais je suis en tarif de base, j’ai modifié le fichier ESP mais le sensor.energie_totale_linky_jour ne remonte aucune info, j’egalement modifié ceci:

    – platform: teleinfo
    id: index_base
    tag_name: « BASE »
    name: « Linky HP Wh »
    unit_of_measurement: « Wh »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    – platform: template
    name: « Linky HPHC KWH »
    id: hphc_kwh
    icon: mdi:flash
    unit_of_measurement: « kWh »
    accuracy_decimals: 0
    lambda: |-
    return ((id(index_base).state)/1000);

    – platform: homeassistant
    name: « HCHP J »
    unit_of_measurement: « kWh »
    entity_id: sensor.energie_totale_linky_jour
    id: hphcj

    J’ai supprimé les HC.

    En te rerciant par avance.

    1. Bonjour, merci pour ton retour. Concernant l’énergie, le « sensor.energie_total_linky_jour » est calculé dans HA avec un utility_meter https://www.home-assistant.io/integrations/utility_meter/, dans ton cas la source sera le template « sensor.linky_hphc_kwh » que tu calcule dans l’esp. Tu peux aussi simplifier en supprimant le template name »Linky HPHC kWh » et convertir directement les wh en kWh en ajoutant « filters: lamba … »
      # Energie Active soutirée totale
      – platform: teleinfo
      id: index_base
      tag_name: « BASE »
      name: « Linky HP KWH »
      unit_of_measurement: « kWh »
      icon: mdi:flash
      teleinfo_id: myteleinfo
      filters:
      lambda: |-
      return x/1000;
      Dans ce cas la source de l’utility meter sera directement ce sensor.
      Bon courage

  2. Merci pour ton aide, voilà ce que j’ai fait:
    sensor:
    – platform: teleinfo
    id: index_base
    tag_name: « BASE »
    name: « Linky HP Wh »
    unit_of_measurement: « Wh »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    – platform: template
    name: « Linky HP KWH »
    id: hphc_kwh
    icon: mdi:flash
    unit_of_measurement: « kWh »
    accuracy_decimals: 0
    lambda: |-
    return ((id(index_base).state)/1000);

    – platform: homeassistant
    name: « HCHP J »
    unit_of_measurement: « kWh »
    entity_id: sensor.energie_totale_linky_jour
    id: hphcj

    Puis j’ai adapté les valeurs dans pour l’utility meter:

    utility_meter:
    # usage jour
    energy_total_linky_usage_daily:
    source: sensor.linky_hp_kwh
    cycle: daily
    tariffs:
    – hp
    # usage semaine
    energy_total_linky_usage_weekly:
    source: sensor.linky_hp_kwh
    cycle: weekly
    tariffs:
    – hp
    # usage mois
    energy_total_linky_usage_monthly:
    source: sensor.linky_hp_kwh
    cycle: monthly
    tariffs:
    – hp
    #usage an
    energy_total_linky_usage_yearly:
    source: sensor.linky_hp_kwh
    cycle: yearly
    tariffs:
    – hp
    # Linky: Cumul HP+HC en kWh -> Utilisé dans utility meter
    # sensor.linky_hp_kwh est calculé dahns l’ESP
    – name: « Linky Conso Totale HPHC »
    unique_id: « linky_hp_kwh »
    unit_of_measurement: « kWh »
    device_class: « energy »
    state_class: « total »
    state: >-
    {% set index_base = states(‘sensor.linky_hp_kwh’) | float(default=0) | round(0) %}
    {% if (index_base)>10000 %}
    {{ (index_base) | round(0) }}
    {%endif%}

    Voilà où j’en suis pour adapter ta config à la mienne, que dois je faire maintenant, sachant que j’ai crée les deux cartes ainsi que le .json de grafana, les données sont récoltées mais il faut que j’attende 24h pour avoir un calcul journalier?

    1. Bonjour
      Voici ce que j’écrirai à ta place. le fait d’avoir un seul tarif simplifie le code:
      Apres reboot l’utility meter du jour doit commencer à compter.
      Bon courage
      *******************************************
      sensor:
      – platform: teleinfo
      id: index_base
      tag_name: « BASE »
      name: « Linky HP kWh »
      unit_of_measurement: « kWh »
      icon: mdi:flash
      teleinfo_id: myteleinfo
      lambda: |-
      return ((id(index_base).state)/1000);

      utility_meter:
      # usage jour
      energie_totale_linky_jour:
      source: sensor.linky_hp_kwh
      cycle: daily

      # usage semaine
      energie_totale_linky_semaine:
      source: sensor.linky_hp_kwh
      cycle: weekly

      # usage mois
      energie_totale_linky_mois:
      source: sensor.linky_hp_kwh
      cycle: monthly

      #usage an
      energie_totale_linky_annee:
      source: sensor.linky_hp_kwh
      cycle: yearly
      ***************************************************
      tu dois retrouver ton energie du jour dans: sensor.energie_totale_linky_jour
      Ce qui n’apparait plus par rapport à ton message tu le supprime

    1. Salut BOB,

      j’ai repris ce code mais j’ai une erreur à la validation j’ai un duplicate key « source ».
      Je suis novice sur HA , j’avoue etre un peu perdu en YAML.

        1. sur celui là :

          *******************************************
          sensor:
          – platform: teleinfo
          id: index_base
          tag_name: « BASE »
          name: « Linky HP kWh »
          unit_of_measurement: « kWh »
          icon: mdi:flash
          teleinfo_id: myteleinfo
          lambda: |-
          return ((id(index_base).state)/1000);

          utility_meter:
          # usage jour
          energie_totale_linky_jour:
          source: sensor.linky_hp_kwh
          cycle: daily

          # usage semaine
          energie_totale_linky_semaine:
          source: sensor.linky_hp_kwh
          cycle: weekly

          # usage mois
          energie_totale_linky_mois:
          source: sensor.linky_hp_kwh
          cycle: monthly

          #usage an
          energie_totale_linky_annee:
          source: sensor.linky_hp_kwh
          cycle: yearly
          ***************************************************

          j’ai essayé de l’adapter avec mes connaissances 😉 mais ça fonctionne pas tout a fait comme voulu.

          du coup mon code donne ça :
          ***************************************************
          #
          uart:
          id: uart_a
          rx_pin: GPIO23
          # tx_pin: GPIO1
          baud_rate: 1200
          parity: EVEN
          data_bits: 7

          teleinfo:
          id: myteleinfo
          uart_id: uart_a
          update_interval: 10s
          historical_mode: true

          # Led WS2812 RGB
          light:
          – platform: partition
          name: led1
          id: led1
          default_transition_length: 0s
          segments:
          – id: rgb_led
          from: 0
          to: 0

          – platform: neopixelbus
          num_leds: 1
          pin: GPIO18
          name: « RGB strip »
          variant: ws2812
          id: rgb_led
          default_transition_length: 0s

          sensor:
          – platform: teleinfo
          id: index_base
          tag_name: « BASE »
          name: « Linky Base Wh »
          unit_of_measurement: « Wh »
          icon: mdi:flash
          teleinfo_id: myteleinfo
          state_class: « total_increasing »
          device_class: « energy »

          – platform: teleinfo
          id: papp
          tag_name: « PAPP »
          name: « Linky PAPP »
          unit_of_measurement: « W »
          device_class: « power »
          state_class: « measurement »
          icon: mdi:flash
          teleinfo_id: myteleinfo
          on_value:
          – if:
          condition:
          sensor.in_range:
          id: papp
          below: 1000
          then:
          – light.control:
          id: led1
          red: 0%
          green: 100% # vert
          blue: 0%
          – if:
          condition:
          sensor.in_range:
          id: papp
          above: 1000
          below: 3000
          then:
          – light.control:
          id: led1
          red: 0%
          green: 0% # bleu
          blue: 100%
          – if:
          condition:
          sensor.in_range:
          id: papp
          above: 3000
          then:
          – light.control:
          id: led1
          red: 100% #rouge
          green: 0%
          blue: 0%

          – platform: teleinfo
          id: isousc
          tag_name: « ISOUSC »
          name: « Linky I Sousc »
          unit_of_measurement: « A »
          icon: mdi:flash
          teleinfo_id: myteleinfo

          – platform: teleinfo
          id: iinst
          tag_name: « IINST »
          name: « Linky I Inst »
          unit_of_measurement: « A »
          icon: mdi:flash
          teleinfo_id: myteleinfo

          – platform: teleinfo
          id: imax
          tag_name: « IMAX »
          name: « linky I Max »
          unit_of_measurement: « A »
          icon: mdi:flash
          teleinfo_id: myteleinfo

          – platform: template
          name: « Linky I/Imax »
          id: i100
          icon: mdi:flash
          unit_of_measurement: « % »
          accuracy_decimals: 0
          lambda: |-
          return (id(iinst).state/id(isousc).state*100);

          – platform: template
          name: « Linky Base KWH »
          id: base_kwh
          icon: mdi:flash
          unit_of_measurement: « kWh »
          accuracy_decimals: 0
          lambda: |-
          return ((id(index_base).state)/1000);

          – platform: homeassistant
          name: « BASE J »
          unit_of_measurement: « kWh »
          entity_id: sensor.energie_totale_linky_jour
          id: basej

          – platform: wifi_signal
          id: wif
          name: « ${friendly_name} WiFi Signal Sensor »
          update_interval: 60s

          – platform: uptime
          id: uptime_seconds
          name: « ${friendly_name} Uptime »
          update_interval: 60s
          unit_of_measurement: s
          accuracy_decimals: 0
          force_update: false
          icon: mdi:timer

          text_sensor:
          – platform: teleinfo
          tag_name: « OPTARIF »
          name: « Linky OPTARIF »
          teleinfo_id: myteleinfo

          – platform: teleinfo
          tag_name: « PTEC »
          id: tarif
          name: « Linky PTEC »
          teleinfo_id: myteleinfo

          – platform: template
          name: « ${friendly_name} Uptime »
          update_interval: 60s
          icon: mdi:clock-start
          lambda: |-
          int seconds = (id(uptime_seconds).state);
          int days = seconds / (24 * 3600);
          seconds = seconds % (24 * 3600);
          int hours = seconds / 3600;
          seconds = seconds % 3600;
          int minutes = seconds / 60;
          seconds = seconds % 60;
          if ( days ) {
          return { (String(days) + »d  » + String(hours) + »h  » + String(minutes) + »m « + String(seconds) + »s »).c_str() };
          } else if ( hours ) {
          return { (String(hours) + »h  » + String(minutes) + »m « + String(seconds) + »s »).c_str() };
          } else if ( minutes ) {
          return { (String(minutes) + »m « + String(seconds) + »s »).c_str() };
          } else {
          return { (String(seconds) + »s »).c_str() };
          }

          #Etat de la connection
          binary_sensor:
          – platform: status
          name: « ${friendly_name} Status »

          switch:
          – platform: restart
          name: « ${friendly_name} Restart »

          display:
          – platform: ssd1306_i2c
          model: « SSD1306 128×64″
          address: 0x3C
          brightness: 100%
          lambda: |-
          it.printf(0,0,id(arial), »PuC=%.0f W »,id(papp).state);
          it.printf(0,15,id(arial), »I Inst=%.0f A »,id(iinst).state);
          it.printf(70,15,id(arial), »-%.0f %% »,id(i100).state);
          it.printf(0,30,id(arial), »ConsoJ=%.0f kWh »,id(basej).state);
          std::string tarif_ = id(tarif).state;
          it.printf(0,45,id(arial), « Tarif: %s », tarif_.c_str());

          **********************************************
          j’ai bien des infos qui remontent mais sur l’onglet energie les valeurs affiches sont toutes à la même valeur plus ou moins.

          du coup je suis en tarif BASE, et je souhaite avoir un graph des valeurs de puissances instantanées , et un compteur journalier en KWh de ma conso afin de pouvoir historiser.

          mais pour le moment je patine.

          merci d’avance.

  3. Salut, excuse moi de te déranger, tout fonctionne correctement en ce qui concerne la remontée des informations, par contre j’ai voulu integrer ton automatisation de contrôle de la communication, hélas j’ai une erreur « Unable to find referenced entities input_boolean.com_linky », avant de te déranger j’ai essayer de trouver d’où venait cette erreur mais je n’ai pas trouvé la référence de cet input. En te remerciant par avance. Salutations.

    1. Bonjour, effectivement le input boolean était déclaré dans un autre fichier, en plus je l’avais renommé en ‘input_boolean.com_linky ». je l’ai ajouté dans linky.yaml et mis à jour le code de l’automatisme. Bon courage.

  4. Bonjour,

    avec les nouveaux abonnements multi tarifs, comment peut on adapter tes scripts ?

    je viens de passer de mint HP/HC a EDF av c un « électrique vert auto Weekend » , où on bénéficie d’heures creuses les week-end et jours fériés , je pensais bêtement que le compteur prenais ça comme du HC mais c’est pas le cas .
    la trame envoyé par le compteur ( en mode historique) est ‘base’
    le PTEC est HY et ne comprends pas les mentions HP/HC/WE …
    autrement dit tout mes appareils qui lisent la trame sont perdus et ne remontent plus les bonnes infos . ( même ma chaudière ne s enclanche pas plus la nuit 🙁 )

    as tu déjà rencontré le soucis ?
    je pense qu’on sera de plus en plus nombreux a l’avoir ( EDF a 2 abo de ce type , total energy a les supers HC , ect … )

    j imaginais une solution ‘mécanique’ pour palier , mais si on peut le faire en soft
    (je pensais utiliser le contact sec C1/C2 du compteur pour savoir si HP ou pas … mais j avous ne pas etre à l’aise a manipuler le compter … )

    merci

    1. Bonjour Jerome, il faut passer ton linky en mode standard et tu disposera de 10 index différents, regarde mon article sur le mode historique. Le changement de mode est à faire auprès de ton fournisseur d’énergie, et cela resoudera simplement ton problème, tiens mois informé, bon courage.

      1. Merci pour la réponse rapide 🙂 je viens de faire la demande a EDF , on verra bien . en attendant, je vais potasser la doc spécifique que tu as fait sur le mode standard .

          1. bon, je suis passé en mode normal et ….. c est pire .

            j ai un Tywatt1000 qui sert pour le RT2012, il est partit en carafe , d apres deltadore ( a defaut d avoir du matos de merde ils sont réactifs ) , il faut un modele sortit apres octobre 2020 pour gerer le mode normal ( et bim un truc a 250euros qui sert plus a rien ) .

            mon ecodevice, pareil , il ne remonte plus rien, meme plus la puissance consommée, pareil, il est pas compatible trame normale 🙁

            il n y a que mon petit boitier TIC/USB no name rail din, qui me remonte bien les infos sur Jeedom ( via plugin teleinfo ) .
            je l ai branché sur l odroid qui sert pour homeassistant, je recupere bien les infos sur nodered en lecture de l USB, mais apres je ne sais pas faire, et ce n est pas le sujet de cette page .

            merci quand meme pour ton aide

            ps : la trame ressemble à ça maintenant :
            ADSC 062061638213 3
            VTIC 02 J
            DATE H220223223917 D
            NGTF HC et Week-End U
            LTARF HEURE CREUSE K
            EAST 010686944 5
            EASF01 006972049 G
            EASF02 003574937 I
            EASF03 000139958 G
            EASF04 000000000 %
            EASF05 000000000 &
            EASF06 000000000 ‘
            EASF07 000000000 (
            EASF08 000000000 )
            EASF09 000000000 *
            EASF10 000000000  »
            EASD01 006685689 P
            EASD02 003460150 4
            EASD03 000357561 =
            EASD04 000183544 <
            IRMS1 003 1
            URMS1 238 G
            PREF 09 H
            PCOUP 09 "
            SINSTS 00667 Y
            SMAXSN H220223021413 06521 1
            SMAXSN-1 H220222030411 08197 W
            CCASN H220223223000 00510 3
            CCASN-1 H220223220000 00556 X
            UMOY1 H220223223000 238 –
            STGE 003A8000 A
            MSG1 PAS DE MESSAGE <
            PRM 19467293685817 M
            RELAIS 001 C
            NTARF 01 N
            NJOURF 00 &
            NJOURF+1 00 B
            PJOURF+1 0000C001 06308002 2230C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE V

          2. Bon c’est déjà pas mal tu récupères ces info, et tu peux voir que tu récupere des watt heure dans EASTF01 à EASTF03, ce qui correspond à tes trois tarifications (regarde dans mon article la signification des entités). Est ce que avec node red tu sais extraire les valeurs par exemple, SINST c’est ta puissance instantanée, il faut extraire la valeur numérique puis la convertir, ce qu’a fait ce gars https://forum.hacf.fr/t/decoder-trames-linky-en-mode-standard-sous-node-red/4222, normalement c’est faisable. Dans cet article http://hallard.me/pitinfo/ un gars a écrit une fonction sous NR pour le mode historique, mais avec quelques modif ca pourrait fonctionner pour de l’historique. J’espère t’avoir aidé.

  5. Salut Rem81,

    Tout d’abord, je tiens à te remercier pour ton boulot remarquable !
    Cependant, j’ai suivi à la lettre ton article (acheter les même composants, être en mode historique, etc) mais malgré tout ça, je n’ai aucune information venant du linky qui remonte dans home assistant.
    Par réflexe, j’ai regardé les logs dans espHome et j’obtiens quelque « teleinfo: bad crc… »:
    « `
    [18:12:04][D][text_sensor:067]: ‘Linky PTEC’: Sending state ‘HP..’
    [18:12:05][E][teleinfo:038]: bad crc: got 62 except 74
    [18:12:06][D][sensor:125]: ‘linkyinfo Uptime’: Sending state 1777.36499 s with 0 decimals of accuracy
    [18:12:18][D][text_sensor:067]: ‘linkyinfo Uptime’: Sending state ’29m 37s’
    [18:12:25][E][teleinfo:038]: bad crc: got 62 except 68
    [18:12:30][D][sensor:125]: ‘linkyinfo WiFi Signal Sensor’: Sending state -49.00000 dBm with 0 decimals of accuracy
    [18:12:43][D][api:102]: Accepted ::FFFF:C0A8:A
    [18:12:43][W][api.connection:083]: Home Assistant 2022.3.7 (::FFFF:C0A8:A): Connection closed
    [18:12:45][E][teleinfo:038]: bad crc: got 62 except 80
    [18:13:03][D][sensor:125]: ‘Linky P/PCoup’: Sending state nan % with 0 decimals of accuracy
    [18:13:04][D][text_sensor:067]: ‘Linky PTEC’: Sending state ‘HP..’
    [18:13:05][E][teleinfo:038]: bad crc: got 62 except 54
    [18:13:06][D][sensor:125]: ‘linkyinfo Uptime’: Sending state 1837.37097 s with 0 decimals of accuracy
    [18:13:18][D][text_sensor:067]: ‘linkyinfo Uptime’: Sending state ’30m 37s’
    [18:13:25][E][teleinfo:038]: bad crc: got 82 except 83
    [18:13:30][D][sensor:125]: ‘linkyinfo WiFi Signal Sensor’: Sending state -49.00000 dBm with 0 decimals of accuracy
    [18:13:43][D][api:102]: Accepted ::FFFF:C0A8:A
    [18:13:43][W][api.connection:083]: Home Assistant 2022.3.7 (::FFFF:C0A8:A): Connection closed
    [18:13:45][E][teleinfo:038]: bad crc: got 82 except 83
    [18:14:03][D][sensor:125]: ‘Linky P/PCoup’: Sending state nan % with 0 decimals of accuracy
    [18:14:04][D][text_sensor:067]: ‘Linky PTEC’: Sending state ‘HP..’
    [18:14:05][E][teleinfo:038]: bad crc: got 62 except 68
    [18:14:06][D][sensor:125]: ‘linkyinfo Uptime’: Sending state 1897.37305 s with 0 decimals of accuracy
    « `
    Peux-tu essayer de m’aider ou bien as-tu des pistes afin de trouver d’où vient le problème ?
    D’avance merci.
    Tony

    1. Bonjour Tony
      Merci pour ton encouragement. Concernant ton bad crc, c’est le module wemos teleinfo qui ne peut pas déchiffer les trames reçues du linky: vérifie le raccordement au niveau du linky (I1 et I2), est-ce que la led rouge est allumée et clignote de temps en temps, quelle longueur de cables entre le linky et le module?

      1. Rebonjour Rémi,

        Merci beaucoup pour te retour rapide.
        Concernant tes questions, oui j’ai bien la led rouge du teleinfo qui est allumée mais non, elle ne clignote pas de temps en temps… Elle scintille mais reste allumée.
        Et les câbles permettant de relier le teleinfo et le linky font 20cm.
        Encore merci pour ton aide.
        Tony

      2. Rebonjour Rémi,

        Comme je pensais que dans ta question, tu sous-entendais que la longueur du câble pouvez être la cause du problème, j’ai changé les câbles par des câbles de 10cm (20cm auparavant) mais malheureusement cela ne résout pas mon problème, j’ai toujours les erreurs de bas crc…
        Merci d’avance pour ton aide.

        1. Re bonsoir
          Pas facile de dépanner à distance, peux tu copier coller le début du log de ton esp jusqu’aux premiers bad crc STP?

          1. Bonjour Remi,

            Voici les logs demandés (j’èspère que les sauts de lignes sera pris en compte dans le formatage du texte collé)

            INFO Reading configuration /config/esphome/linky-info.yaml…
            INFO Starting log output from 192.168.0.136 using esphome API
            INFO Successfully connected to 192.168.0.136
            [09:28:42][I][app:102]: ESPHome version 2022.3.1 compiled on Mar 27 2022, 17:37:37
            [09:28:42][C][wifi:491]: WiFi:
            [09:28:42][C][wifi:353]: Local MAC: C8:C9:A3:CB:97:90
            [09:28:42][C][wifi:354]: SSID: [redacted]
            [09:28:42][C][wifi:355]: IP Address: 192.168.0.136
            [09:28:42][C][wifi:357]: BSSID: [redacted]
            [09:28:42][C][wifi:358]: Hostname: ‘linkyinfo’
            [09:28:42][C][wifi:360]: Signal strength: -57 dB ▂▄▆█
            [09:28:42][C][wifi:364]: Channel: 9
            [09:28:42][C][wifi:365]: Subnet: 255.255.254.0
            [09:28:42][C][wifi:366]: Gateway: 192.168.1.254
            [09:28:42][C][wifi:367]: DNS1: 0.0.0.0
            [09:28:42][C][wifi:368]: DNS2: 0.0.0.0
            [09:28:42][C][logger:233]: Logger:
            [09:28:42][C][logger:234]: Level: DEBUG
            [09:28:42][C][logger:235]: Log Baud Rate: 115200
            [09:28:42][C][logger:236]: Hardware UART: UART0
            [09:28:42][C][i2c.arduino:038]: I2C Bus:
            [09:28:43][C][i2c.arduino:039]: SDA Pin: GPIO21
            [09:28:43][C][i2c.arduino:040]: SCL Pin: GPIO22
            [09:28:43][C][i2c.arduino:041]: Frequency: 50000 Hz
            [09:28:43][C][i2c.arduino:044]: Recovery: bus successfully recovered
            [09:28:43][I][i2c.arduino:054]: Results from i2c bus scan:
            [09:28:43][I][i2c.arduino:060]: Found i2c device at address 0x3C
            [09:28:43][C][uart.arduino_esp32:107]: UART Bus:
            [09:28:43][C][uart.arduino_esp32:109]: RX Pin: GPIO23
            [09:28:43][C][uart.arduino_esp32:111]: RX Buffer Size: 256
            [09:28:43][C][uart.arduino_esp32:113]: Baud Rate: 1200 baud
            [09:28:43][C][uart.arduino_esp32:114]: Data Bits: 7
            [09:28:43][C][uart.arduino_esp32:115]: Parity: EVEN
            [09:28:43][C][uart.arduino_esp32:116]: Stop bits: 1
            [09:28:43][C][template.sensor:023]: Template Sensor ‘Linky P/PCoup’
            [09:28:43][C][template.sensor:023]: State Class:  »
            [09:28:43][C][template.sensor:023]: Unit of Measurement: ‘%’
            [09:28:43][C][template.sensor:023]: Accuracy Decimals: 0
            [09:28:43][C][template.sensor:023]: Icon: ‘mdi:flash’
            [09:28:43][C][template.sensor:024]: Update Interval: 60.0s
            [09:28:43][C][uptime.sensor:031]: Uptime Sensor ‘linkyinfo Uptime’
            [09:28:43][C][uptime.sensor:031]: State Class: ‘total_increasing’
            [09:28:43][C][uptime.sensor:031]: Unit of Measurement: ‘s’
            [09:28:43][C][uptime.sensor:031]: Accuracy Decimals: 0
            [09:28:43][C][uptime.sensor:031]: Icon: ‘mdi:timer’
            [09:28:43][C][template.text_sensor:021]: Template Sensor ‘Linky PTEC’
            [09:28:43][C][template.text_sensor:021]: Template Sensor ‘linkyinfo Uptime’
            [09:28:43][C][template.text_sensor:021]: Icon: ‘mdi:clock-start’
            [09:28:43][C][light:104]: Light ‘RGB strip’
            [09:28:43][C][light:106]: Default Transition Length: 0.0s
            [09:28:43][C][light:107]: Gamma Correct: 2.80
            [09:28:43][C][light:104]: Light ‘led1’
            [09:28:43][C][light:106]: Default Transition Length: 0.0s
            [09:28:43][C][light:107]: Gamma Correct: 2.80
            [09:28:43][C][teleinfo:189]: TeleInfo:
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky HPHC KWH’
            [09:28:43][C][teleinfo_sensor:012]: Device Class: ‘energy’
            [09:28:43][C][teleinfo_sensor:012]: State Class: ‘total_increasing’
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘kWh’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky HC Wh’
            [09:28:43][C][teleinfo_sensor:012]: State Class:  »
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘Wh’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky HP Wh’
            [09:28:43][C][teleinfo_sensor:012]: State Class:  »
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘Wh’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky PCOUP’
            [09:28:43][C][teleinfo_sensor:012]: State Class:  »
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘kVA’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky PAPP’
            [09:28:43][C][teleinfo_sensor:012]: Device Class: ‘power’
            [09:28:43][C][teleinfo_sensor:012]: State Class: ‘measurement’
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘W’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky Umoy’
            [09:28:43][C][teleinfo_sensor:012]: State Class:  »
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘V’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:43][C][teleinfo_sensor:012]: Teleinfo Sensor ‘Linky I Inst’
            [09:28:43][C][teleinfo_sensor:012]: State Class:  »
            [09:28:43][C][teleinfo_sensor:012]: Unit of Measurement: ‘A’
            [09:28:43][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:43][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:44][C][teleinfo_sensor:012]: Teleinfo Sensor ‘linky N Tarif’
            [09:28:44][C][teleinfo_sensor:012]: State Class:  »
            [09:28:44][C][teleinfo_sensor:012]: Unit of Measurement:  »
            [09:28:44][C][teleinfo_sensor:012]: Accuracy Decimals: 0
            [09:28:44][C][teleinfo_sensor:012]: Icon: ‘mdi:flash’
            [09:28:44][C][teleinfo_text_sensor:009]: Teleinfo Text Sensor ‘linky Statuts’
            [09:28:44][C][teleinfo_text_sensor:009]: Icon: ‘mdi:flash’
            [09:28:44][C][status:034]: Status Binary Sensor ‘linkyinfo Status’
            [09:28:44][C][status:034]: Device Class: ‘connectivity’
            [09:28:44][C][restart:022]: Restart Switch ‘linkyinfo Restart’
            [09:28:44][C][restart:022]: Icon: ‘mdi:restart’
            [09:28:44][C][ssd1306_i2c:023]: I2C SSD1306
            [09:28:44][C][ssd1306_i2c:023]: Rotations: 0 °
            [09:28:44][C][ssd1306_i2c:023]: Dimensions: 128px x 64px
            [09:28:44][C][ssd1306_i2c:024]: Address: 0x3C
            [09:28:44][C][ssd1306_i2c:025]: Model: SSD1306 128×64
            [09:28:44][C][ssd1306_i2c:027]: External VCC: NO
            [09:28:44][C][ssd1306_i2c:028]: Flip X: YES
            [09:28:44][C][ssd1306_i2c:029]: Flip Y: YES
            [09:28:44][C][ssd1306_i2c:030]: Offset X: 0
            [09:28:44][C][ssd1306_i2c:031]: Offset Y: 0
            [09:28:44][C][ssd1306_i2c:032]: Inverted Color: NO
            [09:28:44][C][ssd1306_i2c:033]: Update Interval: 1.0s
            [09:28:44][C][web_server:129]: Web Server:
            [09:28:44][C][web_server:130]: Address: 192.168.0.136:80
            [09:28:44][C][mdns:084]: mDNS:
            [09:28:44][C][mdns:085]: Hostname: linkyinfo
            [09:28:44][C][ota:085]: Over-The-Air Updates:
            [09:28:44][C][ota:086]: Address: 192.168.0.136:3232
            [09:28:44][C][ota:089]: Using Password.
            [09:28:44][C][api:138]: API Server:
            [09:28:44][C][api:139]: Address: 192.168.0.136:6053
            [09:28:44][C][api:143]: Using noise encryption: NO
            [09:28:44][C][wifi_signal.sensor:009]: WiFi Signal ‘linkyinfo WiFi Signal Sensor’
            [09:28:44][C][wifi_signal.sensor:009]: Device Class: ‘signal_strength’
            [09:28:44][C][wifi_signal.sensor:009]: State Class: ‘measurement’
            [09:28:44][C][wifi_signal.sensor:009]: Unit of Measurement: ‘dBm’
            [09:28:44][C][wifi_signal.sensor:009]: Accuracy Decimals: 0
            [09:28:44][C][homeassistant.sensor:030]: Homeassistant Sensor ‘HCHP J’
            [09:28:44][C][homeassistant.sensor:030]: State Class:  »
            [09:28:44][C][homeassistant.sensor:030]: Unit of Measurement: ‘kWh’
            [09:28:44][C][homeassistant.sensor:030]: Accuracy Decimals: 1
            [09:28:44][C][homeassistant.sensor:031]: Entity ID: ‘sensor.energie_totale_jour’
            [09:28:45][E][teleinfo:038]: bad crc: got 62 except 48
            [09:28:51][D][api:102]: Accepted ::FFFF:C0A8:A
            [09:28:51][W][api.connection:083]: Home Assistant 2022.3.7 (::FFFF:C0A8:A): Connection closed
            [09:28:55][E][teleinfo:038]: bad crc: got 62 except 80
            [09:29:03][D][sensor:125]: ‘linkyinfo WiFi Signal Sensor’: Sending state -58.00000 dBm with 0 decimals of accuracy
            [09:29:05][E][teleinfo:038]: bad crc: got 62 except 48
            [09:29:06][D][sensor:125]: ‘Linky P/PCoup’: Sending state nan % with 0 decimals of accuracy
            [09:29:15][E][teleinfo:038]: bad crc: got 62 except 80

            Merci beaucoup pour ton aide !

            Tony

          2. Bonjour Tony
            Les entités que tu lis avec teleinfo semblent etre celles du mode standard (je vois PCOUP, U MOY,..), vérifie dans ton esphome le nom des sensors du mode historique ou sinon copie colle ton programme esp
            Slts

  6. Salut Remi,

    Ah oui, il se peut qu’il y ait des erreurs de ce type car au début, j’avais testé la configuration du mode historique de ton article mais il ne fonctionnait pas… De ce fait, j’ai cliqué sur le lien vers ton github, et j’ai chopé la config du fichier esp124-tic.yaml (https://github.com/remycrochon/home-assistant/blob/master/esphome/esp124-tic.yaml) en ne modifiant juste la variable historical_mode: false en true ainsi que le baud de 9600 en 1200.
    Voici mon code:
    substitutions:
    device_name: linkyinfo
    adress_ip: « 192.168.0.136 »
    friendly_name: linkyinfo
    time_timezone: « Europe/Paris »

    esphome:
    name: ${device_name}
    platform: ESP32
    board: mhetesp32minikit
    platformio_options:
    lib_deps: NeoPixelBus@2.6.0
    on_boot:
    then:
    – light.control:
    id: led1
    brightness: 0.25
    state: on
    wifi:
    networks:
    – ssid: !secret wifi_ssid
    password: !secret wifi_password
    priority: 1
    reboot_timeout: 5min

    manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.1.254
    subnet: 255.255.254.0

    # Enable logging
    logger:
    # baud_rate: 0
    # Enable Home Assistant API
    api:
    password: !secret api_password

    ota:
    password: !secret ota_password

    web_server:
    port: 80

    font:
    – file: « fonts/arial.ttf »
    id: arial
    size: 15

    i2c:
    sda: GPIO21 #D2=pin 19
    scl: GPIO22 #D1=pin 20
    scan: True
    id: bus_a

    #
    uart:
    id: uart_a
    rx_pin: GPIO23
    # tx_pin: GPIO1
    baud_rate: 1200
    parity: EVEN
    data_bits: 7

    teleinfo:
    id: myteleinfo
    uart_id: uart_a
    update_interval: 10s
    historical_mode: true

    # Led WS2812 RGB
    light:
    – platform: partition
    name: led1
    id: led1
    default_transition_length: 0s
    segments:
    – id: rgb_led
    from: 0
    to: 0

    – platform: neopixelbus
    num_leds: 1
    pin: GPIO18
    name: « RGB strip »
    variant: ws2812
    id: rgb_led
    default_transition_length: 0s

    sensor:
    # Energie Active soutirée totale
    – platform: teleinfo
    id: hc_hp
    tag_name: « EAST »
    name: « Linky HPHC KWH »
    unit_of_measurement: « kWh »
    icon: mdi:flash
    teleinfo_id: myteleinfo
    device_class: « energy »
    state_class: « total_increasing »
    filters:
    lambda: |-
    return x/1000;

    # Energie Active soutirée Index01
    – platform: teleinfo
    id: hchc
    tag_name: « EASF01 »
    name: « Linky HC Wh »
    unit_of_measurement: « Wh »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    # Energie Active soutirée Index02
    – platform: teleinfo
    id: hchp
    tag_name: « EASF02 »
    name: « Linky HP Wh »
    unit_of_measurement: « Wh »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    #Puissance apparente de coupure
    – platform: teleinfo
    id: pcoup
    tag_name: « PCOUP »
    name: « Linky PCOUP »
    unit_of_measurement: « kVA »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    #Puissance apparente instantanée ph1
    – platform: teleinfo
    id: papp
    tag_name: « SINSTS »
    name: « Linky PAPP »
    unit_of_measurement: « W »
    device_class: « power »
    state_class: « measurement »
    icon: mdi:flash
    teleinfo_id: myteleinfo
    on_value:
    – if:
    condition:
    sensor.in_range:
    id: papp
    below: 1000
    then:
    – light.control:
    id: led1
    red: 0%
    green: 100% # vert
    blue: 0%
    – if:
    condition:
    sensor.in_range:
    id: papp
    above: 1000
    below: 3000
    then:
    – light.control:
    id: led1
    red: 0%
    green: 0% # bleu
    blue: 100%
    – if:
    condition:
    sensor.in_range:
    id: papp
    above: 3000
    then:
    – light.control:
    id: led1
    red: 100% #rouge
    green: 0%
    blue: 0%

    #Tension moyenne ph1
    – platform: teleinfo
    id: umoy1
    tag_name: « UMOY1 »
    name: « Linky Umoy »
    unit_of_measurement: « V »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    #Courant efficace ph1
    – platform: teleinfo
    id: iinst
    tag_name: « IRMS1 »
    name: « Linky I Inst »
    unit_of_measurement: « A »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    # Numero du Tarif en cours
    – platform: teleinfo
    id: ntarif
    tag_name: « NTARF »
    name: « linky N Tarif »
    unit_of_measurement: «  »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    ############### TEMPLATE ###################### »
    # Calcul du ratio de la puissance apparente utilisée en % par rapport au contrat
    – platform: template
    name: « Linky P/PCoup »
    id: p100
    icon: mdi:flash
    unit_of_measurement: « % »
    accuracy_decimals: 0
    lambda: |-
    return ((id(papp).state/1000)/id(pcoup).state*100);

    # Lecture dans HA de la conso du jour
    – platform: homeassistant
    name: « HCHP J »
    unit_of_measurement: « kWh »
    entity_id: sensor.energie_totale_jour
    id: hphcj

    # Puissance du signal WIFI
    – platform: wifi_signal
    id: wif
    name: « ${friendly_name} WiFi Signal Sensor »
    update_interval: 60s
    # Temps de fonctionnement de l’ESP
    – platform: uptime
    id: uptime_seconds
    name: « ${friendly_name} Uptime »
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer

    #######################################
    text_sensor:
    # Registre de statuts
    – platform: teleinfo
    id: stge
    tag_name: « STGE »
    name: « linky Statuts »
    icon: mdi:flash
    teleinfo_id: myteleinfo

    # Convertion du tarif en cours
    – platform: template
    id: tarif
    name: « Linky PTEC »
    lambda: |-
    if ( id(ntarif).state == 1 ) {
    return { « HC.. » };
    } else {
    return { « HP.. » };
    }
    # Affichage du temps de fonctionnement
    – platform: template
    name: « ${friendly_name} Uptime »
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
    int seconds = (id(uptime_seconds).state);
    int days = seconds / (24 * 3600);
    seconds = seconds % (24 * 3600);
    int hours = seconds / 3600;
    seconds = seconds % 3600;
    int minutes = seconds / 60;
    seconds = seconds % 60;
    if ( days ) {
    return { (String(days) + »d  » + String(hours) + »h  » + String(minutes) + »m « + String(seconds) + »s »).c_str() };
    } else if ( hours ) {
    return { (String(hours) + »h  » + String(minutes) + »m « + String(seconds) + »s »).c_str() };
    } else if ( minutes ) {
    return { (String(minutes) + »m « + String(seconds) + »s »).c_str() };
    } else {
    return { (String(seconds) + »s »).c_str() };
    }

    #Etat de la connection
    binary_sensor:
    – platform: status
    name: « ${friendly_name} Status »
    # Restart de l’ESP
    switch:
    – platform: restart
    name: « ${friendly_name} Restart »

    # Affichage
    display:
    – platform: ssd1306_i2c
    model: « SSD1306 128×64″
    address: 0x3C
    brightness: 100%
    lambda: |-
    it.printf(0,0,id(arial), »P=%.0f W »,id(papp).state);
    it.printf(75,0,id(arial), »-%.0f %% »,id(p100).state);
    it.printf(0,15,id(arial), »I Inst=%.0f A »,id(iinst).state);
    it.printf(0,30,id(arial), »ConsoJ=%.0f kWh »,id(hphcj).state);
    std::string tarif_ = id(tarif).state;
    it.printf(0,45,id(arial), « Tarif: %s », tarif_.c_str());

    Du coup, je vais essayer de prendre ton code en mode historique et de reflasher l’esp.
    Encore et toujours, merci pour ton aide !

    Cdt,
    Tony

  7. Rebonjour Rémi,

    Je viens de mettre ta configuration que tu mets à disposition dans cet article (mode historique).
    J’ai pris tel-quel ta config à partir de « font:  » jusqu’en bas. Mais lorsque je tente de valider la config dans esphome, il me dit que la variable « tarif » n’existe pas et après vérification, elle n’existe pas dans ta config de ton article.
    Peux-tu m’éclairer ou mettre à jour ton fichier de conf dans l’article afin que je puisse me baser dessus ?
    Merci d’avance Rémi !
    Cdt,

    Tony-O

      1. Bonjour, effectivement ça marche pas, je ne peux plus tester car je suis en mode « standard » mais
        Il faut ajouter « id: tarif » dans la variable
        – platform: teleinfo
        tag_name: « PTEC »
        id: tarif
        name: « Linky PTEC »
        teleinfo_id: myteleinfo
        Cela devrait fonctionner
        NB: j’ai mis le code à jour
        @+

  8. Hello,
    Bravo pour ce super article mais malheureusement le model d’ESP32 mini n’est plus disponible. T’aurais d’autres références?
    Merci a toi.

        1. Bonjour, l’esp que tu as commandé ne convient pas. Le brochage n’est pas compatible avec le module tic, je te conseille de prendre l’esp Mini que je préconise, bon courage à toi.

          1. Merci pour ton retour j’ai commandé ta référence. là il faut que je fasse les soudures. et ensuite je m’attaquerai au code 🙂
            une question par anticipation : mon compteur étant a l’extérieur j’ai presque 5mètres entre mon compteur et station domotique. je peux tirer du cable en 0,8 entre la prise teleinfo et le module?

          2. Bonjour, la section du câble convient mais attention, si le câble chemine dans un fourreau il faut un câble qui résiste aux intempéries.

    1. Bonjour
      C’est expliquer dans les pré requis, directive « !include_dir_named packages » qui permet d’éclater les configurations .yaml dans plusieurs fichier
      Slts

      1. Merci oui j’ai vu apres coup.
        autre question dans le input_number, on ne peut mettre que 2 chiffres apres la virgules. Le tarif du kwh edf étant souvant de 0.1487 de ce format là. comment gérer ce souci

  9. Une autre question afin de bien comprendre.
    Quel est l’intérêt d’ajouter les conso HP et HC alors qu’elles sont bien séparés dans la teleinfo et que le pannel énergie de home assistant permet d’ajouter plusieurs compteurs notament HC et HP ?
    Avec donc un seul tarif associé aux HC et un seul tarif associé aux HP.
    Merci

    1. Bonjour, bonne remarque mais en tarif HC/HP, le linky ne délivre pas la somme des deux, il faut donc additionner HP et HC dans l’esp, puis dégrouper dans HA avec ‘utility.meter ».
      Bonne continuation

      1. Merci de ta réponse.
        Oui mais je ne comprends pas l intérêt d’additionner les deux.
        Sachant que tu peux faire 2 utility meter, un hc et un hp, chaqu un associé à un seul tarif.
        Ça fonctionne pour le panneau énergie.

        1. Bonjour, Tu peux effectivement faire comme cela, mais le fait de regrouper diminue de moitié le nombre d’utility meter, et de visualiser d’un cout d’oeil le total autre ment que part la carte « energy ». Le principal étant que chacun y trouve son compte. Bonne continuation . Cdlt

  10. Bonjour,
    J’ai flashé le code (mode historique) dans l’ESP32 et interfacé avec HA. Pour l’instant, je ne suis pas encore relié au Linky, je teste ma « chaîne de production » 😉
    Cela a l’air de fonctionner, je peux accéder à l’interface et les senseurs apparaissent bien sur HA, avec des valeurs à 0 évidemment. Je peux piloter l’éclairage des LED depuis l’interface ESPHOME.
    En revanche, pas moyen de faire afficher quoi que ce soit sur l’afficheur OLED. Est-ce normal (i.e. dû au fait que je ne suis pas encore relié au linky) ?

    1. Bonjour, ce n’est pas normal, vous devriez voir un affichage sur votre Oled, regarder dans le log de l’esp si il detecte bien le oled, par ex
      [10:04:52][C][i2c.arduino:038]: I2C Bus:
      [10:04:52][C][i2c.arduino:039]: SDA Pin: GPIO21
      [10:04:52][C][i2c.arduino:040]: SCL Pin: GPIO22
      [10:04:52][C][i2c.arduino:041]: Frequency: 50000 Hz
      [10:04:52][C][i2c.arduino:044]: Recovery: bus successfully recovered
      [10:04:52][I][i2c.arduino:054]: Results from i2c bus scan:
      [10:04:52][I][i2c.arduino:060]: Found i2c device at address 0x3C

      1. Merci pour la réponse.
        Voici ce que j’obtiens dans le log :
        [C][ssd1306_i2c:023]: I2C SSD1306
        [C][ssd1306_i2c:023]: Rotations: 0 °
        [C][ssd1306_i2c:023]: Dimensions: 128px x 64px
        [C][ssd1306_i2c:024]: Address: 0x3C
        [C][ssd1306_i2c:025]: Model: SSD1306 128×64
        [C][ssd1306_i2c:027]: External VCC: NO
        [C][ssd1306_i2c:028]: Flip X: YES
        [C][ssd1306_i2c:029]: Flip Y: YES
        [C][ssd1306_i2c:030]: Offset X: 0
        [C][ssd1306_i2c:031]: Offset Y: 0
        [C][ssd1306_i2c:032]: Inverted Color: NO
        [C][ssd1306_i2c:033]: Update Interval: 1.0s
        [E][ssd1306_i2c:036]: Communication with SSD1306 failed!

        Il faut que je creuse pourquoi la communication ne se fait pas…

        1. En refaisant mon câblage, l’afficheur est bien détecté mais toujours rien sur l’écran…

          [C][i2c.arduino:052]: I2C Bus:
          [C][i2c.arduino:053]: SDA Pin: GPIO21
          [C][i2c.arduino:054]: SCL Pin: GPIO22
          [C][i2c.arduino:055]: Frequency: 50000 Hz
          [C][i2c.arduino:058]: Recovery: bus successfully recovered
          [I][i2c.arduino:068]: Results from i2c bus scan:
          [I][i2c.arduino:074]: Found i2c device at address 0x3C

          Une idée ?

          1. Petit complément. En réalité,il y a un affichage fugitif au démarrage, puis l’écran redeviens et reste noir. Impossible de lire ce qu’il affiche, c’est trop rapide…

          2. C’est bon, j’ai trouvé grâce au voltmètre : le câble de masse quasi-coupé dans le connecteur. La connexion ne se faisait plus que par un fil. Désolé pour le « bruit ».

  11. Bonjour,
    J’ai flashé le code (mode historique) dans l’ESP32 et interfacé avec HA. Pour l’instant, je ne suis pas encore relié au Linky, je teste ma « chaîne de production » 😉
    Cela a l’air de fonctionner, je peux accéder à l’interface et les senseurs apparaissent bien sur HA, avec des valeurs à 0 évidemment. Je peux piloter l’éclairage des LED depuis l’interface ESPHOME.
    En revanche, pas moyen de faire afficher quoi que ce soit sur l’afficheur OLED. Est-ce normal (i.e. dû au fait que je ne suis pas encore relié au linky) ?

    1. Bonjour, ce n’est pas normal, vous devriez voir un affichage sur votre Oled, regarder dans le log de l’esp si il detecte bien le oled, par ex
      [10:04:52][C][i2c.arduino:038]: I2C Bus:
      [10:04:52][C][i2c.arduino:039]: SDA Pin: GPIO21
      [10:04:52][C][i2c.arduino:040]: SCL Pin: GPIO22
      [10:04:52][C][i2c.arduino:041]: Frequency: 50000 Hz
      [10:04:52][C][i2c.arduino:044]: Recovery: bus successfully recovered
      [10:04:52][I][i2c.arduino:054]: Results from i2c bus scan:
      [10:04:52][I][i2c.arduino:060]: Found i2c device at address 0x3C

      1. Merci pour la réponse.
        Voici ce que j’obtiens dans le log :
        [C][ssd1306_i2c:023]: I2C SSD1306
        [C][ssd1306_i2c:023]: Rotations: 0 °
        [C][ssd1306_i2c:023]: Dimensions: 128px x 64px
        [C][ssd1306_i2c:024]: Address: 0x3C
        [C][ssd1306_i2c:025]: Model: SSD1306 128×64
        [C][ssd1306_i2c:027]: External VCC: NO
        [C][ssd1306_i2c:028]: Flip X: YES
        [C][ssd1306_i2c:029]: Flip Y: YES
        [C][ssd1306_i2c:030]: Offset X: 0
        [C][ssd1306_i2c:031]: Offset Y: 0
        [C][ssd1306_i2c:032]: Inverted Color: NO
        [C][ssd1306_i2c:033]: Update Interval: 1.0s
        [E][ssd1306_i2c:036]: Communication with SSD1306 failed!

        Il faut que je creuse pourquoi la communication ne se fait pas…

        1. En refaisant mon câblage, l’afficheur est bien détecté mais toujours rien sur l’écran…

          [C][i2c.arduino:052]: I2C Bus:
          [C][i2c.arduino:053]: SDA Pin: GPIO21
          [C][i2c.arduino:054]: SCL Pin: GPIO22
          [C][i2c.arduino:055]: Frequency: 50000 Hz
          [C][i2c.arduino:058]: Recovery: bus successfully recovered
          [I][i2c.arduino:068]: Results from i2c bus scan:
          [I][i2c.arduino:074]: Found i2c device at address 0x3C

          Une idée ?

          1. Petit complément. En réalité,il y a un affichage fugitif au démarrage, puis l’écran redeviens et reste noir. Impossible de lire ce qu’il affiche, c’est trop rapide…

          2. C’est bon, j’ai trouvé grâce au voltmètre : le câble de masse quasi-coupé dans le connecteur. La connexion ne se faisait plus que par un fil. Désolé pour le « bruit ».

  12. super tuto, super complet! merci

    j’avais un WARNING à la compilation et grace à ton

    std::string tarif_ = id(tarif).state;

    tout est ok! merci

  13. Bonjour, merci pour le tuto.
    Moi qui m’inquiétait de mes 30m linéaire entre le compteur et le tableau … aucun soucis donc ?

    1. Bonjour, non pas de souci, un Bad CRC de temps en temps, normal je dirai, mais sans conséquence, le câble est un u1000r2v 2*1.5mm2. Cdlt

  14. Bonjour, merci pour le tuto.
    Moi qui m’inquiétait de mes 30m linéaire entre le compteur et le tableau … aucun soucis donc ?

    1. Bonjour, non pas de souci, un Bad CRC de temps en temps, normal je dirai, mais sans conséquence, le câble est un u1000r2v 2*1.5mm2. Cdlt

  15. Bonjour,

    J’ai un ESP32 qui remonte HC et HP, je me pose la question si celui ci est capable de remonté les couleurs de jours en abonnement Tempo en modifiant le code?
    si oui quel est le code a implémenter SVP

    merci d’avance

    cordialement

    1. Bonjour, cela semble possible en mode historique. Je ne peux pas le tester puis confirmer car je suis en mode « Standard » cependant d’apres la doc consultable dans « descriptif fonctionnel » page 15 dans le tableau 6.1.1, « PTEC » devrait vous donner le tarif en cours HC BLEU, HP BLEU, ..et pour les KWH il suffit de remplacer dans platform-teleinfo les registres HCHC et HCHP par les deux premiers registre tempo BBRHCJB et BBRHPJC puis d’ajouter les 4 registres suivants.
      pour info, j’ai mis le code à jour dans https://domo.rem81.com/2022/01/12/ha-teleinformation-linky-mode-standard/ c’est peut etre le monet d’y passer
      Cdlt.

  16. Bonjour,

    J’ai un ESP32 qui remonte HC et HP, je me pose la question si celui ci est capable de remonté les couleurs de jours en abonnement Tempo en modifiant le code?
    si oui quel est le code a implémenter SVP

    merci d’avance

    cordialement

    1. Bonjour, cela semble possible en mode historique. Je ne peux pas le tester puis confirmer car je suis en mode « Standard » cependant d’apres la doc consultable dans « descriptif fonctionnel » page 15 dans le tableau 6.1.1, « PTEC » devrait vous donner le tarif en cours HC BLEU, HP BLEU, ..et pour les KWH il suffit de remplacer dans platform-teleinfo les registres HCHC et HCHP par les deux premiers registre tempo BBRHCJB et BBRHPJC puis d’ajouter les 4 registres suivants.
      pour info, j’ai mis le code à jour dans https://domo.rem81.com/2022/01/12/ha-teleinformation-linky-mode-standard/ c’est peut etre le monet d’y passer
      Cdlt.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *