Téléinfo via wifi

Merci je vais regarder ça !

Ok, ça à l’air de fonctionner pour le tri.
Je post le yaml que j’ai modifié :

substitutions:
  name: teleinfo

esphome:
  name: ${name}
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: "MonReseauWifi"
  password: "CestPasMonMotDePass"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Teleinfo Fallback Hotspot"
    password: "DurDur"

web_server:
  port: 80

captive_portal:

# Enable logging
logger:     
  baud_rate: 0   # disable logging via UART, help to avoid numerous crash with ESP_LOGD
  level: INFO   # INFO for less log, put DEBUG to view all the linky's "étiquettes" received  in the logs
  esp8266_store_log_strings_in_flash: False     # recommanded for ESP8266 https://esphome.io/components/sensor/custom.html

# Enable Home Assistant API
api:
  password: "Coucou"

ota:
  password: "CPaMoi"

# ajout du composant uart pour la communication série avec la sortie TIC du compteur
# GPIO3 = Pin Rx sur Wemos D1
uart:
  id: uart_bus
#  tx_pin: GPIO15
  rx_pin: GPIO3
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

# déclaration des sensors numérique
# les sensors doivent être déclarés dans l'ordre de la fonction lambda
sensor:
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s
    unit_of_measurement: dB
    accuracy_decimals: 0
    force_update: false
    icon: mdi:wifi
  - platform: uptime
    id: uptime_seconds
    name: "Uptime Sensor"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer
  - platform: teleinfo
    tags:
     - tag_name: "ADCO"
       sensor:
        name: "ADCO"
        unit_of_measurement: ""
        icon: mdi:eye
     - tag_name: "BASE"
       sensor:
        name: "Index"
        unit_of_measurement: "kWh"
        icon: mdi:home-analytics
        filters:
          - multiply: 0.001
     - tag_name: "ISOUSC"
       sensor:
        name: "Intensité souscrite"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IMAX1"
       sensor:
        name: "Intensité Max Phase 1"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IMAX2"
       sensor:
        name: "Intensité Max Phase 2"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IMAX3"
       sensor:
        name: "Intensité Max Phase 3"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IINST1"
       sensor:
        name: "Intensité Phase 1"
        unit_of_measurement: "A"
        icon: mdi:power-plug
     - tag_name: "IINST2"
       sensor:
        name: "Intensité Phase 2"
        unit_of_measurement: "A"
        icon: mdi:power-plug
     - tag_name: "IINST3"
       sensor:
        name: "Intensité Phase 3"
        unit_of_measurement: "A"
        icon: mdi:power-plug
     - tag_name: "PMAX"
       sensor:
        name: "Puissance Max Atteinte"
        unit_of_measurement: "W"
        icon: mdi:flash
     - tag_name: "PAPP"
       sensor:
        name: "Puissance apparente triphasée"
        unit_of_measurement: "VA"
        icon: mdi:flash
    update_interval: 2s
    historical_mode: true

binary_sensor:
  - platform: status
    name: "Status"

switch:
  - platform: restart
    name: "${name} reboot"

text_sensor:
  - platform: template
    name: ${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() };
      }

En revanche, ça me parait pas trop précis sur l’intensité consommé sur chaque phase (Il y a un moyen d’avoir du chiffre après la virgule ou c’est vraiment juste ça ?). Et, l’intensité max par phase me parait bizarre.


J’ai bien un 9kVA donc 15A. Mais 60A par phase me parait beaucoup…

Si tu modifies le level en mettant DEBUG, tu pourras voir les trames brutes en cliquant sur « LOGS » dans ESPHome il me semble.
Tu pourras voir si la valeur brute est arrondie ou pas.

Bon, c’est mis en Debug.
Je ne vois pas les trames brutes.
Apparemment c’est de toute façon tout ce qu’on peut avoir, j’ai mis un « accuracy_decimals: 2 » sur les lignes pour l’intensité sans grand effet…

Oui à priori le Linky nous envoie un entier.

Merci @Schmurtz pour l’info des apexCharts c’est top !!

J’aimerais aussi faire un tableau avec ces données. Je vais voir si on peut utiliser la custom card Linky.

Merci @Jcpas et désolé pour la réponse tardive, effectivement je n’avait pas l’étiquette HCHC et HCHP, je les ai ajouté mais l’info ne remonte pas.

Mon code :

substitutions:
  name: teleinfo

esphome:
  name: ${name}
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: "Livebox"
  password: "pass"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Teleinfo Fallback Hotspot"
    password: "tototeleinfo"

web_server:
  port: 80

captive_portal:

# Enable logging
logger:     
  baud_rate: 0   # disable logging via UART, help to avoid numerous crash with ESP_LOGD
  level: DEBUG   # INFO for less log, put DEBUG to view all the linky's "étiquettes" received  in the logs
  esp8266_store_log_strings_in_flash: False     # recommanded for ESP8266 https://esphome.io/components/sensor/custom.html

# Enable Home Assistant API
api:
  password: "toto"

ota:
  password: "toto"

# ajout du composant uart pour la communication série avec la sortie TIC du compteur
# GPIO3 = Pin Rx sur Wemos D1
uart:
  id: uart_bus
