Mon module de téléinformation (TIC) wifi vers MQTT pour compteur linky et autres

COOOOL !! :champagne: :champagne: :champagne:

J’ai réussi à uploader mon code dans le module et il est visible via son adresse IP en lui ajoutant l’option web_server de ESPHome.

Voici mon code pour qu’il puisse être compilé et uploadé via l’OTA WiFi :

teleinfokit.yaml
# ESPHome configuration file for teleinfokit module https://342apps.net/module-teleinfokit/

esphome:
  arduino_version: 2.5.1
  name: teleinfokit
  platform: ESP8266
  board: esp01_1m

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_key
  
  # Optional manual IP
  manual_ip:
    static_ip: !secret ip_teleinfo
    gateway: !secret ip_gateway
    subnet: !secret ip_subnet

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "TeleInfoKit"
    password: !secret ap_key

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     #  :doc:`recommanded for ESP8266 </components/sensor/custom>`

# Enable Home Assistant API
api:
  password: !secret api_pass

ota:
  password: !secret ota_pass
  id: my_ota

web_server:
  port: !secret web_port

uart:
  id: uart_bus
  rx_pin: GPIO3
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

teleinfo:
  id: myteleinfo
  update_interval: 30s
  historical_mode: true

sensor:
  - platform: teleinfo
    tag_name: "HCHC"
    id: hchc
    name: "Index Heures Creuses"
    unit_of_measurement: "Wh"
    icon: mdi:flash
    device_class: energy
    state_class: measurement
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "HCHP"
    id: hchp
    name: "Index Heures Pleines"
    unit_of_measurement: "Wh"
    icon: mdi:flash
    device_class: energy
    state_class: measurement
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "PAPP"
    id: papp
    name: "Puissance Actuelle"
    unit_of_measurement: "VA"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "IINST"
    id: iinst
    name: "Intensité Actuelle"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo

i2c:
  sda: GPIO0
  scl: GPIO2

font:
  - file: "arial.ttf"
    id: arial_font
    size: 16

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x32"
    id: oled
    rotation: 180°
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
          it.printf(0, 0, id(arial_font), "Conso: %.0f VA", id(papp).state);
      - id: page2
        lambda: |-
          it.printf(0, 0, id(arial_font), "Intensite: %.0f A", id(iinst).state);
      - id: page3
        lambda: |-
          it.printf(0, 0, id(arial_font), "HP: %.0f", id(hchp).state);
      - id: page4
        lambda: |-
          it.printf(0, 0, id(arial_font), "HC: %.0f", id(hchc).state);
interval:
  - interval: 5s
    then:
      - display.page.show_next: oled
      - component.update: oled

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO1
      mode: INPUT_PULLUP
      inverted: True
    name: teleinfokit_switch
    on_click:
      min_length: 50ms
      max_length: 350ms
      then:
        - lambda: if (id(oled).is_on()) id(oled).turn_off(); else id(oled).turn_on();

Par contre, comme mon abonnement n’a pas d’Heure Creuse/Heure Pleine, je me posais la question comment pouvoir lire l’index de mon compteur Linky ?
Et j’aurais voulu aussi l’intégrer dans la nouvelle « option » de HA qui est Energie :

Comment dois-je procéder et est-ce que je dois créer de nouveau sensor ?

Petite info, je ne vois pas de topic teleinfokit dans mon broker MQTT :
image
Comparé à @Clemalex :

Merci @NicoP4 , je viens de recevoir le module. J’ai hâte de le tester mais je veux faire un truc un minimum propre donc je ferais ca tranquillement ce WE.

En tout cas le module est vraiment très petit même si j’avais vu une photo avec une clé je ne m’attendais pas a ca :slight_smile: et ca fait quelque chose de très bien fini avec le boitier. Bravo

A+

Sylvain,
Pour utiliser Energy , il faut respecter ceci:
For 2021.9 onwards
Only requirements for sensors to show up in Energy is that they are measuring kWh
and that they have a state_class: total_increasing

If you previously customised your sensors to work in 2021.8 by adding last_reset and state_class: measurement you should remove the former and change the latter. You can do that same as before (see bullet points in previous pinned message).

Keep in mind however it’s best to incorporate these attributes in the integration itself and not as customisations!

Phil

Ok pour la configuration pour le dashboard Énergie mais est-ce qu’il faut que le module transfère les données via MQTT ? Et donc, est-ce qu’il doit être visible sous MQTT Explorer ?

Hello
Si tu utilises la version ESPHOME, je ne vois pas l’intérêt de passer par MQTT.
Utilise ESPHOME depuis home assistant et tes sensors seront automatiquement remontés vers HA.
Pour pouvoir utiliser le module Energy de HA, il faut juste qu’il y ait un sensor en kWh ( en Wh ça marcherait aussi mais je ne vois pas l’intérêt de gérer d’aussi grands chiffres) et qu’il respecte çe que je t’ai copie collé en Anglais .
Dans le cas d’un contrat sans Heure creuse, utile Base qui est en wH.
Phil

