{"id":1133,"date":"2022-01-12T14:57:00","date_gmt":"2022-01-12T13:57:00","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=1133"},"modified":"2025-04-14T09:41:58","modified_gmt":"2025-04-14T07:41:58","slug":"ha-teleinformation-linky-mode-standard","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2022\/01\/12\/ha-teleinformation-linky-mode-standard\/","title":{"rendered":"HA-Teleinformation Linky-Mode Standard"},"content":{"rendered":"\n\n\n\n<h1 class=\"wp-block-heading\">Intro<\/h1>\n\n\n\n<p>Dans un article pr\u00e9c\u00e9dent <a rel=\"noreferrer noopener\" href=\"https:\/\/domo.rem81.com\/ha-teleinformation-linky-mode-historique\/\" target=\"_blank\"> https:\/\/domo.rem81.com\/ha-teleinformation-linky-mode-historique\/<\/a> , je d\u00e9crivais la mis en oeuvre d&rsquo;une communication entre un Linky et Home Assistant en mode Historique.<\/p>\n\n\n\n<p>Apr\u00e8s avoir fonctionn\u00e9 un temps en mode \u00ab\u00a0Historique\u00a0\u00bb, je suis pass\u00e9 au mode \u00ab\u00a0Standard\u00a0\u00bb. Celui ci offre un plus grand nombre de donn\u00e9es.<\/p>\n\n\n\n<p>Raccordement de la t\u00e9l\u00e9 information de mon compteur Linky. Rien de bien m\u00e9chant il suffit de se raccorder aux bornes i1\/i2 du linky, le plus d\u00e9licat fut le passage du c\u00e2ble de 60 ml entre le compteur Linky et mon tableau \u00e9lectrique.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"592\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-2-1-1024x592.png\" alt=\"\" class=\"wp-image-1236\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-2-1-1024x592.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-2-1-300x173.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-2-1-768x444.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-2-1.png 1068w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Raccordement du Linky<\/figcaption><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Mises \u00e0 jour<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">du 21\/03\/2025:<\/h2>\n\n\n\n<p>Int\u00e9gration du d\u00e9codage du status LINKY dans le code ESP Home du Tempo. Plus besoin de passer par AppDaemon. PS: n&rsquo;ayant pas la possibilit\u00e9 de les tester, je n&rsquo;ai pas modifi\u00e9 la version \u00ab\u00a0HP\/HC\u00a0\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">du 23\/11\/2023:<\/h2>\n\n\n\n<p>Ajout d&rsquo;une version EDF \u00ab\u00a0Tempo\u00a0\u00bb<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">du 16\/08\/2022<\/h2>\n\n\n\n<p>Ajout du \u00ab\u00a0filter out\u00a0\u00bb dans les HP,HC permettant de rejeter les valeurs nulles si besoin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">du 12\/04\/2022<\/h2>\n\n\n\n<p>Suite \u00e0 passage Home Assistant&nbsp;2022.4.0, modification du changement de tarif des utility meter https:\/\/www.home-assistant.io\/integrations\/utility_meter<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9 requis<\/h1>\n\n\n\n<p class=\"has-text-align-left\">Mes fichiers \u00ab\u00a0.yaml\u00a0\u00bb sont regroup\u00e9s dans un dossier \u00ab\u00a0config\/packages\u00a0\u00bb. J&rsquo;utilise la directive <a href=\"https:\/\/www.home-assistant.io\/docs\/configuration\/splitting_configuration\/\" data-type=\"URL\" data-id=\"https:\/\/www.home-assistant.io\/docs\/configuration\/splitting_configuration\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00ab\u00a0!include_dir_named<\/a> packages\u00a0\u00bb dans mon \u00ab\u00a0configuration.yaml\u00a0\u00bb tr\u00e8s pratique pour organiser son HA.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nhomeassistant:\n  name: Crochon\n  latitude: !secret latitude\n  longitude: !secret longitude\n  unit_system: metric\n  packages: !include_dir_named packages\n  external_url: !secret external-url\n  internal_url: !secret internal-url<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Choix du mat\u00e9riel<\/h1>\n\n\n\n<p>Les informations transmises par le Linky ne sont pas directement exploitables par un ESP, elles n\u00e9cessitent un adaptateur, vous trouverez beaucoup de mod\u00e8les sur le Net, perso j&rsquo;ai choisi la facilit\u00e9 en achetant un module <a href=\"https:\/\/www.tindie.com\/products\/hallard\/wemos-teleinfo\/\" data-type=\"URL\" data-id=\"https:\/\/www.tindie.com\/products\/hallard\/wemos-teleinfo\/\">Wemos Teleinfo<\/a>. J&rsquo;utilise la version 1.1, la nouvelle version 1.2 peut pr\u00e9senter des diff\u00e9rences, \u00e0 voir dans la <a href=\"https:\/\/github.com\/hallard\/WeMos-TIC\" data-type=\"link\" data-id=\"https:\/\/github.com\/hallard\/WeMos-TIC\" target=\"_blank\" rel=\"noreferrer noopener\">documentation.<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn.tindiemedia.com\/images\/resize\/to67tjeZxaZZo3QPTOUFgSttoVs=\/p\/fit-in\/1032x688\/filters:fill(fff)\/i\/products\/25467\/2021-11-24-23-41-35\/2021-11-24T17_07_47.675Z-WeMos-TIC-assembled-top.png?1637747448\" alt=\"WeMos Teleinfo 2\"\/><\/figure>\n\n\n\n<p>C&rsquo;est un module pas tr\u00e8s cher, correctement \u00e9tudi\u00e9 et bien fini, compatible avec les esp8266 et ESP32 Mini, qui dispose \u00e9galement d&rsquo;une Led WS2812 RGB programmable, d&rsquo;un connecteur I2C disponible pour un afficheur OLED ou autres capteurs compatibles, et d&rsquo;une led indiquant l&rsquo;\u00e9tat de la connexion avec le Linky qui se raccorde sur le bornier vert.<\/p>\n\n\n\n<p>Perso j&rsquo;utilise un <a href=\"https:\/\/www.amazon.fr\/AZDelivery-Microcontr%C3%B4leur-ESP32-WROOM-32-compatible-incluant\/dp\/B08BTLYSTM\/ref=sr_1_11?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=2ZGQUFG671BZT&amp;keywords=esp32+mini&amp;qid=1641795150&amp;s=computers&amp;sprefix=esp32+mini%2Ccomputers%2C815&amp;sr=1-11\" data-type=\"URL\" data-id=\"https:\/\/www.amazon.fr\/AZDelivery-Microcontr%C3%B4leur-ESP32-WROOM-32-compatible-incluant\/dp\/B08BTLYSTM\/ref=sr_1_11?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=2ZGQUFG671BZT&amp;keywords=esp32+mini&amp;qid=1641795150&amp;s=computers&amp;sprefix=esp32+mini%2Ccomputers%2C815&amp;sr=1-11\" target=\"_blank\" rel=\"noreferrer noopener\">L&rsquo;ESP32 Mini<\/a>, en effet l&rsquo;ESP8266 est trop juste en puissance de calcul si on utilise l&rsquo;int\u00e9gration  ESPHOME plus un afficheur, j&rsquo;ai gal\u00e9r\u00e9 avec, je ne le recommande pas, le constructeur du wemos t\u00e9l\u00e9info non plus d&rsquo;ailleurs.<\/p>\n\n\n\n<p>L&rsquo;ESP32 Mini est un ESP32 au format ESP8266 D1, pratique si l&rsquo;on souhaite utiliser des cartes d&rsquo;extension, mais avec une puissance de calcul et de traitement bien sup\u00e9rieure.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Descriptif fonctionnel<\/h1>\n\n\n\n<p>Les compteurs Linky disposent de 2 modes de t\u00e9l\u00e9information :<br>\u2022 Le mode Historique, qui correspond \u00e0 l&rsquo;ancien mode des compteurs \u00e9lectroniques.<br>\u2022 Le mode Standard, qui est le nouveau format et qui comporte plus d&rsquo;informations.<\/p>\n\n\n\n<p>Vous trouverez les informations d\u00e9taill\u00e9es dans le document  Enedis suivant:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/remycrochon\/domo.rem81\/blob\/main\/Enedis-NOI-CPT_54E-1.pdf\">https:\/\/github.com\/remycrochon\/domo.rem81\/blob\/main\/Enedis-NOI-CPT_54E-1.pdf<\/a><\/p>\n\n\n\n<p>Le module WEMOS Teleinfo est compatible, le changement de mode passe obligatoirement par une demande aupr\u00e8s de votre fournisseur d&rsquo;\u00e9nergie qui relaye vers Enedis.<\/p>\n\n\n\n<p>Concernant l&rsquo;int\u00e9gration dans HA, pas de probl\u00e8me particulier gr\u00e2ce \u00e0 <a rel=\"noreferrer noopener\" href=\"https:\/\/www.esphome.io\/components\/sensor\/teleinfo.html\" target=\"_blank\">\u00ab\u00a0teleinfo\u00a0\u00bb<\/a> disponible sur ESP Home, il est compatible avec les deux modes, les diff\u00e9rences \u00e9tant dans la vitesse de transmission et la validation du mode historique ou pas:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"228\" height=\"258\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-23.png\" alt=\"\" class=\"wp-image-1420 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-large-font-size\">Mode Historique<\/p>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"173\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-24-1.png\" alt=\"\" class=\"wp-image-1422 size-full\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-24-1.png 172w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-24-1-150x150.png 150w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-large-font-size\">Mode Standard<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Informations collect\u00e9es<\/h2>\n\n\n\n<p>Je divise par 1000 le total de l&rsquo;\u00e9nergie active soutir\u00e9e \u00ab\u00a0EAST\u00a0\u00bb pour obtenir des kWh. C&rsquo;est cette entit\u00e9 que j&rsquo;utilise dans les \u00ab\u00a0utility meter\u00a0\u00bb de HA pour calculer mes consommations journali\u00e8re, semaine, mois, ann\u00e9e.<\/p>\n\n\n\n<p>Je calcul en % dans un \u00ab\u00a0template\u00a0\u00bb \u00ab\u00a0Linky P\/Pcoup\u00a0\u00bb le ratio entre la puissance instantan\u00e9e \u00ab\u00a0SINST\u00a0\u00bb et la puissance de coupure \u00ab\u00a0PCOUP\u00a0\u00bb, ce qui donne une id\u00e9e de la r\u00e9serve de puissance disponible et plus tard, s&rsquo;en servir pour v\u00e9rifier si l&rsquo;abonnement peut \u00eatre revue \u00e0 la baisse.<\/p>\n\n\n\n<p>\u00ab\u00a0UMOY1\u00a0\u00bb nous donne la tension moyenne du secteur.<\/p>\n\n\n\n<p>\u00ab\u00a0IRMS1\u00a0\u00bb nous donne l&rsquo;intensit\u00e9 efficace de la phase 1.<\/p>\n\n\n\n<p>\u00ab\u00a0NTARF\u00a0\u00bb nous indique si le tarif est en heure creuse (=1) ou heure pleine (=2), variable utilis\u00e9e dans l&rsquo;automatisme de comptabilisation de l&rsquo;\u00e9nergie avec les \u00ab\u00a0utility_meter\u00a0\u00bb. J&rsquo;en profite pour afficher en clair dans un \u00ab\u00a0template\u00a0\u00bb, le tarif en cours.<\/p>\n\n\n\n<p>Je remonte la consommation journali\u00e8re depuis HA vers l&rsquo;ESP afin de l&rsquo;afficher en local.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tableau des informations disponibles<\/h2>\n\n\n\n<p>Certaines sont dispo uniquement en tri-phas\u00e9 et\/ou en tant que producteur d&rsquo;\u00e9nergie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"661\" height=\"602\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-27.png\" alt=\"\" class=\"wp-image-1452\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-27.png 661w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-27-300x273.png 300w\" sizes=\"auto, (max-width: 661px) 100vw, 661px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"659\" height=\"653\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-28.png\" alt=\"\" class=\"wp-image-1453\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-28.png 659w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-28-300x297.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-28-150x150.png 150w\" sizes=\"auto, (max-width: 659px) 100vw, 659px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Code ESP<\/h2>\n\n\n\n<p>Si vous avez des difficult\u00e9s de flashage avec ESPHome, parcourez mon article <a rel=\"noreferrer noopener\" href=\"https:\/\/domo.rem81.com\/home-assistant_esp-home\/\" target=\"_blank\">https:\/\/domo.rem81.com\/home-assistant_esp-home\/<\/a> cela devrait vous aider.<\/p>\n\n\n\n<p>L&rsquo;afficheur utilise une police de caract\u00e8re \u00ab\u00a0Arial\u00a0\u00bb, vous pouvez t\u00e9l\u00e9charger le fichier arial.ttf <a data-type=\"URL\" data-id=\"https:\/\/www.freefontspro.com\/fr\/14454\/arial.ttf\" href=\"https:\/\/www.freefontspro.com\/fr\/14454\/arial.ttf\" target=\"_blank\" rel=\"noreferrer noopener\">ici<\/a> puis le transf\u00e9rer dans un dossier \u00ab\u00a0fonts\u00a0\u00bb de votre \u00ab\u00a0\/config\/esphome\u00a0\u00bb.  Bien entendu vous pouvez utiliser une autre police de caract\u00e8res, \u00ab\u00a0size\u00a0\u00bb d\u00e9termine la taille des caract\u00e8res.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"309\" height=\"638\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image.png\" alt=\"\" class=\"wp-image-1230\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image.png 309w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-145x300.png 145w\" sizes=\"auto, (max-width: 309px) 100vw, 309px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Version \u00ab\u00a0Tempo\u00a0\u00bb<\/h2>\n\n\n\n<p>les filtres \u00ab\u00a0filter_out: 0.0\u00a0\u00bb sont \u00e0 mettre en action si et seulement si les index sont sup\u00e9rieurs \u00e0 0 sinon vous afficherez \u00ab\u00a0indisponible\u00a0\u00bb.<\/p>\n\n\n\n<p>Le filtre \u00ab\u00a0Lambda\u00a0\u00bb permet d&rsquo;\u00e9viter des incoh\u00e9rences dans l&rsquo;\u00e9volution des index, il m&rsquo;est arriv\u00e9 de lire des valeurs tr\u00e8s faibles mais sup\u00e9rieure \u00e0 0  pour des raisons que j&rsquo;ignore.<\/p>\n\n\n\n<p>L&rsquo;\u00e9cart se regle dans la variable \u00ab\u00a0globals\u00a0\u00bb ecart_max.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>substitutions:\n  device_name: esp124-tic\n  adress_ip: \"192.168.0.124\"\n  friendly_name: esp124\n  time_timezone: \"Europe\/Paris\"\n\nesphome:\n  name: ${device_name}\n  project:\n    name: \"rem81.esp124-TIC\"\n    version: \"1.0.1\"\n  platformio_options:\n    lib_deps: NeoPixelBus@2.6.0\n  #platform: ESP32\n  #board: mhetesp32minikit    \n      \nesp32:\n  board: mhetesp32minikit\n  framework:\n    type: arduino\n    \nwifi:\n  networks:\n    - ssid: !secret wifi\n      password: !secret mdpwifi\n  reboot_timeout: 5min\n\n  manual_ip:\n    static_ip: ${adress_ip}\n    gateway: 192.168.0.254\n    subnet: 255.255.255.0\n\n\n# Enable logging\nlogger:\n#  baud_rate: 0\n# Enable Home Assistant API\napi:\n\nota:\n  platform: esphome\n  \nweb_server:\n  port: 80\n\nfont:\n  - file: \"fonts\/arial.ttf\"\n    id: arial\n    size: 15\n\ni2c:\n  sda: GPIO21 #D2=pin 19\n  scl: GPIO22 #D1=pin 20\n  scan: True\n  id: bus_a\n  \n# \nuart:\n  id: uart_a\n  rx_pin: GPIO23\n#  tx_pin: GPIO1\n  baud_rate: 9600\n  parity: EVEN\n  data_bits: 7\n\nteleinfo:\n  id: myteleinfo\n  uart_id: uart_a\n  update_interval: 10s\n  historical_mode: false\n  \n# Led WS2812 RGB  \nlight:\n  - platform: partition\n    name: led1\n    id: led1\n    default_transition_length: 0s\n    segments:\n      - id: rgb_led\n        from: 0\n        to: 0\n\n  - platform: neopixelbus\n    num_leds: 1\n    pin: GPIO18\n    name: \"RGB strip\"\n    variant: ws2812\n    id: rgb_led\n    default_transition_length: 0s  \n\nglobals:\n  # Ecart maximum admissible entre deux lectures\n  - id: ecart_max\n    type: float\n    restore_value: no\n    initial_value: '50'\n\n  - id: hex_to_binary\n    type: std::string\n    restore_value: no\n    initial_value: '\"\"'\n\n  - id: update_binary\n    type: bool\n    restore_value: no\n    initial_value: 'false'\n\n\nsensor:\n# Energie Active soutir\u00e9e totale\n  - platform: teleinfo\n    id: hc_hp\n    tag_name: \"EAST\"\n    name: \"Linky HPHC KWH\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"  \n    filters:\n      - filter_out: 0.0\n      - lambda: |-\n          return x\/1000;\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};          \n          \n\n# Energie Active soutir\u00e9e Index01 HC Bleu\n  - platform: teleinfo\n    id: hcbleu\n    tag_name: \"EASF01\"\n    name: \"Linky HC Bleu kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"      \n    filters:\n      - lambda: return x \/ 1000;\n      - filter_out: 0.0\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};      \n\n# Energie Active soutir\u00e9e Index02 HP Bleu\n  - platform: teleinfo\n    id: hpbleu\n    tag_name: \"EASF02\"\n    name: \"Linky HP Bleu kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"      \n    filters:\n      - lambda: return x \/ 1000;      \n      - filter_out: 0.0\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};      \n\n# Energie Active soutir\u00e9e Index03 HC Blanc\n  - platform: teleinfo\n    id: hcblanc\n    tag_name: \"EASF03\"\n    name: \"Linky HC Blanc kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"      \n    filters:\n      - lambda: return x \/ 1000;\n      - filter_out: 0.0\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};      \n\n# Energie Active soutir\u00e9e Index04 HP Blanc\n  - platform: teleinfo\n    id: hpblanc\n    tag_name: \"EASF04\"\n    name: \"Linky HP Blanc kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"      \n    filters:\n      - lambda: return x \/ 1000;\n      - filter_out: 0.0   \n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};       \n\n# Energie Active soutir\u00e9e Index05 HC Rouge\n  - platform: teleinfo\n    id: hcrouge\n    tag_name: \"EASF05\"\n    name: \"Linky HC Rouge kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"      \n    filters:\n      - multiply: 0.001\n      - filter_out: 0.0\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};\n# Energie Active soutir\u00e9e Index06 HP Rouge\n  - platform: teleinfo\n    id: hprouge\n    tag_name: \"EASF06\"\n    name: \"Linky HP Rouge kWh\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"  \n    filters:\n      - lambda: return x \/ 1000;\n      - filter_out: 0.0   \n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};       \n\n#Puissance apparente de coupure\n  - platform: teleinfo\n    id: pcoup\n    tag_name: \"PCOUP\"\n    name: \"Linky PCOUP\"\n    unit_of_measurement: \"kVA\"\n    device_class: \"power\"\n    state_class: \"measurement\"      \n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n#Puissance apparente instantan\u00e9e ph1 \n\n  - platform: teleinfo\n    id: papp\n    tag_name: \"SINSTS\"\n    name: \"Linky PAPP\"\n    unit_of_measurement: \"VA\"\n    device_class: \"power\"\n    state_class: \"measurement\"  \n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n\n#Tension moyenne ph1\n  - platform: teleinfo\n    id: umoy1\n    tag_name: \"UMOY1\"\n    name: \"Linky Umoy\"\n    unit_of_measurement: \"V\"\n    device_class: \"voltage\"\n    state_class: \"measurement\"      \n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n#Courant efficace ph1\n  - platform: teleinfo\n    id: iinst\n    tag_name: \"IRMS1\"\n    name: \"Linky I Inst\"\n    unit_of_measurement: \"A\"\n    device_class: \"current\"\n    state_class: \"measurement\"       \n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n# Numero du Tarif en cours\n  - platform: teleinfo\n    id: ntarif\n    tag_name: \"NTARF\"\n    name: \"linky N Tarif\"\n    unit_of_measurement: \"\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n############### TEMPLATE  ######################\"\n# Calcul du ratio de la puissance apparente utilis\u00e9e en % par rapport au contrat\n  - platform: template\n    name: \"Linky P\/PCoup\"\n    id: p100\n    icon: mdi:flash\n    unit_of_measurement: \"%\"\n    accuracy_decimals: 0\n    lambda: |-\n      return ((id(papp).state\/1000)\/id(pcoup).state*100);\n\n# Lecture dans HA de la conso du jour\n  - platform: homeassistant\n    name: \"HCHP J\"\n    unit_of_measurement: \"kWh\"\n    entity_id: sensor.compteur_energie_total_jour_tous_tarifs\n    id: hphcj\n\n    \n#######################################\ntext_sensor:\n# Registre de statuts\n  - platform: teleinfo\n    id: stge\n    tag_name: \"STGE\"\n    name: \"linky Statuts\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    on_value:\n      then:\n        - lambda: |-\n            std::string hex = x;\n            if (hex.length() != 8) {\n              ESP_LOGD(\"linky\", \"Erreur format registre STGE: %s\", hex.c_str());\n              return;\n            }\n            std::string binary = \"\";\n            for (char c : hex) {\n              int val = std::stoi(std::string(1, c), nullptr, 16);\n              for (int i = 3; i &gt;= 0; i--) {\n                binary += (val &amp; (1 &lt;&lt; i)) ? \"1\" : \"0\";\n              }\n            }\n            id(hex_to_binary) = binary;\n            id(update_binary) = true;\n            ESP_LOGD(\"linky\", \"STGE=%s, Binaire=%s\", hex.c_str(), binary.c_str());\n# nom du calendrier tarifaire\n  - platform: teleinfo\n    id: ngtf\n    tag_name: \"NGTF\"\n    name: \"linky Nom calendrier tarifaire\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n# Libell\u00e9 tarif fournisseur en cours\n  - platform: teleinfo\n    id: ltarf\n    tag_name: \"LTARF\"\n    name: \"linky Libelle tarif fournisseur en cours\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n# Convertion du tarif en cours\n  - platform: template\n    id: tarif\n    name: \"Linky PTEC\"\n    lambda: |-\n      if ( id(ntarif).state == 1 || id(ntarif).state == 3 || id(ntarif).state == 5){\n        return { \"HC..\" };\n      } else {\n        return { \"HP..\" };\n      }\n\n  # Bits 1-3: Organe de coupure\n  - platform: template\n    name: \"Linky Organe de Coupure\"\n    id: linky_organe_de_coupure\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_1_3 = id(hex_to_binary).substr(28, 3);\n      if (bits_1_3 == \"000\") return {\"Ferm\u00e9\"};\n      else if (bits_1_3 == \"001\") return {\"Ouvert sur Surpuissance\"};\n      else if (bits_1_3 == \"010\") return {\"Ouvert sur Surtension\"};\n      else if (bits_1_3 == \"011\") return {\"Ouvert sur D\u00e9lestage\"};\n      else if (bits_1_3 == \"100\") return {\"Ouvert sur Ordre CPL ou Euridis\"};\n      else if (bits_1_3 == \"101\") return {\"Ouvert sur Surchauffe avec I&gt;Imax\"};\n      else if (bits_1_3 == \"110\") return {\"Ouvert sur Surchauffe avec I&lt;Imax\"};\n      else return {\"??\"};\n\n  # Bit 4: Cache-borne\n  - platform: template\n    name: \"Linky Cache Borne\"\n    id: linky_cache_borne\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;27] == '0') ? std::string(\"Ferme\") : std::string(\"Ouvert\");\n\n  # Bit 6: Surtension\n  - platform: template\n    name: \"Linky Surtension\"\n    id: linky_surtension\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;25] == '0') ? std::string(\"Pas de Surtension\") : std::string(\"Surtension\");\n\n  # Bit 7: D\u00e9passement Puissance de R\u00e9f\u00e9rence\n  - platform: template\n    name: \"Linky Depassement Pref\"\n    id: linky_dep_pref\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;24] == '0') ? std::string(\"Pas de Depassement\") : std::string(\"Depassement en Cours\");\n\n  # Bit 8: Producteur\/Consommateur\n  - platform: template\n    name: \"Linky Fonctionnement\"\n    id: linky_fonct_prod_conso\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;23] == '0') ? std::string(\"Consommateur\") : std::string(\"Producteur\");\n\n  # Bits 10-13: Tarif en cours (fourniture)\n  - platform: template\n    name: \"Linky Tarif Fourniture\"\n    id: linky_tarif_fourniture\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_10_13 = id(hex_to_binary).substr(18, 4);\n      if (bits_10_13 == \"0000\") return {\"HC BLEU\"};\n      else if (bits_10_13 == \"0001\") return {\"HP BLEU\"};\n      else if (bits_10_13 == \"0010\") return {\"HC BLANC\"};\n      else if (bits_10_13 == \"0011\") return {\"HP BLANC\"};\n      else if (bits_10_13 == \"0100\") return {\"HP ROUGE\"};\n      else if (bits_10_13 == \"0101\") return {\"HC ROUGE\"};\n      else if (bits_10_13 == \"0110\") return {\"Energie ventil\u00e9e sur index 7\"};\n      else if (bits_10_13 == \"0111\") return {\"Energie ventil\u00e9e sur index 8\"};\n      else if (bits_10_13 == \"1000\") return {\"Energie ventil\u00e9e sur index 9\"};\n      else if (bits_10_13 == \"1001\") return {\"Energie ventil\u00e9e sur index 10\"};\n      else return {\"??\"};\n\n  # Bits 14-15: Tarif distributeur\n  - platform: template\n    name: \"Linky Tarif Distributeur\"\n    id: linky_tarif_distributeur\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_14_15 = id(hex_to_binary).substr(16, 2);\n      if (bits_14_15 == \"00\") return {\"Energie ventil\u00e9e sur index 1\"};\n      else if (bits_14_15 == \"01\") return {\"Energie ventil\u00e9e sur index 2\"};\n      else if (bits_14_15 == \"10\") return {\"Energie ventil\u00e9e sur index 3\"};\n      else if (bits_14_15 == \"11\") return {\"Energie ventil\u00e9e sur index 4\"};\n      else return {\"??\"};\n\n  # Bit 16: Mode d\u00e9grad\u00e9 horloge\n  - platform: template\n    name: \"Linky Mode Horloge\"\n    id: linky_mode_horloge\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;15] == '0') ? std::string(\"Horloge correcte\") : std::string(\"Horloge mode degrade\");\n\n  # Bit 17: Etat TIC\n  - platform: template\n    name: \"Linky Etat TIC\"\n    id: linky_etat_tic\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;14] == '0') ? std::string(\"Mode Historique\") : std::string(\"Mode Standard\");\n\n  # Bits 19-20: Etat communication Euridis\n  - platform: template\n    name: \"Linky Com Euridis\"\n    id: linky_com_euridis\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_19_20 = id(hex_to_binary).substr(11, 2);\n      if (bits_19_20 == \"00\") return {\"Com d\u00e9sactiv\u00e9e\"};\n      else if (bits_19_20 == \"01\") return {\"Com active sans s\u00e9curit\u00e9\"};\n      else if (bits_19_20 == \"11\") return {\"Com active avec s\u00e9curit\u00e9\"};\n      else return {\"Com ??\"};\n\n  # Bits 21-22: Statut CPL\n  - platform: template\n    name: \"Linky Statut CPL\"\n    id: linky_statut_cpl\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_21_22 = id(hex_to_binary).substr(9, 2);\n      if (bits_21_22 == \"00\") return {\"New\/unlock\"};\n      else if (bits_21_22 == \"01\") return {\"New\/Lock\"};\n      else if (bits_21_22 == \"11\") return {\"Registered\"};\n      else return {\"Com ??\"};\n\n  # Bit 23: Synchro CPL\n  - platform: template\n    name: \"Linky Synchro CPL\"\n    id: linky_synchro_cpl\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;8] == '0') ? std::string(\"Compteur non synchronise\") : std::string(\"Compteur synchronise\");\n\n  # Bits 24-25: Couleur du jour (Tempo)\n  - platform: template\n    name: \"Linky Couleur Jour Tempo\"\n    id: linky_couleur_j_tempo\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_24_25 = id(hex_to_binary).substr(6, 2);\n      if (bits_24_25 == \"00\") return {\"Contrat non Tempo\"};\n      else if (bits_24_25 == \"01\") return {\"Bleu\"};\n      else if (bits_24_25 == \"10\") return {\"Blanc\"};\n      else if (bits_24_25 == \"11\") return {\"Rouge\"};\n      else return {\"Couleur J tempo ind\u00e9finie\"};\n\n  # Bits 26-27: Couleur J+1 (Tempo)\n  - platform: template\n    name: \"Linky Couleur J+1 Tempo\"\n    id: linky_couleur_j1_tempo\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_26_27 = id(hex_to_binary).substr(4, 2);\n      if (bits_26_27 == \"00\") return {\"Pas d'information\"};\n      else if (bits_26_27 == \"01\") return {\"Bleu\"};\n      else if (bits_26_27 == \"10\") return {\"Blanc\"};\n      else if (bits_26_27 == \"11\") return {\"Rouge\"};\n      else return {\"Couleur J+1 tempo ind\u00e9finie\"};\n\n  # Bits 28-29: Pr\u00e9avis Pointes Mobiles\n  - platform: template\n    name: \"Linky Pr\u00e9avis Pointes Mobiles\"\n    id: linky_preavis_p_mobiles\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_28_29 = id(hex_to_binary).substr(2, 2);\n      if (bits_28_29 == \"00\") return {\"Pas de pr\u00e9avis en cours\"};\n      else if (bits_28_29 == \"01\") return {\"Pr\u00e9avis PM1 en cours\"};\n      else if (bits_28_29 == \"10\") return {\"Pr\u00e9avis PM2 en cours\"};\n      else if (bits_28_29 == \"11\") return {\"Pr\u00e9avis PM3 en cours\"};\n      else return {\"Pr\u00e9avis en cours ind\u00e9fini\"};\n\n  # Bits 30-31: Pointes Mobiles\n  - platform: template\n    name: \"Linky Pointe Mobile\"\n    id: linky_pointe_mobile\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      std::string bits_30_31 = id(hex_to_binary).substr(0, 2);  \/\/ Correction ici : bits 30-31 sont les 2 premiers\n      if (bits_30_31 == \"00\") return {\"Pas de pointe mobile\"};\n      else if (bits_30_31 == \"01\") return {\"PM1 en cours\"};\n      else if (bits_30_31 == \"10\") return {\"PM2 en cours\"};\n      else if (bits_30_31 == \"11\") return {\"PM3 en cours\"};\n      else return {\"Pointe mobile ind\u00e9finie\"};\n\n\n#Etat de la connection\nbinary_sensor:\n  - platform: status\n    name: \"${friendly_name} Status\"\n\n# Capteurs pour les bits du registre STGE\n  # Bit 0: Contact Sec\n  - platform: template\n    name: \"Linky Contact Sec\"\n    id: linky_contact_sec\n    device_class: connectivity\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;31] == '0');  \/\/ Ferm\u00e9 = true (on), Ouvert = false (off)\n\n  # Bit 9: Sens de l'\u00e9nergie active\n  - platform: template\n    name: \"Linky Sens Energie Active\"\n    id: linky_sens_energie_active\n    device_class: power\n    icon: \"mdi:flash\"\n    lambda: |-\n      if (!id(update_binary) || id(hex_to_binary).length() != 32) return {};\n      return (id(hex_to_binary)&#091;22] == '0');  \/\/ Positive = true (on), N\u00e9gative = false (off)\n\n\nswitch:\n  - platform: restart\n    name: \"${friendly_name} Restart\"\n\n# Affichage\ndisplay:\n  - platform: ssd1306_i2c\n    model: \"SSD1306 128x64\"\n    address: 0x3C\n    brightness: 100%\n    lambda: |-\n      it.printf(0,0,id(arial),\"P=%.0f VA\",id(papp).state);\n      it.printf(75,0,id(arial),\"-%.0f %%\",id(p100).state);\n      it.printf(0,15,id(arial),\"I Inst=%.0f A\",id(iinst).state);\n      it.printf(0,30,id(arial),\"ConsoJ=%.0f kWh\",id(hphcj).state);\n      std::string tarif_ = id(ltarf).state;\n      it.printf(0,45,id(arial), tarif_.c_str());      \n\ninterval:\n  - interval: 1h\n    then:\n      - script.execute: calcul_led_jour\n\n# ------------------------  Scripts\nscript:\n# \n# Couleur du Jour en cours\n  - id: calcul_led_jour\n    mode: single\n    then:\n      - logger.log:\n          format: \"Ltarf= %f\"\n          args: &#091; 'id(ntarif).state']\n\n      - if: \n          condition:\n            - lambda: |-\n                return ( id(ntarif).state == 1 || id(ntarif).state == 2);\n\n          then:\n            - light.control:\n                id: led1\n                brightness: 75%\n                state: on\n                red: 0% \n                green: 0%\n                blue: 100%    \n\n      - if: \n          condition:\n            - lambda: |-\n                return ( id(ntarif).state == 3 || id(ntarif).state == 4);\n          then:\n            - light.control:\n                id: led1\n                brightness: 75%\n                state: on\n                red: 100% \n                green: 100%\n                blue: 100%    \n          \n      - if: \n          condition:\n            - lambda: |-\n                return ( id(ntarif).state == 5 || id(ntarif).state == 6);\n          then:\n            - light.control:\n                id: led1\n                brightness: 75%\n                state: on\n                red: 100% \n                green: 0%\n                blue: 0%    \n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Version HC\/HP<\/h3>\n\n\n\n<p>les filtres \u00ab\u00a0filter_out: 0.0\u00a0\u00bb sont \u00e0 mettre en action si et seulement si les index sont sup\u00e9rieurs \u00e0 0 sinon vous afficherez \u00ab\u00a0indisponible\u00a0\u00bb.<\/p>\n\n\n\n<p>Le filtre \u00ab\u00a0Lambda\u00a0\u00bb permet d&rsquo;\u00e9viter des incoh\u00e9rences dans l&rsquo;\u00e9volution des index, il m&rsquo;est arriv\u00e9 de lire des valeurs tr\u00e8s faibles mais sup\u00e9rieure \u00e0 0  pour des raisons que j&rsquo;ignore.<\/p>\n\n\n\n<p>L&rsquo;\u00e9cart se regle dans la variable \u00ab\u00a0globals\u00a0\u00bb ecart_max<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>substitutions:\n  device_name: esp124-tic\n  adress_ip: \"192.168.0.124\"\n  friendly_name: esp124\n  time_timezone: \"Europe\/Paris\"\n  \nesphome:\n  name: ${device_name}\n  platform: ESP32\n  board: mhetesp32minikit\n  project:\n    name: \"rem81.esp124-TIC\"\n    version: \"1.0.1\"\n  platformio_options:\n    lib_deps: NeoPixelBus@2.6.0\n  on_boot:\n    then:\n      - light.control:\n          id: led1\n          brightness: 0.25\n          state: on\nwifi:\n  networks:\n    - ssid: !secret wifi_mi4\n      password: !secret mdpwifi_mi4\n      priority: 2  \n    - ssid: !secret wifi_esp\n      password: !secret mdpwifi_esp\n      priority: 1\n    - ssid: !secret wifi\n      password: !secret mdpwifi\n      priority: 0\n  reboot_timeout: 5min\n\n  manual_ip:\n    static_ip: ${adress_ip}\n    gateway: 192.168.0.254\n    subnet: 255.255.255.0\n\n\n# Enable logging\nlogger:\n#  baud_rate: 0\n# Enable Home Assistant API\napi:\n\nota:\n\nweb_server:\n  port: 80\n\nfont:\n  - file: \"fonts\/arial.ttf\"\n    id: arial\n    size: 15\n\ni2c:\n  sda: GPIO21 #D2=pin 19\n  scl: GPIO22 #D1=pin 20\n  scan: True\n  id: bus_a\n  \n# \nuart:\n  id: uart_a\n  rx_pin: GPIO23\n#  tx_pin: GPIO1\n  baud_rate: 9600\n  parity: EVEN\n  data_bits: 7\n\nteleinfo:\n  id: myteleinfo\n  uart_id: uart_a\n  update_interval: 10s\n  historical_mode: false\n  \n# Led WS2812 RGB  \nlight:\n  - platform: partition\n    name: led1\n    id: led1\n    default_transition_length: 0s\n    segments:\n      - id: rgb_led\n        from: 0\n        to: 0\n\n  - platform: neopixelbus\n    num_leds: 1\n    pin: GPIO18\n    name: \"RGB strip\"\n    variant: ws2812\n    id: rgb_led\n    default_transition_length: 0s  \n\nglobals:\n  # Ecart maximum admissible entre deux lectures\n   - id: ecart_max\n     type: float\n     restore_value: no\n     initial_value: '50'\n\nsensor:\n# Energie Active soutir\u00e9e totale\n  - platform: teleinfo\n    id: hc_hp\n    tag_name: \"EAST\"\n    name: \"Linky HPHC KWH\"\n    unit_of_measurement: \"kWh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    device_class: \"energy\"\n    state_class: \"total_increasing\"  \n    filters:\n      - filter_out: 0.0\n      - lambda: |-\n          return x\/1000;\n\n\n# Energie Active soutir\u00e9e Index01\n  - platform: teleinfo\n    id: hchc\n    tag_name: \"EASF01\"\n    name: \"Linky HC Wh\"\n    unit_of_measurement: \"Wh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    filters:\n      - filter_out: 0.0\n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};    \n    \n# Energie Active soutir\u00e9e Index02    \n  - platform: teleinfo\n    id: hchp\n    tag_name: \"EASF02\"\n    name: \"Linky HP Wh\"\n    unit_of_measurement: \"Wh\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    filters:\n      - filter_out: 0.0    \n      - lambda: |-\n          float MAX_DIFFERENCE = id(ecart_max);  \/\/ Difference max entre de lecture, \u00e0 ajuster selon votre cas de figure.\n          static float last_value = NAN;\n          if (isnan(last_value) || std::abs(x - last_value) &lt; MAX_DIFFERENCE)\n            return last_value = x;\n          else\n            return {};    \n\n#Puissance apparente de coupure\n  - platform: teleinfo\n    id: pcoup\n    tag_name: \"PCOUP\"\n    name: \"Linky PCOUP\"\n    unit_of_measurement: \"kVA\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n#Puissance apparente instantan\u00e9e ph1 \n\n  - platform: teleinfo\n    id: papp\n    tag_name: \"SINSTS\"\n    name: \"Linky PAPP\"\n    unit_of_measurement: \"VA\"\n    device_class: \"power\"\n    state_class: \"measurement\"  \n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    on_value:\n      - if:\n          condition:\n            sensor.in_range:\n              id: papp\n              below: 1000\n          then: \n            - light.control:\n                id: led1\n                red: 0%\n                green: 100% # vert\n                blue: 0%\n      - if:\n          condition:\n            sensor.in_range:\n              id: papp\n              above: 1000\n              below: 3000\n          then: \n            - light.control:\n                id: led1\n                red: 0%\n                green: 0% # bleu\n                blue: 100%\n      - if:\n          condition:\n            sensor.in_range:\n              id: papp\n              above: 3000\n          then: \n            - light.control:\n                id: led1\n                red: 100% #rouge\n                green: 0%\n                blue: 0%    \n\n#Tension moyenne ph1\n  - platform: teleinfo\n    id: umoy1\n    tag_name: \"UMOY1\"\n    name: \"Linky Umoy\"\n    unit_of_measurement: \"V\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n#Courant efficace ph1\n  - platform: teleinfo\n    id: iinst\n    tag_name: \"IRMS1\"\n    name: \"Linky I Inst\"\n    unit_of_measurement: \"A\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n# Numero du Tarif en cours\n  - platform: teleinfo\n    id: ntarif\n    tag_name: \"NTARF\"\n    name: \"linky N Tarif\"\n    unit_of_measurement: \"\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n\n############### TEMPLATE  ######################\"\n# Calcul du ratio de la puissance apparente utilis\u00e9e en % par rapport au contrat\n  - platform: template\n    name: \"Linky P\/PCoup\"\n    id: p100\n    icon: mdi:flash\n    unit_of_measurement: \"%\"\n    accuracy_decimals: 0\n    lambda: |-\n      return ((id(papp).state\/1000)\/id(pcoup).state*100);\n\n# Lecture dans HA de la conso du jour\n  - platform: homeassistant\n    name: \"HCHP J\"\n    unit_of_measurement: \"kWh\"\n    entity_id: sensor.energie_totale_jour\n    id: hphcj\n\n# Puissance du signal WIFI\n  - platform: wifi_signal\n    id: wif\n    name: \"${friendly_name} WiFi Signal Sensor\"\n    update_interval: 60s\n# Temps de fonctionnement de l'ESP    \n  - platform: uptime\n    id: uptime_seconds\n    name: \"${friendly_name} Uptime\"\n    update_interval: 60s\n    unit_of_measurement: s\n    accuracy_decimals: 0\n    force_update: false\n    icon: mdi:timer\n    \n#######################################\ntext_sensor:\n# Registre de statuts\n  - platform: teleinfo\n    id: stge\n    tag_name: \"STGE\"\n    name: \"linky Statuts\"\n    icon: mdi:flash\n    teleinfo_id: myteleinfo\n    \n# Convertion du tarif en cours\n  - platform: template\n    id: tarif\n    name: \"Linky PTEC\"\n    lambda: |-\n      if ( id(ntarif).state == 1 ) {\n        return { \"HC..\" };\n      } else {\n        return { \"HP..\" };\n      }\n# Affichage du temps de fonctionnement\n  - platform: template\n    name: \"${friendly_name} Uptime\"\n    update_interval: 60s\n    icon: mdi:clock-start\n    lambda: |-\n      int seconds = (id(uptime_seconds).state);\n      int days = seconds \/ (24 * 3600);\n      seconds = seconds % (24 * 3600);\n      int hours = seconds \/ 3600;\n      seconds = seconds % 3600;\n      int minutes = seconds \/  60;\n      seconds = seconds % 60;\n      if ( days ) {\n        return { (String(days) +\"d \" + String(hours) +\"h \" + String(minutes) +\"m \"+ String(seconds) +\"s\").c_str() };\n      } else if ( hours ) {\n        return { (String(hours) +\"h \" + String(minutes) +\"m \"+ String(seconds) +\"s\").c_str() };\n      } else if ( minutes ) {\n        return { (String(minutes) +\"m \"+ String(seconds) +\"s\").c_str() };\n      } else {\n        return { (String(seconds) +\"s\").c_str() };\n      }\n\n#Etat de la connection\nbinary_sensor:\n  - platform: status\n    name: \"${friendly_name} Status\"\n# Restart de l'ESP\nswitch:   \n  - platform: restart\n    name: \"${friendly_name} Restart\"\n\n# Affichage\ndisplay:\n  - platform: ssd1306_i2c\n    model: \"SSD1306 128x64\"\n    address: 0x3C\n    brightness: 100%\n    lambda: |-\n      it.printf(0,0,id(arial),\"P=%.0f VA\",id(papp).state);\n      it.printf(75,0,id(arial),\"-%.0f %%\",id(p100).state);\n      it.printf(0,15,id(arial),\"I Inst=%.0f A\",id(iinst).state);\n      it.printf(0,30,id(arial),\"ConsoJ=%.0f kWh\",id(hphcj).state);\n      std::string tarif_ = id(tarif).state;\n      it.printf(0,45,id(arial), \"Tarif: %s\", tarif_.c_str());      \n\n\n      \n   <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Registre de Statuts<\/h2>\n\n\n\n<p>Le registre de statuts \u00ab\u00a0STGE\u00a0\u00bb (uniquement dispo en mode standard) nous donne un \u00e9tat du Linky en g\u00e9n\u00e9ral. Il remonte dans un format de huit caract\u00e8res ascii. Chaque caract\u00e8res est cod\u00e9s sur 4 bits qui correspondent \u00e0 une ou plusieurs informations. Le d\u00e9tail est donn\u00e9 au chapitre 6.2.3.14 du document Enedis ci dessous: <\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/remycrochon\/domo.rem81\/blob\/main\/Enedis-NOI-CPT_54E-1.pdf\">https:\/\/github.com\/remycrochon\/domo.rem81\/blob\/main\/Enedis-NOI-CPT_54E-1.pdf<\/a><\/p>\n\n\n\n<p>Le d\u00e9codage est int\u00e9gr\u00e9 au code ESPHOME<\/p>\n\n\n\n<p>Pour les utilisateurs de APP DAEMON, j&rsquo;ai \u00e9crit une routine qui  d\u00e9code les caract\u00e8res du registre de statuts permettent de l&rsquo;exploiter dans  HA via l&rsquo;Addon <a href=\"https:\/\/github.com\/hassio-addons\/addon-appdaemon\" target=\"_blank\" rel=\"noreferrer noopener\">AppDaemon<\/a>.<\/p>\n\n\n\n<p>Celle ci convertit les 8 caract\u00e8res du registre Statuts de l&rsquo;ASCII vers du Binaire.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"302\" height=\"284\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-36-1.png\" alt=\"\" class=\"wp-image-1486\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-36-1.png 302w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-36-1-300x282.png 300w\" sizes=\"auto, (max-width: 302px) 100vw, 302px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Addon Appdaemon<\/h3>\n\n\n\n<p>Cet Addon, pour ceux qui ne connaissent pas, permet d&rsquo;\u00e9crire des programmes en Python tr\u00e8s \u00e9labor\u00e9s.<\/p>\n\n\n\n<p>Je d\u00e9crit son installation dans cet article cet <a rel=\"noreferrer noopener\" href=\"https:\/\/domo.rem81.com\/ha-addon-appdaemon-programme-python\/\" data-type=\"URL\" data-id=\"https:\/\/domo.rem81.com\/ha-addon-appdaemon-programme-python\/\" target=\"_blank\">article.<\/a><\/p>\n\n\n\n<p>Vous trouverez ci apr\u00e8s les fichiers \u00ab\u00a0.yaml\u00a0\u00bb et \u00ab\u00a0.py\u00a0\u00bb \u00e0 installer dans \u00ab\u00a0votre AppDaemon.\u00a0\u00bb<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code  de \u00ab\u00a0linky_status.yaml\u00a0\u00bb<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\nLinky:\n  class: LinkyStatuts\n  module: linky_statuts\n  registre: input_text.linky_test_status\n#  registre: sensor.linky_statuts<\/code><\/pre>\n\n\n\n<p> Vous pouvez faire des tests en de-commentant le \u00ab\u00a0registre: input_text.linky_test_status\u00a0\u00bb et en commentant le \u00ab\u00a0registre: input_text.linky_test_status\u00a0\u00bb (il faut un seul \u00ab\u00a0registre\u00a0\u00bb actif \u00e0 la fois).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code  de \u00ab\u00a0linky_status.py\u00a0\u00bb<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import hassapi as hass\n\n# Conversion ASCII vers binaire cod\u00e9 d\u00e9cimal\ndef repr_bin2(str):\n    caract = 0\n    decod=\"\"        \n    for caract in str:\n        decod += bin(int(caract,16))&#091;2::].zfill(4)\n    return decod\n\nclass LinkyStatuts(hass.Hass):\n    def initialize(self):\n        self.listen_state(self.statuts_change, self.args&#091;\"registre\"])\n        self.log(\"Initialisation Linky..\", log=\"linky_log\")\n\n    def statuts_change(self, entity, attribute, old, new, kwargs):\n        statuts = new\n        if len(statuts)!=8:\n            self.log(f\"Erreur format registre de statuts= {statuts}\", log=\"linky_log\")\n        else:\n            self.convertion_status(kwargs)\n\n#  Lecture et conversion du registre de statuts du Linky \n    def convertion_status(self, kwargs):\n        statuts = self.get_state(self.args&#091;\"registre\"])\n        statuts_binaire=(repr_bin2(statuts))\n\n        # Exploitation des 32 bits du statuts poids forts en t\u00eate #\n        # Bit 0:Contact Sec#\n        bit_0= statuts_binaire&#091;31]\n        if bit_0 == \"0\":\n            contact_sec = \"Ferme\"\n        else:\n            contact_sec = \"Ouvert\"\n\n        # Bits 1 \u00e0 3: Organe de coupure #\n        bit_1_3= statuts_binaire&#091;28:31]\n        if bit_1_3 == \"000\":\n            organe_de_coupure = \"Ferme\"\n        elif bit_1_3 == \"001\":\n            organe_de_coupure = \"Ouvert sur Surpuissance\"\n        elif bit_1_3 == \"010\":\n            organe_de_coupure = \"Ouvert sur Surtension\"\n        elif bit_1_3 == \"011\":\n            organe_de_coupure = \"Ouvert sur Delestage\"\n        elif bit_1_3 == \"100\":\n            organe_de_coupure = \"Ouvert sur Ordre CPL ou Euridis\"\n        elif bit_1_3 == \"101\":\n            organe_de_coupure = \"Ouvert sur Surchauffe avec I&gt;Imax\"\n        elif bit_1_3 == \"110\":\n            organe_de_coupure = \"Ouvert sur Surchauffe avec I&lt;Imax\"\n        else:\n            organe_de_coupure = \"??\"\n\n        # Bit 4: Etat du cache borne #\n        bit_4= statuts_binaire&#091;27]\n        if bit_4 == \"0\":\n            cache_borne = \"Ferme\"\n        else:\n            cache_borne = \"Ouvert\"\n\n        # Bit 5: Non utilis\u00e9 toujours \u00e0 0 #\n\n        # Bit 6: Surtension sur une des phases #\n        bit_6= statuts_binaire&#091;25]\n        if bit_6 == \"0\":\n            surtension = \"Pas de Surtension\"\n        else:\n            surtension = \"Surtension\"\n\n        # Bit 7: D\u00e9passement Puissance de R\u00e9f\u00e9rence #\n        bit_7= statuts_binaire&#091;24]\n        if bit_7 == \"0\":\n            dep_pref = \"Pas de Depassement\"\n        else:\n            dep_pref = \"Depassement en Cours\"\n\n        # Bit 8: Producteur ou Consommateur #\n        bit_8= statuts_binaire&#091;23]\n        if bit_8 == \"0\":\n            fonct_prod_conso = \"Consommateur\"\n        else:\n            fonct_prod_conso = \"Producteur\"\n\n        # Bit 9: Sens de L'\u00e9nergie active #\n        bit_9= statuts_binaire&#091;22]\n        if bit_9 == \"0\":\n            sens_energie_act = \"Energie active positive\"\n        else:\n            sens_energie_act = \"Energie active negative\"\n\n        # Bits 10 \u00e0 13: Tarif en cours contrat fourniture #\n        bit_10_13= statuts_binaire&#091;18:22]\n        if bit_10_13 == \"0000\":\n            tarif_fourniture = \"Energie ventilee sur index 1\"\n        elif bit_10_13 == \"0001\":\n            tarif_fourniture = \"Energie ventilee sur index 2\"\n        elif bit_10_13 == \"0010\":\n            tarif_fourniture = \"Energie ventilee sur index 3\"\n        elif bit_10_13 == \"0011\":\n            tarif_fourniture = \"Energie ventilee sur index 4\"\n        elif bit_10_13 == \"0100\":\n            tarif_fourniture = \"Energie ventilee sur index 5\"\n        elif bit_10_13 == \"0101\":\n            tarif_fourniture = \"Energie ventilee sur index 6\"\n        elif bit_10_13 == \"0110\":\n            tarif_fourniture = \"Energie ventilee sur index 7\"\n        elif bit_10_13 == \"0111\":\n            tarif_fourniture = \"Energie ventilee sur index 8\"\n        elif bit_10_13 == \"1000\":\n            tarif_fourniture = \"Energie ventilee sur index 9\"\n        elif bit_10_13 == \"1001\":\n            tarif_fourniture = \"Energie ventilee sur index 10\"\n        else:\n            tarif_fourniture = \"??\"\n\n        # Bits 14 \u00e0 15: Tarif en cours contrat fourniture #\n        bit_14_15= statuts_binaire&#091;16:18]\n        if bit_14_15 == \"00\":\n            tarif_distributeur = \"Energie ventilee sur index 1\"\n        elif bit_14_15 == \"01\":\n            tarif_distributeur = \"Energie ventilee sur index 2\"\n        elif bit_14_15 == \"10\":\n            tarif_distributeur = \"Energie ventilee sur index 3\"\n        elif bit_14_15 == \"11\":\n            tarif_distributeur = \"Energie ventilee sur index 4\"\n\n        # Bit 16: Mode d\u00e9grad\u00e9 horloge #\n        bit_16= statuts_binaire&#091;15]\n        if bit_16 == \"0\":\n            mode_horloge = \"Horloge correcte\"\n        else:\n            mode_horloge = \"Horloge mode degrade\"\n\n        # Bit 17: Etat TIC #\n        bit_17= statuts_binaire&#091;14]\n        if bit_17 == \"0\":\n            etat_tic = \"Mode Historique\"\n        else:\n            etat_tic = \"Mode Standard\"\n\n        # Bit 18: Non utilis\u00e9 #\n\n        # Bits 19 \u00e0 20: Etat de la com Euridis #\n        bit_19_20= statuts_binaire&#091;11:13]\n        if bit_19_20 == \"00\":\n            com_euridis = \"Com desactivee\"\n        elif bit_19_20 == \"01\":\n            com_euridis = \"Com Active sans securite\"\n        elif bit_19_20 == \"11\":\n            com_euridis = \"Com Active avec securite\"\n        else:\n            com_euridis = \"Com ??\"\n\n        # Bits 21 \u00e0 22: Statut du CPL #\n        bit_21_22= statuts_binaire&#091;9:11]\n        if bit_21_22 == \"00\":\n            statut_cpl = \"New\/unlock\"\n        elif bit_21_22 == \"01\":\n            statut_cpl = \"New\/Lock\"\n        elif bit_21_22 == \"11\":\n            statut_cpl = \"Registered\"\n        else:\n            statut_cpl = \"Com ??\"\n\n        # Bit 23: Synchro CPL #\n        bit_23= statuts_binaire&#091;8]\n        if bit_23 == \"0\":\n            synchro_cpl = \"Compteur non synchronise\"\n        else:\n            synchro_cpl = \"Compteur synchronise\"\n\n        # Bits 24_25: Couleur du jour contrat historique Tempo #\n        bit_24_25= statuts_binaire&#091;6:8]\n        if bit_24_25 == \"00\":\n            couleur_j_tempo = \"Contrat non Tempo\"\n        elif bit_24_25 == \"01\":\n            couleur_j_tempo = \"Bleu\"\n        elif bit_24_25 == \"10\":\n            couleur_j_tempo = \"Blanc\"\n        elif bit_24_25 == \"11\":\n            couleur_j_tempo = \"Rouge\"\n        else:\n            couleur_j_tempo = \"Couleur J tempo indefinie\"\n\n        # Bits 26_27: Couleur du J+1 contrat historique Tempo #\n        bit_26_27= statuts_binaire&#091;4:6]\n        if bit_26_27 == \"00\":\n            couleur_j1_tempo = \"Contrat non Tempo\"\n        elif bit_26_27 == \"01\":\n            couleur_j1_tempo = \"Bleu\"\n        elif bit_26_27 == \"10\":\n            couleur_j1_tempo = \"Blanc\"\n        elif bit_26_27 == \"11\":\n            couleur_j1_tempo = \"Rouge\"\n        else:\n            couleur_j1_tempo = \"Couleur J+1 tempo indefinie\"\n\n        # Bits 28_29: Pr\u00e9avis Pointes mobiles #\n        bit_28_29= statuts_binaire&#091;2:4]\n        if bit_28_29 == \"00\":\n            pr\u00e9avis_p_mobiles = \"pas de preavis en cours\"\n        elif bit_28_29 == \"01\":\n            pr\u00e9avis_p_mobiles = \"Preavis PM1 en cours\"\n        elif bit_28_29 == \"10\":\n            pr\u00e9avis_p_mobiles = \"Preavis PM2 en cours\"\n        elif bit_28_29 == \"11\":\n            pr\u00e9avis_p_mobiles = \"Preavis PM3 en cours\"\n        else:\n            pr\u00e9avis_p_mobiles = \"Preavis en cours ind\u00e9fini\"\n            \n        # Bits 30_31: Pr\u00e9avis Pointes mobiles #\n        bit_30_31= statuts_binaire&#091;2:4]\n        if bit_30_31 == \"00\":\n            pointe_mobile = \"Pas de pointe mobile\"\n        elif bit_30_31 == \"01\":\n            pointe_mobile = \"PM1 en cours\"\n        elif bit_30_31 == \"10\":\n            pointe_mobile = \"PM2 en cours\"\n        elif bit_30_31 == \"11\":\n            pointe_mobile = \"PM3 en cours\"\n        else:\n            pointe_mobile = \"Pointe mobile indefinie\"\n\n        #### Creation et Mise \u00e0 jour des entit\u00e9s HA  ####\n\n        # Etat du contact Sec (= 1 = ferm\u00e9 en Heure Creuse) #\n        if bit_0 == \"0\":\n            self.set_state(\"binary_sensor.linky_contact_sec\", state=\"on\", replace=True, attributes= {\"icon\": \"mdi:flash\"})  \n        else:\n            self.set_state(\"binary_sensor.linky_contact_sec\", state=\"off\", replace=True, attributes= {\"icon\": \"mdi:flash\"})  \n        \n        # Etat de l'organe de coupure #\n        self.set_state(\"sensor.linky_organe_de_coupure\", state=organe_de_coupure, replace=True, attributes= {\"icon\": \"mdi:flash\"})\n\n        #  Sens de l'\u00e9nergie #\n        if bit_9 == \"0\":\n            self.set_state(\"binary_sensor.linky_sens_energie_active\", state=\"on\", replace=True, attributes= {\"icon\": \"mdi:flash\"})   \n        else:\n            self.set_state(\"binary_sensor.linky_sens_energie_active\", state=\"off\", replace=True, attributes= {\"icon\": \"mdi:flash\"})   \n        self.set_state(\"sensor.linky_sens_energie_active\", state=sens_energie_act, replace=True, attributes= {\"icon\": \"mdi:flash\"})           \n\n\n        ####   Log de D\u00e9boggage   \n        #    A commenter ou supprimer si inutile #\n        self.log(f\"Statuts={statuts}\", log=\"linky_log\")\n        self.log(f\"Statuts Binaire={statuts_binaire}\", log=\"linky_log\")\n        self.log(f\"bit_0={bit_0} \/ Contact Sec={contact_sec}\", log=\"linky_log\")\n        self.log(f\"bit_1_3={bit_1_3} \/ Organe de coupure={organe_de_coupure}\", log=\"linky_log\")\n        self.log(f\"bit_4={bit_4} \/ Cache_borne={cache_borne}\", log=\"linky_log\")\n        self.log(f\"bit_6={bit_6} \/ Surtension={surtension}\", log=\"linky_log\")\n        self.log(f\"bit_7={bit_7} \/ Depassement Pref={dep_pref}\", log=\"linky_log\")\n        self.log(f\"bit_8={bit_8} \/ Fonctionnement={fonct_prod_conso}\", log=\"linky_log\")\n        self.log(f\"bit_9={bit_9} \/ Sens Energie Active={sens_energie_act}\", log=\"linky_log\")\n        self.log(f\"bit_10_13={bit_10_13} \/ Tarif fourniture={tarif_fourniture}\", log=\"linky_log\")\n        self.log(f\"bit_14_15={bit_14_15} \/ Tarif distributeur={tarif_distributeur}\", log=\"linky_log\")\n        self.log(f\"bit_16={bit_16} \/ Mode degrade horloge={mode_horloge}\", log=\"linky_log\")\n        self.log(f\"bit_17={bit_17} \/ Etat TIC={etat_tic}\", log=\"linky_log\")\n        self.log(f\"bit_19_20={bit_19_20} \/ Com Euridis={com_euridis}\", log=\"linky_log\")\n        self.log(f\"bit_21_22={bit_21_22} \/ Statut CPL={statut_cpl}\", log=\"linky_log\")\n        self.log(f\"bit_23={bit_23} \/ Synchro CPL={synchro_cpl}\", log=\"linky_log\")\n        self.log(f\"bit_24_25={bit_24_25} \/ Couleur Jour tempo={couleur_j_tempo}\", log=\"linky_log\")\n        self.log(f\"bit_26_27={bit_26_27} \/ Couleur J+1 tempo={couleur_j1_tempo}\", log=\"linky_log\")\n        self.log(f\"bit_28_29={bit_28_29} \/ Preavis Pointes Mobiles={pr\u00e9avis_p_mobiles}\", log=\"linky_log\")\n        self.log(f\"bit_30_31={bit_30_31} \/ Pointe Mobile={pointe_mobile}\", log=\"linky_log\")        \n        self.log(f\"Statuts Linky:{statuts}\", log=\"linky_log\")\n        self.log(f\"Statuts Binaire: {statuts_binaire}\", log=\"linky_log\")\n        self.log(f\"Sens Energie Active: {sens_energie_act}\", log=\"linky_log\")\n    \n#        self.call_service('notify\/telegram', message=\"Statuts Linky:\" + format(statuts))\n#        self.call_service('notify\/telegram', message=\"Sens Energie Active: \" + format(sens_energie_act))\n#        self.call_service('notify\/telegram', message=\"Tarif Fourniture: \" +format(tarif_fourniture))<\/code><\/pre>\n\n\n\n<p>Dans la rubrique \u00ab\u00a0Mise \u00e0 jour des entit\u00e9s HA\u00a0\u00bb du code ci-dessus, vous personnalisez les entit\u00e9s que vous souhaitez exploiter. Elles sont cr\u00e9es et mise \u00e0 jour dans HA. J&rsquo;en ai quatre dans mon cas.<\/p>\n\n\n\n<p>Les intitul\u00e9s parlent d&rsquo;eux-m\u00eame. Si vous souhaitez en ajouter d&rsquo;autre, il suffit de les ajouter dans le fichier ci-dessus.<\/p>\n\n\n\n<p>Vous pouvez visualiser vos entit\u00e9s dans HA:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"162\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image.png\" alt=\"\" class=\"wp-image-1747\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image.png 420w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-300x116.png 300w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><\/figure>\n\n\n\n<p>Dans un premier temps, utilisez le mode test et amusez vous, puis basculer sur la lecture du statuts et exploitez les infos via des automatismes ou autres.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Affichage local<\/h2>\n\n\n\n<p>J&rsquo;affiche quelques valeurs en local sur un <a rel=\"noreferrer noopener\" href=\"https:\/\/www.amazon.fr\/gp\/product\/B08LYL7QFQ\/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;psc=1\" data-type=\"URL\" data-id=\"https:\/\/www.amazon.fr\/gp\/product\/B08LYL7QFQ\/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;psc=1\" target=\"_blank\">oled SSD1306 128&#215;64<\/a>, pratique pour une visu rapide \u00e0 la puissance et l&rsquo;intensit\u00e9 instantan\u00e9e, du ratio P\/ Pref ,  la conso du jour.<\/p>\n\n\n\n<p>Je joue \u00e9galement avec la Led WS2812 RGB connect\u00e9e sur le GPIO18. En fonction de la puissance la led change de couleur:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verte de  0 \u00e0 1000 VA<\/li>\n\n\n\n<li>Bleu entre  1000 et 3000 VA<\/li>\n\n\n\n<li>Rouge si sup\u00e9rieure \u00e0 3000 VA<\/li>\n\n\n\n<li>Les combinaisons sont infinies et facilement programmables.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Codes du fichier linky.yaml Version HC\/HP<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-1024x1024.jpg\" alt=\"\" class=\"wp-image-1439\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-1024x1024.jpg 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-300x300.jpg 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-150x150.jpg 150w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-768x768.jpg 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-1536x1536.jpg 1536w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/IMG_20220114_094944-scaled-1-1-2048x2048.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>On y retrouve:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> les \u00ab\u00a0utility meter\u00a0\u00bb qui comptabilisent les energies consomm\u00e9es HC\/HP par jour, semaine, mois, ann\u00e9e<\/li>\n\n\n\n<li>Un \u00ab\u00a0input_boolean com_linky\u00a0\u00bb indiquant l&rsquo;\u00e9tat de la communication avec le Linky = 1 si com ok<\/li>\n\n\n\n<li>deux \u00ab\u00a0input_number\u00a0\u00bb cout d&rsquo;un kWh aux HC et HP<\/li>\n\n\n\n<li>un &lsquo;binary_sensor\u00a0\u00bb HC utilis\u00e9 dans l&rsquo;affichage des graphiques de puissance permettant de mat\u00e9rialiser la zone HC<\/li>\n\n\n\n<li>les \u00ab\u00a0templates\u00a0\u00bb qui cumulent les HC\/HP des utility meter et calculent en \u20ac les co\u00fbts de consommations<\/li>\n\n\n\n<li>Les entit\u00e9s du registre de statuts<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>####################################################\n#                                                  #\n#                       LINKY                      #\n#                                                  #\n####################################################\n\n\nutility_meter:\n# usage jour  \n  energy_total_usage_daily:\n    source: sensor.linky_hphc_kwh\n    cycle: daily\n    tariffs:\n      - hp\n      - hc\n# usage semaine\n  energy_total_usage_weekly:\n    source: sensor.linky_hphc_kwh\n    cycle: weekly\n    tariffs:\n      - hp\n      - hc\n# usage mois\n  energy_total_usage_monthly:\n    source: sensor.linky_hphc_kwh\n    cycle: monthly\n    tariffs:\n      - hp\n      - hc\n#usage an\n  energy_total_usage_yearly:\n    source: sensor.linky_hphc_kwh\n    cycle: yearly\n    tariffs:\n      - hp\n      - hc\n## \ninput_boolean:\n  com_linky:\n    name: Comm Linky OK=On\n\ninput_number:\n  # Calcul des co\u00fbts journaliers\n  cout_kwh_hp:\n    name: Cout du Kwh HP\n    min: 0\n    max: 10\n    unit_of_measurement: \u20ac\n    icon: mdi:currency-eur\n    step: 0.00001\n    mode: box\n\n  cout_kwh_hc:\n    name: Cout du Kwh HC\n    min: 0\n    max: 10\n    unit_of_measurement: \u20ac\n    icon: mdi:currency-eur\n    step: 0.00001\n    mode: box\n\ninput_text:\n  # Permet de simuler des Statuts pour les tests unitaires\n  linky_test_status:   \n    name: Test statuts Linky\n\ntemplate:\n  - binary_sensor:\n    # Utilis\u00e9 dans l'affichage des graphiques de puissance permettant de mat\u00e9rialiser la zone HC\n    # = true si HC\n    - name: \"display_hp_hc\"\n      unique_id: \"display_hp_hc\"\n      state: &gt;-\n        {{ (states.sensor.linky_n_tarif.state == '1') }}\" # =1 si HC =2 si H\n\n# Consommation journali\u00e8re HP + HC - addition des utility meter\n  - sensor:\n    - name: \"Energie Totale Jour\"\n      unique_id: \"energy_total_daily\"\n      state: &gt;-\n        {% set p = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"\n\n# Consommation semaine HP + HC\n    - name: \"energy_total_weekly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_total_usage_weekly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_total_usage_weekly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n# Consommation mensuelle HP + HC\n    - name: \"energy_total_monthly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_total_usage_monthly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_total_usage_monthly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n# Consommation annuelle HP + HC\n    - name: \"energy_total_yearly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_total_usage_yearly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_total_usage_yearly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n# Cout de l'Energie\n# les couts du kWh HP et HC sont calcul\u00e9s dans excel en fonction des factures recues\n# et saisis manuellement dans HA\n\n    - name: \"Cout Energy Total Jour HPHC\"\n      state: &gt;-\n        {% set hp = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}\n        {% set hc = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}\n        {% set chp = states('input_number.cout_kwh_hp') | float(default=0) | round(5) %}\n        {% set chc = states('input_number.cout_kwh_hc') | float(default=0) | round(5) %}\n        {{((hc*chc) + (hp*chp)) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energy_total_jour_hphc\"\n\n    - name: \"Cout Energy Total Jour HP\"\n      state: &gt;-\n        {% set hp = states('sensor.energy_total_usage_daily_hp') | float(default=0) | round(2) %}\n        {% set chp = states('input_number.cout_kwh_hp') | float(default=0) | round(5) %}\n        {{(hp*chp) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energy_total_jour_hp\"\n      \n    - name: \"Cout Energy Total Jour HC\"\n      state: &gt;-\n        {% set hc = states('sensor.energy_total_usage_daily_hc') | float(default=0) | round(2) %}\n        {% set chc = states('input_number.cout_kwh_hc') | float(default=0) | round(5) %}\n        {{(hc*chc) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energy_total_jour_hc\"\n      <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Codes du fichier linky.yaml Version \u00ab\u00a0Tempo\u00a0\u00bb<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-1024x1024.jpg\" alt=\"\" class=\"wp-image-2838\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-1024x1024.jpg 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-300x300.jpg 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-150x150.jpg 150w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-768x768.jpg 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-1536x1536.jpg 1536w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/11\/IMG_20231124_101608-scaled-2-2048x2048.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>####################################################\n#                                                  #\n#                       LINKY                      #\n#                                                  #\n####################################################\n\n# Sensor \u00e0 conserver l'historique dans le tableau Energy\n# le sensor sensor.linky_hphc_kwh est mis \u00e0 zero dans tic Linky \n# depuis le 3\/12\/2023\n# Date \u00e0 laquelle le comptage des tarifs tempo a \u00e9t\u00e9 mis en place\n#utility_meter:\n# usage jour  \n#  energy_total_usage_daily:\n#    source: sensor.linky_hphc_kwh\n#    cycle: daily\n#    tariffs:\n#      - hp\n#      - hc\n\n## \ninput_boolean:\n  com_linky:\n    name: Comm Linky OK=On\n\n\n\ninput_text:\n  # Permet de simuler des Statuts pour les tests unitaires\n  linky_test_status:   \n    name: Test statuts Linky\n\ntemplate:\n  - binary_sensor:\n    # Utilis\u00e9 dans l'affichage des graphiques de puissance permettant de materialiser la zone HC\n    # = true si HC\n    - name: \"display_hp_hc\"\n      unique_id: \"display_hp_hc\"\n      state: &gt;-\n        {{ states('sensor.linky_ptec')|int(default=0) == \"HC..\" }} # =on si HC =off si HP\n\n  - sensor:\n\n# Template utilis\u00e9s dans le tableau Energy, ils ont pris le relais des Utility Meter supprim\u00e9s le 3\/11\/2023\n# Donc NE PAS SUPPRIMER sinon perte de l'historique des consommations\n\n    - name: \"energy_total_usage_daily_hc\"\n      unique_id: \"energy_total_usage_daily_hc\"\n      state: &gt;-\n        {{ 0 }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total_increasing\"    \n\n    - name: \"energy_total_usage_daily_hp\"\n      unique_id: \"energy_total_usage_daily_hp\"\n      state: &gt;-\n        {{ 0 }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total_increasing\"\n\n# Calcul du Cout Journalier de l'Energie en fonction du tarif en cours\n# Apres passage en Tempo le 3\/11\/2023\n    - name: \"Cout Energie HC Bleu Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hc_bleu_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_bleu_hc') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hc_bleu_jour\"\n\n    - name: \"Cout Energie HP Bleu Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hp_bleu_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_bleu_hp') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hp_bleu_jour\"\n\n    - name: \"Cout Energie HC Blanc Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hc_blanc_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_blanc_hc') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hc_blanc_jour\"\n\n    - name: \"Cout Energie HP Blanc Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hp_blanc_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_blanc_hp') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hp_blanc_jour\"\n\n    - name: \"Cout Energie HC Rouge Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hc_rouge_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_rouge_hc') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hc_rouge_jour\"\n\n    - name: \"Cout Energie HP Rouge Jour\"\n      state: &gt;-\n        {% set en = states('sensor.compteur_energie_hp_rouge_jour') | float(default=0) | round(2) %}\n        {% set ct = states('input_number.tarif_edf_tempo_rouge_hp') | float(default=0) | round(2) %}\n        {{(en*ct) | round(2) }}\n      unit_of_measurement: \"\u20ac\"\n      device_class: \"monetary\"\n      state_class: \"total\"  \n      unique_id: \"cout_energie_hp_rouge_jour\"<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Automatismes<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Commutation de HP vers HC et Inversement<\/h2>\n\n\n\n<p>Il permet de permuter la tarification des utiliy meter en fonction du tarif r\u00e9cup\u00e9r\u00e9 dans le Linky (PTEC) <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code de l&rsquo;automatisme Simplifi\u00e9<\/h3>\n\n\n\n<p>N&rsquo;oubliez pas de supprimer les \u00ab\u00a0utility_meter\u00a0\u00bb qui ne vous concerne pas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: 6_1_0 Energie Changement HP&lt;-&gt;HC\ndescription: ''\ntrigger:\n  - platform: state\n    entity_id: sensor.linky_n_tarif\n    id: tarif_hc\n    from: '2'\n    to: '1'\n  - platform: state\n    entity_id: sensor.linky_n_tarif\n    from: '1'\n    id: tarif_hp\n    to: '2'\ncondition: &#091;]\naction:\n  - choose:\n      - conditions:\n          - condition: trigger\n            id: tarif_hc\n        sequence:\n          - service: select.select_option\n            data:\n              option: hc\n            target:\n              entity_id:\n                - select.energy_total_usage_daily\n                - select.energy_total_usage_weekly\n                - select.energy_total_usage_monthly\n                - select.energy_total_usage_yearly\n                - select.energy_pisc_usage_daily\n                - select.energy_pisc_usage_weekly\n                - select.energy_pisc_usage_monthly\n                - select.energy_pisc_usage_yearly\n                - select.energy_sdb_usage_daily\n                - select.energy_sdb_usage_weekly\n                - select.energy_sdb_usage_monthly\n                - select.energy_sdb_usage_yearly\n                - select.energy_ecs1_usage_daily\n                - select.energy_ecs1_usage_weekly\n                - select.energy_ecs1_usage_monthly\n                - select.energy_ecs1_usage_yearly\n                - select.energy_pac1_usage_daily\n                - select.energy_pac1_usage_weekly\n                - select.energy_pac1_usage_monthly\n                - select.energy_pac1_usage_yearly\n                - select.energy_mal_usage_daily\n                - select.energy_mal_usage_monthly\n                - select.energy_mal_usage_weekly\n                - select.energy_mal_usage_yearly\n                - select.energy_autres_usage_daily\n                - select.energy_autres_usage_monthly\n                - select.energy_autres_usage_weekly\n                - select.energy_autres_usage_yearly\n                - select.energy_vmc_usage_daily\n      - conditions:\n          - condition: trigger\n            id: tarif_hp\n        sequence:\n          - service: select.select_option\n            data:\n              option: hp\n            target:\n              entity_id:\n                - select.energy_total_usage_daily\n                - select.energy_total_usage_weekly\n                - select.energy_total_usage_monthly\n                - select.energy_total_usage_yearly\n                - select.energy_pisc_usage_daily\n                - select.energy_pisc_usage_weekly\n                - select.energy_pisc_usage_monthly\n                - select.energy_pisc_usage_yearly\n                - select.energy_sdb_usage_daily\n                - select.energy_sdb_usage_weekly\n                - select.energy_sdb_usage_monthly\n                - select.energy_sdb_usage_yearly\n                - select.energy_ecs1_usage_daily\n                - select.energy_ecs1_usage_weekly\n                - select.energy_ecs1_usage_monthly\n                - select.energy_ecs1_usage_yearly\n                - select.energy_pac1_usage_daily\n                - select.energy_pac1_usage_weekly\n                - select.energy_pac1_usage_monthly\n                - select.energy_pac1_usage_yearly\n                - select.energy_mal_usage_daily\n                - select.energy_mal_usage_monthly\n                - select.energy_mal_usage_weekly\n                - select.energy_mal_usage_yearly\n                - select.energy_autres_usage_daily\n                - select.energy_autres_usage_monthly\n                - select.energy_autres_usage_weekly\n                - select.energy_autres_usage_yearly\n                - select.energy_vmc_usage_daily\n    default: &#091;]\nmode: single\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Automatisme de contr\u00f4le de la communication du Linky avec \u00ab\u00a0Automation\u00a0\u00bb<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Descriptif fonctionnel<\/h3>\n\n\n\n<p>Le but est de surveiller si la communication entre le Linky et HA est \u00e9tablie.<\/p>\n\n\n\n<p>Je surveille la tension moyenne car elle varie tr\u00e8s souvent contrairement \u00e0 la puissance ou l&rsquo;intensit\u00e9 qui peuvent rest\u00e9s stables plus d&rsquo;une heure la nuit notamment.<\/p>\n\n\n\n<p>Il faut d\u00e9clarer une entit\u00e9 dans \u00ab\u00a0config\/helpers\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"677\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-42.png\" alt=\"\" class=\"wp-image-3283\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-42.png 569w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-42-252x300.png 252w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"784\" height=\"662\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-41.png\" alt=\"\" class=\"wp-image-3281\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-41.png 784w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-41-300x253.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-41-768x648.png 768w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><\/figure>\n\n\n\n<p>L&rsquo;entit\u00e9 est \u00ab\u00a0ON\u00a0\u00bb si la communication est OK. Il faut peut etre ajuster la dur\u00e9e (&lt;1000) en ms en fonction de votre cofiguration.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Blueprint Notification d\u00e9faut communication:<\/h1>\n\n\n\n<p>J&rsquo;exploite le d\u00e9faut avec un blueprint \u00ab\u00a0Nagging Alerting Notification Automation\u00a0\u00bb plus pratique que l\u2019int\u00e9gration \u00ab\u00a0alert\u00a0\u00bb qui n\u00e9cessite un red\u00e9marrage de HA \u00e0 chaque modification.<\/p>\n\n\n\n<p> J\u2019utilise \u00e9galement ce blueprint dans d&rsquo;autres cas de surveillance, portes, temp\u00e9rature, communication, etc..<\/p>\n\n\n\n<p>Les services de notification sont \u00e0 adapter \u00e0 votre configuration (T\u00e9l\u00e9gram dans mon cas).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: BluePrint Notification Def Com Linky\ndescription: Blue Print\nuse_blueprint:\n  path: pavax\/nagging_alert_notification.yaml\n  input:\n    condition_entity_state: \"on\"\n    sensor_entity: binary_sensor.status_communication_linky\n    alert_state: \"off\"\n    alert_action:\n      - data:\n          message: Com Linky off Line{{-\"\\n\"-}}{{states(\"sensor.date_time\") }}\n          title: Etat Reseau !!!\n        action: notify.telegram\n    resolved_action:\n      - data:\n          message: Com Linky On Line{{-\"\\n\"-}} {{states(\"sensor.date_time\") }}\n          title: Etat RESEAU!!!\n        action: notify.telegram\n    notify_device: 367dba31447009458e03b70e3a29b6b2\n    repeat_delay: 300\n    initial_delay: 60\n    max_alerts: 5\n    resolved_message: \" \"\n    notify_message: \" \"\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Lovelace<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Exemple d&rsquo;affichage des donn\u00e9es<\/h2>\n\n\n\n<p>Avec \u00ab\u00a0auto-entities\u00a0\u00bb, vous affichez toutes les entit\u00e9s contenant \u00ab\u00a0linlky\u00a0\u00bb dans son id.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type: custom:auto-entities\ncard:\n  type: entities\n  title: Linky\n  show_header_toggle: false\nfilter:\n  include:\n    - entity_id: \"*linky*\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pour visualiser votre max de puissance sur l&rsquo;ann\u00e9e:<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"426\" height=\"197\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-46.png\" alt=\"\" class=\"wp-image-3287\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-46.png 426w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-46-300x139.png 300w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>square: true\ntype: grid\ncards:\n  - type: statistic\n    entity: sensor.linky_papp\n    period:\n      calendar:\n        period: month\n    stat_type: min\n    name: Min\n  - type: statistic\n    entity: sensor.linky_papp\n    period:\n      calendar:\n        period: month\n    stat_type: mean\n    name: Moyenne\n  - type: statistic\n    entity: sensor.linky_papp\n    period:\n      calendar:\n        period: year\n    stat_type: max\n    name: Max\ntitle: Puissance sur l'Ann\u00e9e\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Un autre exemple d&rsquo;affichage utilisant \u00ab\u00a0custom:mini-graph-card\u00a0\u00bb de HACS<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"452\" height=\"524\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-9-1.png\" alt=\"\" class=\"wp-image-1281\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-9-1.png 452w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-9-1-259x300.png 259w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>type: vertical-stack\ncards:\n  - type: custom:mini-graph-card\n    entities:\n      - entity: sensor.energie_totale_jour\n    name: Conso Linky 7j\n    hours_to_show: 168\n    aggregate_func: max\n    group_by: date\n    show:\n      graph: bar\n    icon: mdi:flash\n  - type: custom:mini-graph-card\n    color_thresholds:\n      - color: '#00FF00'\n        value: 0\n      - color: '#FF9900'\n        value: 4000\n      - color: '#EA9999'\n        value: 6000\n      - color: '#CC0000'\n        value: 10000\n    color_thresholds_transition: hard\n    line_width: 2\n    icon: mdi:flash\n    show:\n      extrema: true\n      fill: true\n      icon: true\n      labels: false\n      name: true\n      state: true\n    hour24: true\n    points_per_hour: 4\n    hours_to_show: 24\n    group: false\n    state_map:\n      - label: hp\n        value: 'off'\n      - label: hc\n        value: 'on'\n    style: |\n      ha-card {\n        border: solid 2px var(--primary-color);\n      }\n    entities:\n      - entity: sensor.linky_papp\n        name: Totale\n      - color: '#CCC0cCC'\n        entity: binary_sensor.display_hp_hc\n        name: HC\n        show_line: false\n        y_axis: secondary\n    name: Puissance Linky 24h<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Un autre exemple d&rsquo;affichage utilisant \u00ab\u00a0custom:apexcharts-card\u00a0\u00bb de HACS<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"408\" height=\"343\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-43.png\" alt=\"\" class=\"wp-image-3284\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-43.png 408w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-43-300x252.png 300w\" sizes=\"auto, (max-width: 408px) 100vw, 408px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>type: custom:apexcharts-card\nchart_type: donut\nheader:\n  show: true\n  title: Conso du Jour\n  show_states: false\n  colorize_states: true\nseries:\n  - entity: sensor.compteur_energie_hc_bleu_jour\n    name: HC Bleu\n    color: \"#2119A8\"\n  - entity: sensor.compteur_energie_hp_bleu_jour\n    name: HP Bleu\n    color: \"#7975CA\"\n  - entity: sensor.compteur_energie_hc_blanc_jour\n    name: HC Blanc\n    color: \"#ffffff\"\n  - entity: sensor.compteur_energie_hp_blanc_jour\n    name: HP Blanc\n    color: \"#9E9E9E\"\n  - entity: sensor.compteur_energie_hc_rouge_jour\n    name: HC Rouge\n    color: \"#F80E1A\"\n  - entity: sensor.compteur_energie_hp_rouge_jour\n    name: HP Rouge\n    color: \"#7C070D\"\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"409\" height=\"369\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-8-1.png\" alt=\"\" class=\"wp-image-1278\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-8-1.png 409w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-8-1-300x271.png 300w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>type: custom:apexcharts-card\nchart_type: donut\nheader:\n  show: true\n  title: Conso du Jour\n  show_states: false\n  colorize_states: true\nseries:\n  - entity: sensor.energy_total_usage_daily_hp\n    name: HP\n    color: green\n  - entity: sensor.energy_total_usage_daily_hc\n    name: HC\n    color: blue\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Affichage du tableau Energie<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"471\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-45-1024x471.png\" alt=\"\" class=\"wp-image-3286\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-45-1024x471.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-45-300x138.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-45-768x353.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/01\/image-45.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Affichage dans Grafana<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-14-1-1024x512.png\" alt=\"\" class=\"wp-image-1829\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-14-1-1024x512.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-14-1-300x150.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-14-1-768x384.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-14-1.png 1334w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-15-1-1024x505.png\" alt=\"\" class=\"wp-image-1831\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-15-1-1024x505.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-15-1-300x148.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-15-1-768x379.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-15-1.png 1328w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"503\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-16-1-1024x503.png\" alt=\"\" class=\"wp-image-1833\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-16-1-1024x503.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-16-1-300x147.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-16-1-768x377.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/03\/image-16-1.png 1333w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Vous trouverez ci-apr\u00e8s le fichier Graphana correspondant.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-4d90ccf4-0b85-49fa-9813-d3d2cc5b4eaf\" href=\"http:\/\/192.168.0.211\/wp-content\/uploads\/2022\/03\/Conso-Generale-1647590921705.json_.zip\">Conso-Generale-1647590921705.json_<\/a><a href=\"http:\/\/192.168.0.211\/wp-content\/uploads\/2022\/03\/Conso-Generale-1647590921705.json_.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-4d90ccf4-0b85-49fa-9813-d3d2cc5b4eaf\">T\u00e9l\u00e9charger<\/a><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>Pas grand chose d&rsquo;autre \u00e0 ajouter, c&rsquo;est simple \u00e0 mettre en oeuvre (si le Linky est accessible), fiable et peu on\u00e9reux, il ne reste plus qu&rsquo;a exploiter les informations.<\/p><\/blockquote><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Publication en lien avec cet article:<\/h1>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-domo-rem-81 wp-block-embed-domo-rem-81\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/domo.rem81.com\/ha-teleinformation-linky-mode-historique\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Intro Dans un article pr\u00e9c\u00e9dent https:\/\/domo.rem81.com\/ha-teleinformation-linky-mode-historique\/ , je d\u00e9crivais la mis en oeuvre d&rsquo;une communication entre un Linky et Home Assistant en mode Historique. Apr\u00e8s avoir fonctionn\u00e9 un temps en &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[15,17,22],"class_list":["post-1133","post","type-post","status-publish","format-standard","hentry","category-homeassistant","tag-esp32","tag-esphome","tag-linky"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/1133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/comments?post=1133"}],"version-history":[{"count":23,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/1133\/revisions"}],"predecessor-version":[{"id":3871,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/1133\/revisions\/3871"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=1133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=1133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=1133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}