#  tx_pin: GPIO15
  rx_pin: GPIO3
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

# déclaration des sensors numérique
# les sensors doivent être déclarés dans l'ordre de la fonction lambda
sensor:
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s
    unit_of_measurement: dB
    accuracy_decimals: 0
    force_update: false
    icon: mdi:wifi
  - platform: uptime
    id: uptime_seconds
    name: "Uptime Sensor"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer
  - platform: teleinfo
    tags:
     - tag_name: "ADCO"
       sensor:
        name: "ADCO"
        unit_of_measurement: ""
        icon: mdi:eye
     - tag_name: "BASE"
       sensor:
        name: "Index"
        unit_of_measurement: "kWh"
        icon: mdi:home-analytics
        filters:
          - multiply: 0.001
     - tag_name: "ISOUSC"
       sensor:
        name: "Intensité souscrite"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IMAX"
       sensor:
        name: "Intensité maximale"
        unit_of_measurement: "A"
        icon: mdi:information
     - tag_name: "IINST"
       sensor:
        name: "Intensité"
        unit_of_measurement: "A"
        icon: mdi:power-plug
     - tag_name: "PAPP"
       sensor:
        name: "Puissance"
        unit_of_measurement: "VA"
        icon: mdi:flash
     - tag_name: "HC"
       sensor:
        name: "Heure creuse"
        unit_of_measurement: "Wh"
        icon: mdi:flash
     - tag_name: "HP"
       sensor:
        name: "Heure pleine"
        unit_of_measurement: "Wh"
        icon: mdi:flash
    update_interval: 10s
    historical_mode: true

binary_sensor:
  - platform: status
    name: "Status"

switch:
  - platform: restart
    name: "${name} reboot"

text_sensor:
  - platform: template
    name: ${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() };
      }

Je ne vois pas où se trouve le problème.
Je ne suis pas avec le linky mais le compteur électronique de la génération précédente.

Merci pour votre aide.

Bonjour
Les étiquettes HC et HP
Sont a remplacer dans ton code par HCHP et HCHC
Regardes mon message du 9 février

Merci @jrvrcd
Je savais que c’était HCHC et HCHP mais trop la tête dans le guidon et je suis passé à côté de ça :triumph:.
Je récupère bien les indice heure creuse et heure pleine maintenant.
Aurais tu une solution pour remonter par graphe journalier, hebdomadaire, mensuel et annuelle
, La consommation et le coût stp ?

Bonjour

pour le moment je ne fait que collecter les informations, la mise en forme… désolé mais je ne suis pas expert
cependant il y a de tres belles realisations ( regarde du coté de ENEDIS) et surtout de la custom card apexcharts-card ( necessite HACS ) il y a un post a ce sujet

pour ma part je ne fais que des utility_meter
regarde le post de Schmurtz du 5 fevrier

Tu peux déjà créer des utility_meter, ensuite tu pourras faire des graphes sur ces données comme j’ai mis un peu plus haut avec apexcharts.

Tiens du coup ça me faite tiquer ce que tu marque.
Pourquoi utiliser les données de utility_meter ?

ça, ça marche direct :

type: 'custom:apexcharts-card'
graph_span: 30d
header:
  show: true
  title: Consomation en kWh par jour
series:
  - entity: sensor.index
    type: column
    name: Conso ju jour
    group_by:
      func: delta
      duration: 1d

J’avais déjà les utility_meter créés donc je ne me suis même pas posé la question.
J’ai essayé ce que tu as mis mais j’ai une différence entre les deux méthodes, même si c’est assez proche (sauf pour le premier jour) :

L’utilisation des utility_meter permet également d’avoir une entité dédiée au suivi, consultable mais surtout exploitable pour des calculs (par exemple créer grâce à l’entité utility_meter une entité représentant la tendance du mois, de l’année directement sans avoir à afficher un graphique.

Ok pour avoir une conso chiffré utilisable ailleurs.

Un petit ajout de span devrait régler le soucis, sinon ça doit être en glissant je pense :

type: 'custom:apexcharts-card'
graph_span: 30d
header:
  show: true
  title: Consomation en kWh par jour
span:
  end: day
series:
  - entity: sensor.index
    type: column
    name: Conso ju jour
    group_by:
      func: delta
      duration: 1d

Voici le PCB que je compte lancer en fabrication via JLCPCB pour suivre la téléinfo via un ESP32 :

Et voici le schéma avec les composants :

N’hésitez pas à faire des commentaires si vous avez des idées, je suis preneur :grin:

Pour info, je devrais avoir des PCB en rab, si ça intéresse quelqu’un !

Salut,
J’en ai fabriqué un qui fonctionne très bien, mais avec un Wemos D1 mini Pro afin de pouvoir rentrer l’ensemble du module dans le boitier du compteur linky.



Comme tu peux le voir j’ai remplacé la résistance R1 de 4K7 par une 1K en entrée, sinon cela ne fonctionnait pas.

Bonjour,
Finalement vous avez des PCN en rab ?
Ça pourrait m’intéresser
Cdlt
Philippe

@Pbranly, c’est commandé, je suis en attente.
D’ici 15 jours je pense …