OK, en fait il fallait que je supprime mes anciennes intégrations HS de ESPHome pour pouvoir recréer ma nouvelle.
Je vois bien mon intégration maintenant :
image

Du coup, voilà mes sensors que j’ai défini dans le code uploadé :

sensor
sensor:
  - platform: teleinfo
    tag_name: "PAPP"
    id: papp
    name: "Puissance Actuelle"
    unit_of_measurement: "VA"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "IINST"
    id: iinst
    name: "Intensité Actuelle"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "BASE"
    id: base
    name: "Index"
    unit_of_measurement: "kWh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    state_class: total_increasing
    device_class: energy

@Pbranly, est-ce que cela te parait bon ? Je n’ai pas réussi à ajouté ce bout de code value_template: "{{float(value) / 1000.0}}", j’avais une erreur.
Est-ce qu’il est nécessaire ? vu que j’ai mis unit_of_measurement: "kWh".

Hello
La syntaxe est plutôt celle là:


filters:
  - lambda: return (x * 0.001);

Voilà, tu désinstalles et réinstalles l’intégration ESPHOME et tu devrais trouver ton sensor intégrable dans Energy.
Il faut ensuite attendre une bonne heure pour que ça fonctionne
Phil

@Pbranly , un truc comme ça du coup ?

sensor
sensor:
  - platform: teleinfo
    tag_name: "PAPP"
    id: papp
    name: "Puissance Actuelle"
    unit_of_measurement: "VA"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "IINST"
    id: iinst
    name: "Intensité Actuelle"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "BASE"
    id: base
    name: "Index"
    unit_of_measurement: "kWh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    state_class: total_increasing
    device_class: energy
    filters:
      - lambda: return (x * 0.001);

Oui ça devrait marcher ça.
Vérifie que le sensor géneré est bon .
J’ai un doute sur le nombre de chiffres après la virgule
Tu devras peut-être ajouter la ligne
accuracy_decimals: 3
Je ne peux pas tester car je suis resté en MQTT avec le soft d’origine sur le teleinfokit de Nico
Je suis en ESPHOME pour le gaz depuis mon Gazpar et pour l’eau avec une sonde inductive ( en attendant qu’ils ajoutent l’eau dans le module Energy !)

Ok, j’ai configuré avec les kWh mais le graph n’est pas très pertinent :
image

En fait j’ai l’impression qu’il n’affiche une « barre » que lorsque l’index évolue, or c’est configuré en kWh, ça n’évolue pas vite… Et ça fait un « trou » sur certaines heures alors que je consomme, moins d’un Wh.

Comment faire pour rester en Wh, le dashboard Energie est compatible avec les Wh ?

Je crois que oui . Dans le code, ça supporterait les Wh.
Mais tu m’étonnes de consommer aussi peu, voire rien par heure . Tu as ta box, ton frigo, des chargeurs etc …. Qui consomment .
Je suis absent actuellement de chez moi et je consomme de l’ordre de 140Wh en permanence .
Mais je suis en MQTT. Peut être qu’en ESPHOME, tu envoies des données différemment

La raison est peut être que tu ne gères pas 3 décimales
Donc il ne voit pas de différences
Ajoute
accuracy_decimals: 3
Et ça marchera

Super @Pbranly, ça commence à récupérer des données plus fréquemment.

Avec tout ces essais, j’ai un peu pourri mon historique, est-ce que tu aurais un moyen de ne prendre en compte les données qu’à partir d’une date précise ?
J’ai vu un paramètre last_reset mais il n’est pas compatible avec ESPHome donc impossible de le mettre dans le code de ESP et je n’arrive pas à savoir où le mettre dans la config HA… :thinking:

Super !
Il ne faut surtout plus mettre last_reset
Pour raz soit tu changes le nom du sensor et ca repartira de zéro
Soit (?? Pas sûr) tu retires les valeurs directement dans ta base de données
Amitiés
Philippe

J’ai beau changer l’id et le name mais j’ai toujours l’historique.

Il faut changer aussi dans le module energy
Ceci dit c’est pas grave car comme tu récupères une valeur absolue , tu n’as pas forcément les itérations que tu veux ( par heure) mais ça se rattrape
Il y a un moment où il ne faut plus toucher ….

C’est bizarre mais le graphique change… Aujourd’hui, j’ai eu ça
à 8h00 :


à 12h00 :

Les données avant 8h00 se sont agrégées entre les deux graphiques.

Edit :
J’ai trouvé le moyen de supprimer les données que je ne voulais pas.
en utilisant ce post.
J’ai installé l’add-on SQLite Web, puis il faut trouver les id des statistic_id à supprimer via la table statistics_meta, dans mon cas les id 4 et 7, sensor.index et sensor.index_kwh :

