{"id":4246,"date":"2026-01-12T18:45:56","date_gmt":"2026-01-12T17:45:56","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=4246"},"modified":"2026-01-15T15:25:47","modified_gmt":"2026-01-15T14:25:47","slug":"ha-monitoring-de-ma-pac-daikin-altherma-avec-esphome-esphome-altherma-alternative-a-espaltherma","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2026\/01\/12\/ha-monitoring-de-ma-pac-daikin-altherma-avec-esphome-esphome-altherma-alternative-a-espaltherma\/","title":{"rendered":"HA \u2013 Monitoring de ma PAC Daikin Altherma avec ESPHome (esphome-altherma) : alternative \u00e0 ESPAltherma"},"content":{"rendered":"\n\n\n\n<h2 class=\"wp-block-heading\">Intro<\/h2>\n\n\n\n<p>Comme pour mon article pr\u00e9c\u00e9dent bas\u00e9 sur <strong>ESPAltherma<\/strong>, mon objectif reste le m\u00eame : <strong>remonter un maximum d\u2019informations de ma PAC Daikin Altherma dans Home Assistant, sans cloud<\/strong>, avec une solution robuste et maintenable. Cette fois, je bascule sur une approche <strong>100% ESPHome<\/strong> gr\u00e2ce au projet <strong>esphome-altherma<\/strong> de <em>jjohnsen<\/em>, qui \u201cporte\u201d la logique d\u2019ESPAltherma dans un <strong>composant externe ESPHome<\/strong>.<\/p>\n\n\n\n<p>En pratique, on obtient :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>des <strong>entit\u00e9s Home Assistant natives via l\u2019API ESPHome<\/strong> (pas besoin de MQTT\/autodiscovery),<\/li>\n\n\n\n<li>une configuration plus \u201cpropre\u201d pour un environnement d\u00e9j\u00e0 tr\u00e8s ESPHome,<\/li>\n\n\n\n<li>une base de code inspir\u00e9e d\u2019ESPAltherma, mais int\u00e9gr\u00e9e \u00e0 l\u2019\u00e9cosyst\u00e8me ESPHome.<\/li>\n<\/ul>\n\n\n\n<p>Pour rappel  mon installation est compos\u00e9e d\u2019une unit\u00e9 ext\u00e9rieure Daikin Altherma (r\u00e9f\u00e9rence : ERLQ011CAV3) et d\u2019une unit\u00e9 hydraulique (r\u00e9f\u00e9rence : EHBX11CB9W). Le syst\u00e8me assure le chauffage par le sol sur un seul niveau, sans ballon d\u2019eau chaude sanitaire.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>R\u00e9f\u00e9rence utile : mon pr\u00e9c\u00e9dent article \u201cESPAltherma\u201d reste valable pour la partie \u201cprincipe\u201d (connexion au port s\u00e9rie X10A\/S21, pr\u00e9cautions, etc.), mais ici je d\u00e9taille la mise en \u0153uvre avec <strong>esphome-altherma<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<p><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/06\/15\/ha-monitoring-et-controle-de-ma-pompe-a-chaleur-daikin-altherma-avec-espaltherma\/\">https:\/\/domo.rem81.com\/index.<\/a><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/06\/15\/ha-monitoring-et-controle-de-ma-pompe-a-chaleur-daikin-altherma-avec-espaltherma\/\" target=\"_blank\" rel=\"noreferrer noopener\">                                                                              <\/a><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/06\/15\/ha-monitoring-et-controle-de-ma-pompe-a-chaleur-daikin-altherma-avec-espaltherma\/\">hp\/2025\/06\/15\/ha-monitoring-et-controle-de-ma-pompe-a-chaleur-daikin-altherma-avec-espaltherma\/ <\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">La solution retenue : esphome-altherma (jjohnsen)<\/h2>\n\n\n\n<p>Le d\u00e9p\u00f4t <strong>jjohnsen\/esphome-altherma<\/strong> <a href=\"https:\/\/github.com\/jjohnsen\/esphome-altherma\">https:\/\/github.com\/jjohnsen\/esphome-altherma<\/a> fournit :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>un composant externe ESPHome <code>altherma_hub<\/code>,<\/li>\n\n\n\n<li>des fichiers \u201cmod\u00e8le\u201d (mapping) par famille de PAC,<\/li>\n\n\n\n<li>et m\u00eame une m\u00e9thode d\u2019installation via navigateur (<strong>ESP Web Tools<\/strong>) pour flasher rapidement un firmware de base.<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f Point important : \u00e0 l\u2019heure actuelle, le projet indique explicitement qu\u2019un <strong>mapping<\/strong> est surtout disponible pour la s\u00e9rie <strong>ERGA-D \/ EHV-EHB-EHVZ DA 04\u201308 kW<\/strong> (et contributions bienvenues pour d\u2019autres mod\u00e8les).<br>Dans mon cas, j&rsquo;utilise un fichier de mapping d\u00e9di\u00e9 : <code>pack_esp126\/lt_da_04_08kw.yaml<\/code> .<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Mat\u00e9riel n\u00e9cessaire<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f4t\u00e9 mat\u00e9riel<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1 \u00d7 <strong>ESP32<\/strong> (dev board classique type <code>esp32dev<\/code>)<\/li>\n\n\n\n<li>1 \u00d7 connecteur <strong>JST EH 2.5 mm 5 broches<\/strong> (ou fils Dupont, mais le JST est plus fiable)<\/li>\n\n\n\n<li>Acc\u00e8s au connecteur s\u00e9rie <strong>X10A<\/strong> (ou \u00e9quivalent selon l\u2019unit\u00e9 \/ c\u00e2blage)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rappel : c\u00e2blage X10A \u2194 ESP32<\/h3>\n\n\n\n<p>Le projet reprend le c\u00e2blage standard popularis\u00e9 par ESPAltherma :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X10A pin 1 (5V)<\/strong> \u2192 <strong>5V\/VIN<\/strong> de l\u2019ESP32 (si l\u2019alimentation 5V est suffisante, sinon alimentation USB externe)<\/li>\n\n\n\n<li><strong>X10A pin 2 (TX PAC)<\/strong> \u2192 <strong>RX ESP32<\/strong><\/li>\n\n\n\n<li><strong>X10A pin 3 (RX PAC)<\/strong> \u2192 <strong>TX ESP32<\/strong><\/li>\n\n\n\n<li><strong>X10A pin 5 (GND)<\/strong> \u2192 <strong>GND ESP32<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Dans ton YAML, tu es sur :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TX = <strong>GPIO17<\/strong><\/li>\n\n\n\n<li>RX = <strong>GPIO16<\/strong><\/li>\n\n\n\n<li>UART 9600 \/ 8 bits \/ <strong>parit\u00e9 EVEN<\/strong> \/ 1 stop bit<\/li>\n<\/ul>\n\n\n\n<p>Ce choix correspond aux recommandations courantes (utiliser RX2\/TX2 sur ESP32, souvent GPIO16\/17).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Mise en \u0153uvre avec ESPHome<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Codes ESPHOME:<\/h2>\n\n\n\n<p>Le code principal fait appel \u00e0 un fichier de configuration.<\/p>\n\n\n\n<p>La version \u00e0 jour du fichier principal est disponible ici: <\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/remycrochon\/home-assistant\/blob\/master\/esphome\/esp126-pac.yaml\">https:\/\/github.com\/remycrochon\/home-assistant\/blob\/master\/esphome\/esp126-pac.yaml<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># https:\/\/github.com\/jjohnsen\/esphome-altherma\nsubstitutions:\n  adress_ip: \"192.168.0.126\"\n  device_name: \"esp126-pac\"\n  friendly_name: \"esp126-pac\"\n  time_timezone: \"Europe\/Paris\"\n\nesp32:\n  board: esp32dev\n  framework:\n    type: esp-idf\n\npackages:\n  #altherma_sensors: !include pac\/erga_eh_da_04_08.yaml\n  altherma_sensors: !include pack_esp126\/lt_da_04_08kw.yaml\n\nesphome:\n  name: ${device_name}\n  friendly_name: ${device_name}\n  # Automatically add the mac address to the name\n  # so you can use a single firmware for all devices\n  # name_add_mac_suffix: true\n  # Uncomment below for using mock uart during development:\n  #platformio_options:\n  #  build_flags:\n  #    - -DUSE_MOCK_UART\n\n\n# Enable logging\nlogger:\n  level: DEBUG\n\n# Enable Home Assistant API\napi:\n\nota:\n  platform: esphome\n\nweb_server:\n  port: 80\n\nwifi:\n  networks:\n    - ssid: !secret wifi_esp\n      password: !secret mdpwifi_esp\n  reboot_timeout: 5min\n  min_auth_mode: WPA2\n\n  manual_ip:\n    static_ip: ${adress_ip}\n    gateway: 192.168.0.254\n    subnet: 255.255.255.0\n    dns1: !secret dns1\n    dns2: !secret dns2    \n    \nexternal_components:\n  - source: github:\/\/jjohnsen\/esphome-altherma@main\n    components: &#091;altherma_hub]\n\n#external_components:\n#  - source:\n#      type: local\n#      path: components\n\nuart:\n  id: uart_bus\n  tx_pin: GPIO17\n  rx_pin: GPIO16\n  baud_rate: 9600\n  data_bits: 8\n  parity: EVEN\n  stop_bits: 1\n\naltherma_hub:\n  id: altherma_hub_1\n  uart_id: uart_bus\n  update_interval: 30s\n\nbinary_sensor:\n#Etat de la connection\n  - platform: status\n    name: \"Status\"\nsensor:\n  - platform: homeassistant\n    id: pu_pac\n    entity_id: sensor.ecocompteur_pac\n    internal: true\n\n  - platform: template\n    id: temp_dep_calculee\n    name: \"temp_dep_calculee\"\n    unit_of_measurement: \"\u00b0C\"\n    device_class: temperature\n    state_class: measurement\n    accuracy_decimals: 2\n    update_interval: 30s\n    lambda: |-\n      \/\/ Param\u00e8tres (identiques \u00e0 votre template HA)\n      const float p102 = 37.0f;\n      const float p103 = 25.0f;\n      const float p100 = -10.0f;\n      const float p101 = 20.0f;\n\n      \/\/ Temp\u00e9rature ext\u00e9rieure\n      float t = id(temp_r1t).state;\n      if (isnan(t)) return NAN;\n\n      \/\/ Coefficients de la droite\n      const float a = (p102 - p103) \/ (p100 - p101);\n      const float b = p103 - a * p101;\n\n      \/\/ Clamp + calcul\n      if (t &lt;= p100) return p100;\n      if (t &gt;= p101) return p101;\n\n      return (a * t) + b;\n\n  - platform: template\n    id: cop\n    name: \"cop\"\n    unit_of_measurement: \"\"\n    state_class: measurement\n    accuracy_decimals: 2\n    update_interval: 30s\n    lambda: |-\n      \/\/ Lecture des entr\u00e9es\n      float debit = id(debit_pac).state;            \/\/ L\/min\n      float rt1   = id(temp_r1t).state;         \/\/ \u00b0C\n      float rt4   = id(temp_rt4).state;         \/\/ \u00b0C\n      float i     = id(int_primaire).state; \/\/ A\n      float pu    = id(pu_pac).state;            \/\/ W\n\n      \/\/ Garde-fous NaN\n      if (isnan(debit) || isnan(rt1) || isnan(rt4) || isnan(i) || isnan(pu)) {\n        return NAN;\n      }\n\n      \/\/ Mode chauffage (text_sensor)\n      if (strcmp(id(mode_fonctionnement).state.c_str(), \"Heating\") != 0) {\n        return 0.0f;\n      }\n\n      \/\/ Courant &gt; 0 obligatoire\n      if (i &lt;= 0.0f || pu &lt;= 0.0f) {\n        return 0.0f;\n      }\n\n      \/\/ Calcul COP\n      \/\/ (debit * 0.06 * 1.16) * (rt1 - rt4) \/ (pu \/ 1000)\n      float cop = (debit * 0.06f * 1.16f) * (rt1 - rt4) \/ (pu \/ 1000.0f);\n\n      \/\/ Filtrage identique \u00e0 HA\n      if (cop &gt;= 0.0f &amp;&amp; cop &lt; 10.0f) {\n        return cop;\n      }\n\n      return 0.0f;\n\n<\/code><\/pre>\n\n\n\n<p>Mon fichier de mapping \u00ab\u00a0lt_da_04_08kw.yaml\u00a0\u00bb:<\/p>\n\n\n\n<p>La version \u00e0 jour du fichier de configuration est disponible ici: <\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/remycrochon\/home-assistant\/blob\/master\/esphome\/pack_esp126\/lt_da_04_08kw.yaml\">https:\/\/github.com\/remycrochon\/home-assistant\/blob\/master\/esphome\/pack_esp126\/lt_da_04_08kw.yaml<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># =========================================================\n# Conversion labeldef.h -&gt; ESPHome (format identique au 1er)\n# Plateforme: altherma_hub\n# =========================================================\n\n# anchors\n.altherma_base: &amp;altherma_base\n  platform: altherma_hub\n  altherma_hub_id: altherma_hub_1\n\n.temp: &amp;temp\n  &lt;&lt;: *altherma_base\n  device_class: temperature\n  unit_of_measurement: \u00b0C\n  state_class: measurement\n  accuracy_decimals: 1\n\n.binary: &amp;binary\n  &lt;&lt;: *altherma_base\n\n.current: &amp;current\n  &lt;&lt;: *altherma_base\n  device_class: current\n  unit_of_measurement: A\n  icon: mdi:current-ac\n  state_class: measurement\n  accuracy_decimals: 1\n\n.voltage: &amp;voltage\n  &lt;&lt;: *altherma_base\n  device_class: voltage\n  unit_of_measurement: V\n  state_class: measurement\n\n.rps: &amp;rps\n  &lt;&lt;: *altherma_base\n  unit_of_measurement: rps\n  state_class: measurement\n\n.rpm: &amp;rpm\n  &lt;&lt;: *altherma_base\n  unit_of_measurement: rpm\n  state_class: measurement\n\n.text: &amp;text\n  &lt;&lt;: *altherma_base\n\n\n# =========================\n# SENSORS (num\u00e9riques)\n# =========================\nsensor:\n  # {0x20,0,105,2,1,\"Temp. d air ext\u00e9rieur(R1T)\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. d air ext\u00e9rieur (R1T)\"\n    register: 0x20\n    offset: 0\n    convid: 105\n    datasize: 2\n    id: temp_r1t\n\n  # {0x20,10,105,2,1,\"Temp. tuyau de liquide (R6T)\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. tuyau de liquide (R6T)\"\n    register: 0x20\n    offset: 10\n    convid: 105\n    datasize: 2\n\n  # {0x20,12,105,2,1,\"Temp. de dissipateur de chaleur\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. de dissipateur de chaleur\"\n    register: 0x20\n    offset: 12\n    convid: 105\n    datasize: 2\n\n  # {0x20,14,105,2,2,\"Capteur de pression\"}\n  - &lt;&lt;: *altherma_base\n    name: \"Capteur de pression\"\n    register: 0x20\n    offset: 14\n    convid: 105\n    datasize: 2\n    device_class: pressure\n    unit_of_measurement: bar\n    state_class: measurement\n    accuracy_decimals: 2\n\n  # {0x21,0,105,2,-1,\"Courant primaire INV (A)\"}\n  - &lt;&lt;: *current\n    name: \"Courant primaire INV (A)\"\n    register: 0x21\n    offset: 0\n    convid: 105\n    datasize: 2\n    id: int_primaire\n\n  # {0x21,2,105,2,-1,\"Courant secondaire INV (A)\"}\n  - &lt;&lt;: *current\n    name: \"Courant secondaire INV (A)\"\n    register: 0x21\n    offset: 2\n    convid: 105\n    datasize: 2\n\n  # {0x30,0,152,1,-1,\"Fr\u00e9quence INV (rps)\"}\n  - &lt;&lt;: *rps\n    name: \"Fr\u00e9quence INV (rps)\"\n    register: 0x30\n    offset: 0\n    convid: 152\n    datasize: 1\n\n  # {0x30,1,152,1,-1,\"Fr\u00e9quence INV 2 (rps)\"}\n  - &lt;&lt;: *rps\n    name: \"Fr\u00e9quence INV 2 (rps)\"\n    register: 0x30\n    offset: 1\n    convid: 152\n    datasize: 1\n\n  # {0x30,0,211,1,-1,\"Ventilateur 1 (10 rpm)\"}\n  - &lt;&lt;: *rpm\n    name: \"Ventilateur 1 (rpm)\"\n    register: 0x30\n    offset: 0\n    convid: 211\n    datasize: 1\n    filters:\n      - multiply: 10\n\n  # {0x30,1,211,1,-1,\"Ventilateur 2 (palier)\"}\n  - &lt;&lt;: *rpm\n    name: \"Ventilateur 2 (palier)\"\n    register: 0x30\n    offset: 1\n    convid: 211\n    datasize: 1\n\n  # {0x60,9,105,2,1,\"Consigne LW (principal)\"}\n  - &lt;&lt;: *temp\n    name: \"Consigne LW (principal)\"\n    register: 0x60\n    offset: 9\n    convid: 105\n    datasize: 2\n\n  # {0x61,2,105,2,1,\"Laisser temp. eau avant BUH (R1T)\"}\n  - &lt;&lt;: *temp\n    name: \"Leaving water temp. avant BUH (R1T)\"\n    register: 0x61\n    offset: 2\n    convid: 105\n    datasize: 2\n\n  # {0x61,4,105,2,1,\"Laisser temp. eau apr\u00e8s BUH (R2T)\"}\n  - &lt;&lt;: *temp\n    name: \"Leaving water temp. apr\u00e8s BUH (R2T)\"\n    register: 0x61\n    offset: 4\n    convid: 105\n    datasize: 2\n    \n  # {0x61,6,105,2,1,\"Temp. r\u00e9frig. c\u00f4t\u00e9 liquide (R3T)\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. r\u00e9frig. c\u00f4t\u00e9 liquide (R3T)\"\n    register: 0x61\n    offset: 6\n    convid: 105\n    datasize: 2\n\n  # {0x61,8,105,2,1,\"Temp. d eau d entr\u00e9e (R4T)\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. d eau d entr\u00e9e (R4T)\"\n    register: 0x61\n    offset: 8\n    convid: 105\n    datasize: 2\n    id: temp_rt4\n    \n  # {0x61,12,105,2,1,\"Temp. ambiante int\u00e9rieure (R1T)\"}\n  - &lt;&lt;: *temp\n    name: \"Temp. ambiante int\u00e9rieure (R1T)\"\n    register: 0x61\n    offset: 12\n    convid: 105\n    datasize: 2\n    \n  # {0x61,14,105,2,1,\"Capteur ext. de temp. ambiante int\u00e9rieure (R6T)\"}\n  - &lt;&lt;: *temp\n    name: \"Capteur ext. temp. ambiante int\u00e9rieure (R6T)\"\n    register: 0x61\n    offset: 14\n    convid: 105\n    datasize: 2\n    \n  # {0x62,5,105,2,1,\"Consigne Thermostat int\"}\n  - &lt;&lt;: *temp\n    name: \"Consigne Thermostat int\"\n    register: 0x62\n    offset: 5\n    convid: 105\n    datasize: 2\n\n  # {0x62,9,105,2,-1,\"Capteur de d\u00e9bit (l\/min)\"}\n  - &lt;&lt;: *altherma_base\n    name: \"Capteur de d\u00e9bit (l\/min)\"\n    register: 0x62\n    offset: 9\n    convid: 105\n    datasize: 2\n    unit_of_measurement: l\/min\n    state_class: measurement\n    accuracy_decimals: 1\n    id: debit\n\n  # {0x62,11,105,1,2,\"Pression d eau\"}\n  - &lt;&lt;: *altherma_base\n    name: \"Pression d eau\"\n    register: 0x62\n    offset: 11\n    convid: 105\n    datasize: 1\n    device_class: pressure\n    unit_of_measurement: bar\n    state_class: measurement\n    accuracy_decimals: 2\n\n  # {0x62,12,152,1,-1,\"Signal de pompe \u00e0 eau (0:max-100:arr\u00eat)\"}\n  - &lt;&lt;: *altherma_base\n    name: \"Signal pompe \u00e0 eau (0-100)\"\n    register: 0x62\n    offset: 12\n    convid: 152\n    datasize: 1\n    state_class: measurement\n    accuracy_decimals: 0\n    filters:\n      - lambda: return x -100;\n\n\n# =========================\n# BINARY SENSORS (ON\/OFF)\n# =========================\nbinary_sensor:\n  # {0x10,1,304,1,-1,\"D\u00e9givrage\"}\n  - &lt;&lt;: *binary\n    name: \"D\u00e9givrage\"\n    register: 0x10\n    offset: 1\n    convid: 304\n    datasize: 1\n    device_class: running\n\n  # {0x10,1,307,1,-1,\"Thermostat ON\/OFF Ext\"}\n  #- &lt;&lt;: *binary\n  #  name: \"Thermostat ON\/OFF Ext\"\n  #  register: 0x10\n  #  offset: 1\n  #  convid: 307\n  #  datasize: 1\n  #  device_class: running\n\n  # {0x60,2,303,1,-1,\"Thermostat ON\/OFF Int\"}\n  - &lt;&lt;: *binary\n    name: \"Thermostat ON\/OFF Int\"\n    register: 0x60\n    offset: 2\n    convid: 303\n    datasize: 1\n    device_class: running\n\n  # {0x60,2,302,1,-1,\"Protection antigel\"}\n  - &lt;&lt;: *binary\n    name: \"Protection antigel\"\n    register: 0x60\n    offset: 2\n    convid: 302\n    datasize: 1\n    device_class: cold\n\n  # {0x60,12,304,1,-1,\"Palier1 BUH\"}\n  - &lt;&lt;: *binary\n    name: \"Palier1 BUH\"\n    register: 0x60\n    offset: 12\n    convid: 304\n    datasize: 1\n\n  # {0x60,12,303,1,-1,\"Palier2 BUH\"}\n  - &lt;&lt;: *binary\n    name: \"Palier2 BUH\"\n    register: 0x60\n    offset: 12\n    convid: 303\n    datasize: 1\n\n  # {0x62,8,302,1,-1,\"Fonctionnement de pompe de circulation\"}\n  - &lt;&lt;: *binary\n    name: \"Pompe de circulation (ON\/OFF)\"\n    register: 0x62\n    offset: 8\n    convid: 302\n    datasize: 1\n    device_class: running\n\n# =========================\n# TEXT SENSORS (\u00e9tats \/ codes)\n# =========================\ntext_sensor:\n  # {0x10,0,217,1,-1,\"Mode de fonctionnement\"}\n  - &lt;&lt;: *text\n    name: \"Mode de fonctionnement\"\n    icon: mdi:state-machine\n    register: 0x10\n    offset: 0\n    convid: 217\n    datasize: 1\n    id: mode_fonctionnement\n\n  # {0x10,4,203,1,-1,\"Type de dysfonctionnement\"}\n  - &lt;&lt;: *text\n    name: \"Type de dysfonctionnement\"\n    register: 0x10\n    offset: 4\n    convid: 203\n    datasize: 1\n    entity_category: diagnostic\n\n  # {0x10,5,204,1,-1,\"Code de dysfonctionnement\"}\n  - &lt;&lt;: *text\n    name: \"Code de dysfonctionnement\"\n    register: 0x10\n    offset: 5\n    convid: 204\n    datasize: 1\n    entity_category: diagnostic\n\n  # {0x60,3,204,1,-1,\"Code de dysfonctionnement\"}\n  - &lt;&lt;: *text\n    name: \"Code de dysfonctionnement (IU)\"\n    register: 0x60\n    offset: 3\n    convid: 204\n    datasize: 1\n    entity_category: diagnostic\n\n  # {0x60,4,152,1,-1,\"Code d erreur d\u00e9taill\u00e9\"}\n  - &lt;&lt;: *text\n    name: \"Code d erreur d\u00e9taill\u00e9\"\n    register: 0x60\n    offset: 4\n    convid: 152\n    datasize: 1\n    entity_category: diagnostic\n\n  # {0x60,5,203,1,-1,\"Type de dysfonctionnement\"}\n  - &lt;&lt;: *text\n    name: \"Type de dysfonctionnement (IU)\"\n    register: 0x60\n    offset: 5\n    convid: 203\n    datasize: 1\n    entity_category: diagnostic\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Avantages de cette approche<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ESP-IDF<\/strong> : tr\u00e8s stable sur ESP32, particuli\u00e8rement quand on a des projets \u201cs\u00e9rie\u201d un peu sensibles.<\/li>\n\n\n\n<li><code>update_interval: 30s<\/code> : bon compromis (et facile \u00e0 ajuster).<\/li>\n\n\n\n<li><code>logger: DEBUG<\/code> : indispensable pour valider la communication UART au d\u00e9but.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Installation : 2 m\u00e9thodes possibles<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option A \u2013 Flash \u201cfacile\u201d via navigateur (ESP Web Tools)<\/h3>\n\n\n\n<p>Le d\u00e9p\u00f4t propose une installation via <strong>ESP Web Tools<\/strong> : on connecte l\u2019ESP32 en USB, on flashe depuis le navigateur, puis on configure le Wi-Fi, et Home Assistant d\u00e9couvre le device.<br>C\u2019est pratique pour valider rapidement un premier flash \u201cfonctionnel\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option B \u2013 M\u00e9thode \u201cpropre\u201d (celle que tu utilises) : ESPHome + external_components<\/h3>\n\n\n\n<p>C\u2019est ce que fait ton YAML : tu d\u00e9clares <code>external_components<\/code> en pointant sur <code>github:\/\/jjohnsen\/esphome-altherma@main<\/code>.<br>Avantage : tu restes dans ton pipeline ESPHome habituel (packages, secrets, IP fixe, etc.).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Zoom sur le calcul du COP<\/h2>\n\n\n\n<p>Le&nbsp;<strong>Coefficient de Performance (COP)<\/strong>&nbsp;est un indicateur cl\u00e9 pour mesurer l\u2019efficacit\u00e9 de ma PAC : il repr\u00e9sente le rapport entre l\u2019\u00e9nergie thermique produite (en kWh) et l\u2019\u00e9nergie \u00e9lectrique consomm\u00e9e (en kWh). Un COP \u00e9lev\u00e9 signifie une PAC performante.<\/p>\n\n\n\n<p>Dans mon fichier&nbsp;<code>pac.yaml<\/code>, j\u2019ai impl\u00e9ment\u00e9 un capteur qui calcule le COP en temps r\u00e9el. Voici comment cela fonctionne :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Donn\u00e9es utilis\u00e9es<\/strong>&nbsp;:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u00e9bit d\u2019eau<\/strong>&nbsp;: mesur\u00e9 par la PAC.<\/li>\n\n\n\n<li><strong>Temp\u00e9rature de l\u2019eau d\u00e9part<\/strong>&nbsp;: temp\u00e9rature de l\u2019eau sortant de l\u2019\u00e9changeur.<\/li>\n\n\n\n<li><strong>Temp\u00e9rature de l\u2019eau retour<\/strong> : temp\u00e9rature de l\u2019eau revenant dans la PAC.<\/li>\n\n\n\n<li><strong>Puissance \u00e9lectrique<\/strong> : mesur\u00e9e via un compteur externe (Linky ou \u00e9quivalent).<\/li>\n\n\n\n<li><strong>Mode de fonctionnement<\/strong> : pour s\u2019assurer que la PAC est en mode chauffage.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Formule<\/strong>&nbsp;:<br>La formule utilis\u00e9e est bas\u00e9e sur la chaleur produite par l\u2019eau chauff\u00e9e :<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"746\" height=\"164\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-27.png\" alt=\"\" class=\"wp-image-3897\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-27.png 746w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-27-300x66.png 300w\" sizes=\"auto, (max-width: 746px) 100vw, 746px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>0.06<\/code>&nbsp;convertit le d\u00e9bit de l\/min en m\u00b3\/h.<\/li>\n\n\n\n<li><code>1.16<\/code>&nbsp;est la chaleur sp\u00e9cifique de l\u2019eau (kWh\/m\u00b3\u00b7\u00b0C).<\/li>\n\n\n\n<li>La puissance consomm\u00e9e est divis\u00e9e par 1000 pour passer de W \u00e0 kWh.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Garde-fous<\/strong>&nbsp;:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le calcul n\u2019est effectu\u00e9 que si la PAC est en mode \u00ab&nbsp;Heating&nbsp;\u00bb et que le courant primaire est sup\u00e9rieur \u00e0 0 (pour \u00e9viter des valeurs aberrantes).<\/li>\n\n\n\n<li>Si le COP calcul\u00e9 est n\u00e9gatif ou sup\u00e9rieur \u00e0 10 (peu r\u00e9aliste), il est ramen\u00e9 \u00e0 0 pour garantir la fiabilit\u00e9 des donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Utilisation<\/strong>&nbsp;:<br>Ce capteur me permet de suivre l\u2019efficacit\u00e9 de ma PAC en temps r\u00e9el. Par exemple, un COP de 4 signifie que pour 1 kWh d\u2019\u00e9lectricit\u00e9 consomm\u00e9e, la PAC produit 4 kWh de chaleur. En analysant ces donn\u00e9es, j\u2019ai pu ajuster les consignes de temp\u00e9rature pour maximiser le COP, surtout par temps doux.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Zoom sur le calcul de la temp\u00e9rature de d\u00e9part:<\/h2>\n\n\n\n<p>Calcul de la temp\u00e9rature de d\u00e9part selon la loi d\u2019eau<\/p>\n\n\n\n<p>Ma PAC Daikin Altherma utilise une <strong>loi d\u2019eau<\/strong> pour r\u00e9guler la temp\u00e9rature de d\u00e9part de l\u2019eau (<code>T\u00b0 Dpt R2T<\/code>) en fonction de la temp\u00e9rature ext\u00e9rieure (<code>T\u00b0 Ext R6T<\/code>). La loi d\u2019eau est une relation lin\u00e9aire qui ajuste la temp\u00e9rature de d\u00e9part pour maintenir un confort int\u00e9rieur tout en optimisant l\u2019efficacit\u00e9 \u00e9nerg\u00e9tique. Pour v\u00e9rifier et comprendre cette temp\u00e9rature de d\u00e9part calcul\u00e9e par la PAC, j\u2019ai impl\u00e9ment\u00e9 un capteur dans Home Assistant : <code>espaltherma_temp_dep_calculee<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principe de la loi d\u2019eau<\/h2>\n\n\n\n<p>La loi d\u2019eau est d\u00e9finie par une relation lin\u00e9aire entre la temp\u00e9rature ext\u00e9rieure ((T_{ext})) et la temp\u00e9rature de d\u00e9part ((T_{dep})) :<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"373\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-28.png\" alt=\"\" class=\"wp-image-3900\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-28.png 744w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-28-300x150.png 300w\" sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"373\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-29.png\" alt=\"\" class=\"wp-image-3901\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-29.png 744w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-29-300x150.png 300w\" sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Calcul de la pente et de l\u2019ordonn\u00e9e<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"649\" height=\"265\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-30.png\" alt=\"\" class=\"wp-image-3903\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-30.png 649w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-30-300x122.png 300w\" sizes=\"auto, (max-width: 649px) 100vw, 649px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Limites et application<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"89\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-31.png\" alt=\"\" class=\"wp-image-3904\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-31.png 483w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-31-300x55.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Int\u00e9gration dans Home Assistant<\/h2>\n\n\n\n<p>Une fois flash\u00e9 et connect\u00e9 au Wi-Fi :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Home Assistant d\u00e9couvre l\u2019ESP via l\u2019int\u00e9gration <strong>ESPHome<\/strong> (API native).<\/li>\n\n\n\n<li>Les entit\u00e9s expos\u00e9es d\u00e9pendent directement de ton fichier <code>lt_da_04_08kw.yaml<\/code> (capteurs, nombres, selects\u2026).<\/li>\n<\/ol>\n\n\n\n<p>En termes d\u2019usage, tu obtiens g\u00e9n\u00e9ralement :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>temp\u00e9ratures (d\u00e9part\/retour, ECS si pr\u00e9sent, ext\u2026),<\/li>\n\n\n\n<li>\u00e9tats \/ modes,<\/li>\n\n\n\n<li>informations de fonctionnement (compresseur, cycles, etc. selon mapping),<\/li>\n\n\n\n<li>potentiellement courants\/tensions\/mesures internes selon ce que le mapping expose.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tableau de Bord:<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"504\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2026\/01\/image-7-1024x504.png\" alt=\"\" class=\"wp-image-4250\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2026\/01\/image-7-1024x504.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2026\/01\/image-7-300x148.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2026\/01\/image-7-768x378.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2026\/01\/image-7.png 1344w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>aspect_ratio: 50%\nelements:\n  - entity: sensor.esp126_pac_mode_de_fonctionnement\n    prefix: \"Fct= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 5%\n      transform: none\n    type: state-label\n  - entity: binary_sensor.esp126_pac_thermostat_on_off_int\n    prefix: \"Th Int= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 10%\n      transform: none\n    type: state-label\n  - entity: sensor.ecocompteur_pac\n    prefix: \"P= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 40%\n      transform: none\n    type: state-label\n  - entity: sensor.compteur_energie_pac_jour_hp_hc\n    prefix: \"EJ= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 60%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_leaving_water_temp_apres_buh_r2t\n    prefix: \"T\u00b0Dpt R2T= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 23%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_temp_dep_calculee\n    prefix: \"T\u00b0Dpt Calcul\u00e9e= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 33%\n      transform: none\n    type: state-label\n  - entity: binary_sensor.esp126_pac_palier1_buh\n    prefix: \"Resist. 1= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 50%\n      top: 10%\n    type: state-label\n  - entity: binary_sensor.esp126_pac_palier2_buh\n    prefix: \"Resist. 2= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 50%\n      top: 15%\n    type: state-label\n  - entity: sensor.esp126_pac_leaving_water_temp_avant_buh_r1t\n    prefix: \"T\u00b0Avant BUH= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 57%\n      top: 30%\n    type: state-label\n  - entity: sensor.esp126_pac_signal_pompe_a_eau_0_100\n    prefix: \"Circ= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 62%\n      top: 85%\n    type: state-label\n  - entity: sensor.esp126_pac_capteur_de_debit_l_min\n    prefix: \"D\u00e9bit= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 68.5%\n      top: 25%\n    type: state-label\n  - entity: sensor.esp126_pac_temp_d_eau_d_entree_r4t\n    prefix: \"T\u00b0 Retour R4T= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 75%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_temp_refrig_cote_liquide_r3t\n    prefix: \"T\u00b0R3T= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 78%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_consigne_thermostat_int\n    prefix: \"T\u00b0Cons= \"\n    style:\n      background: \"#000000\"\n      color: yellow\n      font-size: 110%\n      left: 25%\n      top: 40%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_temp_ambiante_interieure_r1t\n    prefix: \"T\u00b0Int= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 25%\n      top: 45%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_temp_d_air_exterieur_r1t\n    prefix: \"T\u00b0Ext R1T= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 8%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_temp_tuyau_de_liquide_r6t\n    prefix: \"T\u00b0R6T= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 15%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_ventilateur_1_rpm\n    prefix: \"Vent1= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 40%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_ventilateur_2_palier\n    prefix: \"Vent2= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 50%\n      transform: none\n    type: state-label\n  - entity: binary_sensor.esp126_pac_degivrage\n    prefix: \"Degivrage= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 80%\n      top: 60%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_cop\n    prefix: \"COP= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 25%\n      top: 60%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_courant_primaire_inv_a\n    prefix: \"I= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 10%\n      top: 40%\n      transform: none\n    type: state-label\n  - entity: sensor.esp126_pac_pression_d_eau\n    prefix: \"P= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 59%\n      top: 67%\n    type: state-label\n  - entity: binary_sensor.esp126_pac_status\n    prefix: \"Status= \"\n    style:\n      background: \"#000000\"\n      color: white\n      font-size: 110%\n      left: 1%\n      top: 90%\n      transform: none\n    type: state-label\nimage: \/local\/images\/pac5.png\ntype: picture-elements\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9pannage (les 3 points qui font gagner du temps)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Rien ne remonte : v\u00e9rifier le c\u00e2blage et la masse<\/h3>\n\n\n\n<p>Le point critique : <strong>GND commun<\/strong> entre la PAC et l\u2019ESP32. M\u00eame si tu alimentes l\u2019ESP en USB, il faut garder le GND li\u00e9 au GND du X10A.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) UART : bon port \/ bons param\u00e8tres<\/h3>\n\n\n\n<p>Ton UART est coh\u00e9rent avec la doc (9600, 8E1, TX17\/RX16).<br>Si tu vois des trames incoh\u00e9rentes, la parit\u00e9 est un suspect classique : certains retours de communaut\u00e9 mentionnent des variations (8N1\/8O1) selon mod\u00e8les\/impl\u00e9mentations, mais <strong>dans le cadre Altherma\/ESPAltherma on est tr\u00e8s souvent en EVEN<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3) Trop d\u2019entit\u00e9s \/ polling trop fr\u00e9quent<\/h3>\n\n\n\n<p>Si ton mapping expose \u00e9norm\u00e9ment de points, monte l\u2019intervalle (<code>60s<\/code> par exemple) le temps de stabiliser, puis r\u00e9duis ensuite.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Avec <strong>esphome-altherma<\/strong>, tu gardes l\u2019approche \u201cDIY s\u00e9rie sur X10A\u201d, mais tu passes sur une int\u00e9gration <strong>native ESPHome \u2192 Home Assistant<\/strong>, ce qui est particuli\u00e8rement coh\u00e9rent quand ton infra est d\u00e9j\u00e0 centr\u00e9e sur ESPHome (packages, OTA, API, logs, secrets\u2026).<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro Comme pour mon article pr\u00e9c\u00e9dent bas\u00e9 sur ESPAltherma, mon objectif reste le m\u00eame : remonter un maximum d\u2019informations de ma PAC Daikin Altherma dans Home Assistant, sans cloud, avec &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":[74,17],"class_list":["post-4246","post","type-post","status-publish","format-standard","hentry","category-homeassistant","tag-daikin","tag-esphome"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4246","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=4246"}],"version-history":[{"count":16,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4246\/revisions"}],"predecessor-version":[{"id":4282,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/4246\/revisions\/4282"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=4246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=4246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=4246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}