Ensuite, dans la table statistics, il faut indiquer la requête suivante :

DELETE 
FROM `statistics` 
WHERE metadata_id='<id_1>' or metadata_id='<id_2>' 
AND created BETWEEN '<date_debut>' AND '<date_fin>';

Dans mon cas :

  • <id_1> : 4 qui correspond à sensor.index
  • <id_2> : 7 qui correspond à sensor.index_kwh
  • <date_debut> : 2021-09-21 00:00:00 qui correspond au début de la plage à effacer soit depuis le 21/09/2021 à 00h00
  • <date_fin> : 2021-09-23 06:00:00 qui correspond à la fin de la plage à effacer soit jusqu’au 23/09/2021 à 06h00

Ce qui donne ceci :


Ensuite, vous pouvez cliquer sur le bouton Execute
Vos données seront alors effacées !

Pour vérifier quelles données seront effacées, remplacer DELETE par SELECT *

Hello Sylvain,
Comme on travaillé par itération, peux tu partager ta configuration ESPHOME finale ?
Ça intéressera d’autres personne et aussi permettra à @NicoP4 Nicolas de mettre à jour son GitHub
Phil

1 « J'aime »

@Pbranly, avec plaisir :grin:

le code que j’ai sur mon module acheté chez @NicoP4 :

teleinfokit.yaml
# ESPHome configuration file for teleinfokit module https://342apps.net/module-teleinfokit/

esphome:
  arduino_version: 2.5.1
  name: teleinfokit
  platform: ESP8266
  board: esp01_1m

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_key
  
  # Optional manual IP
  manual_ip:
    static_ip: !secret ip_teleinfo
    gateway: !secret ip_gateway
    subnet: !secret ip_subnet

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "TeleInfoKit"
    password: !secret ap_key

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     #  :doc:`recommanded for ESP8266 </components/sensor/custom>`

# Enable Home Assistant API
api:
  password: !secret api_pass

ota:
  password: !secret ota_pass
  id: my_ota

web_server:
  port: !secret web_port

uart:
  id: uart_bus
  rx_pin: GPIO3
  baud_rate: 1200
  parity: EVEN
  data_bits: 7

teleinfo:
  id: myteleinfo
  update_interval: 30s
  historical_mode: true

sensor:
  - platform: teleinfo
    tag_name: "PAPP"
    id: papp
    name: "Puissance Actuelle"
    unit_of_measurement: "VA"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "IINST"
    id: iinst
    name: "Intensité Actuelle"
    unit_of_measurement: "A"
    icon: mdi:flash
    teleinfo_id: myteleinfo
  - platform: teleinfo
    tag_name: "BASE"
    id: basekwh
    name: "Index (kWh)"
    unit_of_measurement: "kWh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    state_class: total_increasing
    device_class: energy
    accuracy_decimals: 3
    filters:
      - lambda: return (x * 0.001);
  - platform: teleinfo
    tag_name: "BASE"
    id: base
    name: "Index"
    unit_of_measurement: "Wh"
    icon: mdi:flash
    teleinfo_id: myteleinfo
    state_class: total_increasing
    device_class: energy

i2c:
  sda: GPIO0
  scl: GPIO2

font:
  - file: "arial.ttf"
    id: arial_font
    size: 16

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x32"
    id: oled
    rotation: 180°
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
          it.printf(0, 0, id(arial_font), "Conso: %.0f VA", id(papp).state);
      - id: page2
        lambda: |-
          it.printf(0, 0, id(arial_font), "Intensite: %.0f A", id(iinst).state);
      - id: page3
        lambda: |-
          it.printf(0, 0, id(arial_font), "Index: %.0f", id(base).state);
interval:
  - interval: 5s
    then:
      - display.page.show_next: oled
      - component.update: oled

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO1
      mode: INPUT_PULLUP
      inverted: True
    name: teleinfokit_switch
    on_click:
      min_length: 50ms
      max_length: 350ms
      then:
        - lambda: if (id(oled).is_on()) id(oled).turn_off(); else id(oled).turn_on();

J’ai laissé les 2 sensors Index (kWh) et Index car j’utilise le 2nd Index pour un captage manuel par semaine que j’avais avant HA. Cela m’évite juste d’aller voir l’index sur le compteur Linky.
Pour le dashboard Energy, seul le sensor Index (kWh) est donc nécessaire.

Au passage un ENORME MERCI à vous tous pour votre aide et BRAVO à @NicoP4 pour son module qui vaut vraiment le coup. :clap: :clap: :clap: :clap:
D’ailleurs, @NicoP4, si tu as besoin d’aide pour améliorer ta doc sur la partie ESPHome, ce sera avec grand plaisir :wink:

1 « J'aime »

Salut!
Le noob que je suis se demande la difference entre le firmware d’origine et celui modifier ESPHOME ? :sweat_smile:
Merci :blush: